07_zookeeper的客户端工具curator_基本api

【zk原生api的不足之处】

* 不能自动超时重连,需要手动操作

* watcher事件注册一次后就会失效

* 不支持递归创建节点

【 Apache curator 】

* 解决了watcher的注册一次就失效的问题

* api相对更加简单易用

* 提供更多的解决方案并且实现简单:如分布式锁

* 提供了常用的zk工具类

 

【实例化zk客户端的多种重试机制】

package com.zk.demo;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.*;

/**
 * Created by HigginCui on 2018/9/23.
 */
public class CuratorClient {

    public CuratorFramework client = null;
    public static final String zkServerPath = "127.0.0.1";

    /**
     * 构造方法中实例化zk客户端
     */
    public CuratorClient() {


        /**
         * 同步创建zk示例,原生api是异步的
         * curator连接zk的策略:ExponentialBackoffRetry
         *
         * ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries)
         *  baseSleepTimeMs:初始sleep的时间
         *  maxRetries:最大重试次数
         *  maxSleepMs:最大充实实际那
         */
        RetryPolicy retryPolicy1 = new ExponentialBackoffRetry(1000, 3);

        /**
         * curator连接zk的策略:RetryNTimes
         *
         * RetryNTimes(int n, int sleepMsBetweenRetries)
         *  n:重试的次数
         *  sleepMsBetweenRetries:每次重试的间隔的时间
         */
        RetryPolicy retryPolicy2 = new RetryNTimes(3, 5000);

        /**
         * curator连接zk的策略:RetryOneTime
         *
         * RetryOneTime(int sleepMsBetweenRetry)
         * sleepMsBetweenRetry:每次重试间隔的时间
         */
        RetryPolicy retryPolicy3 = new RetryOneTime(3000);

        /**
         * curator连接zk的策略:RetryForever
         *
         *  RetryForever(int retryIntervalMs)
         *  永远重试,不推荐
         */
        RetryPolicy retryPolicy4 = new RetryForever(5000);

        /**
         * curator连接zk的策略:RetryUntilElapsed
         *
         * RetryUntilElapsed(int maxElapsedTimeMs, int sleepMsBetweenRetries)
         * maxElapsedTimeMs:最大重试时间
         * sleepMsBetweenRetries:每次重试间隔
         * 重试时间超过maxElapsedTimeMs后,就不在重试
         */
        RetryPolicy retryPolicy5 = new RetryUntilElapsed(2000, 3000);

        client = CuratorFrameworkFactory.builder()
                .connectString(zkServerPath)
                .sessionTimeoutMs(10000)
                .retryPolicy(retryPolicy2)
                .namespace("workspace")
                .build();
        client.start();
    }

    public void closeClient() {
        if (null != client) {
            this.client.close();
        }
    }
}

 

【创建节点】

package com.zk.demo;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;

/**
 * Created by HigginCui on 2018/9/23.
 */
public class CuratorClientTest {

    public static void main(String[] args) throws Exception{
        CuratorFramework client = new CuratorClient().client;
        boolean isCuratorStarted = client.isStarted();
        System.out.println("当前客户端是否正常连接:"+isCuratorStarted);

        //创建节点
        String nodePath = "/curator/ccc1";
        byte[] data = "hahaha".getBytes();
        client.create()
                .creatingParentsIfNeeded()
                .withMode(CreateMode.PERSISTENT)
                .withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)
                .forPath(nodePath,data);

    }
}

【运行结果】

 

【更新节点数据】

//更新节点数据
byte[] newData = "xixixi".getBytes();
client.setData()
        .withVersion(0)
        .forPath(nodePath,newData);

【运行结果】

【删除节点】

//删除节点
client.delete()
        .guaranteed()               //如果删除失败,那么在后端还是会继续删除,直到成功
        .deletingChildrenIfNeeded()  //如果有子节点会一并删除
        .withVersion(1)
        .forPath(nodePath);

【运行结果】

 【读取节点的数据】

//读取节点数据
Stat stat = new Stat();
byte[] data = client.getData()
                    .storingStatIn(stat)
                    .forPath(nodePath);
System.err.println("节点 "+nodePath+" 的数据为:"+new String(data)+",version为:"+stat.getVersion());

先在zk上设置好数据

【运行结果】

 

 【查询子节点】

//查询子节点
List<String> childNodes = client.getChildren()
                            .forPath(nodePath);
for (String childNode : childNodes){
    System.out.println("childNode = "+childNode);
}

提前创建好一批子节点

【运行结果】

【判断节点是否存在】

//判断节点是否存在,如果节点不存在则为空
Stat statExist = client.checkExists()
                    .forPath(nodePath);
System.err.println(statExist);
Stat statExist2 = client.checkExists()
        .forPath(nodePath+"/lll");  //这里故意设置一个不存在的节点
System.err.println(statExist2);

【运行结果】

 

posted @ 2018-09-23 10:40  HigginCui  阅读(759)  评论(0编辑  收藏  举报