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);
【运行结果】