Zookeeper之Curator框架简单使用-yellowcong

系统运维 waitig 433℃ 百度已收录 0评论

原生的api,比较的简单,但是对于Watcher的操作比较的复杂,所以我们可以使用Apache的Curator框架,官网地址:http://curator.apache.org/,通过apache的这个curator框架,操作zookeeper比较的简单方便,而且对于watcher的操作更加的简单方便了,支持链式编程。

环境搭建

pom.xml配置文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>yellowcong</groupId>
  <artifactId>day10_13</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>day10_13</name>
  <url>http://maven.apache.org</url>

<!-- 配置国内比较快的 阿里云的Maven仓库 -->
<repositories>
    <repository>
        <id>aliyunmaven</id>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </repository>
</repositories>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <!-- zookeeper开发jar包 -->  
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.10</version>
    </dependency>

    <!-- curator框架 -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>2.4.2</version>
    </dependency>

    <!-- 
    Curator修使用的NodeCache的方式来监听节点的变更操作
    NodeCacheLisener 监听节点新增、修改操作
    PathChildrenCacheListener 监听子节点的新增、修改、删除操作
     -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>2.4.2</version>
    </dependency>


    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

案例

案例中,演示了Zookeeper原生的api的操作,节点的读取,删除、更新、获取子节点、异步删除更新等操作。这个Curator是支持链式编程的,使用起来比较的方便简洁

package com.yellowcong.zookeeper.curator;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;

/**
 * 创建日期:2017年10月14日 <br/>
 * 创建用户:yellowcong <br/>
 * 功能描述:
 */
public class CuratorDemo {

    // private static final String CONNECT_PATH =
    // "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";

    private static final String CONNECT_PATH = "192.168.66.110:2181,192.168.66.110:2182,192.168.66.110:2183";

    // 超时时间
    private static final int SESSION_TIME_OUT = 60000;

    public static void main(String[] args) throws Exception {

        //1、重试策略
        //参数1:设定尝试的时间  ;参数2:和尝试的次数
        RetryPolicy policy = new ExponentialBackoffRetry(5000, 10);

        //重试连接的四中策略
//      ExponentialBackoffRetry  尝试多次,一次多长时间
//      RetryNTimes 尝试多次
//      RetryOneTime 尝试一次
//      RetryUntilElapsed  一直重试直到达到规定的时间


        //2、设置工厂类,创建连接
        CuratorFramework cf = CuratorFrameworkFactory.builder()
                        .connectString(CONNECT_PATH) //连接地址
                        //session超时,默认是6000ms
                        .sessionTimeoutMs(SESSION_TIME_OUT) 
                        //默认超时连接时间为15s
                        .connectionTimeoutMs(15000)
                        .retryPolicy(policy)
                        .build();

        //3、开启连接
        cf.start();

        //4、添加节点
        //链式编程,可以迭代创建
        //cf.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/curator/demo", "curator1".getBytes());

        cf.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/curator/demo2","curator add".getBytes());

        //5、获取节点数据
        byte [] data = cf.getData().forPath("/curator/demo2");
        System.out.println("6、获取节点数据\t"+new String(data));

        //6、修改节点
        Stat stat = cf.checkExists().forPath("/curator/demo2");
        if(stat != null){
            //修改节点
            cf.setData().forPath("/curator/demo2","curator update".getBytes());
        }

        data = cf.getData().forPath("/curator/demo2");
        System.out.println("6、修改后节点数据\t"+new String(data));

        //7、删除节点 , 可以删除父类节点
        cf.delete().deletingChildrenIfNeeded().forPath("/curator/demo2");

        stat = cf.checkExists().forPath("/curator/demo2");
        if(stat == null){
            System.out.println("7、节点删除成功");
        }

        //8、异步的创建节点
        //添加线程池,当异步多次调用的时候,我们可以任务放到线程池里面,不能一个任务就一个线程,这样几下就卡死了
        ExecutorService pool = Executors.newCachedThreadPool();
        cf.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).inBackground(new BackgroundCallback() {

            @SuppressWarnings("incomplete-switch")
            public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {

                switch (event.getType()) {
                case CREATE:
                    System.out.println("节点创建");
                    break;
                }
            }
        },pool).forPath("/curator/backgroud");

        //线程停会,不然,里面 的节点创建 的watch事件没触发
        Thread.sleep(5000);

        //9、获取子类节点
        List<String> childs = cf.getChildren().forPath("/curator");
        for(String child:childs){
            System.out.println("9、子节点\t"+child);
        }
    }
}

本文由【waitig】发表在等英博客
本文固定链接:Zookeeper之Curator框架简单使用-yellowcong
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)