Curator是一套Zookeeper客户端框架,由Netflix公司开源,类似ZkClient,Curator封装了Zookeeper很多底层的工功能,包括连接重试、反复注册和NodeExistsException异常,如此极大的方便了开发人员使用,能更多的聚焦于业务逻辑上,而不是zk如何实现集群的创建、维护上。
使用前首先在项目中引入对应的jar架包,需要注意Curator和Zookeeper版本兼容问题,可以参考这篇博文:https://blog.youkuaiyun.com/weixin_30347009/article/details/97020426,否则在实际运行的时候会报错。
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
现在可以开始使用Curator了,先看看如何使用Curator建立zk连接并实现节点的新增、删除、修改、查询:
- 节点操作
先来看看怎样使用Curator建立一个ZK的会话连接,Curator使用了Fluent风格的API接口来创建会话,创建会话前初始化重试策略,提供的重试实现有ExponentialBackoffRetry、RetryNTimes、RetryOneTimes、RetryUtilElapse,本次使用ExponentialBackoffRetry实现连接重试,ExponentialBackoffRetry(1000, 3)参数1000单位ms,初始sleep时间,3代表最大重试次数。
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
// 创建zk连接
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(connectString)
.connectionTimeoutMs(5000)
.retryPolicy(retryPolicy)
.sessionTimeoutMs(3000)
.build();
client.start();
client初始化后,会话连接其实还没有建立。在调用start()后才开始建立会话连接,接下来便可以开始创建zk节点:
(1)创建一个临时界节点,临时节点在会话断开后会被删除,在不设置节点属性的情况,默认创建的是持久节点(不要忘记点开zk服务)
client.create().withMode(CreateMode.EPHEMERAL).forPath("/path", "1222".getBytes()); // 临时节点
client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/path", "1222".getBytes()); // 临时有序节点
(2)创建持久节点
client.create().withMode(CreateMode.PERSISTENT).forPath("/path", "1222".getBytes()); // 创建持久节点
client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/path", "1222".getBytes()); // 创建持久有序节点
(3)查看创建的节点,获取节点数据
String pointInfo = new String(client.getData().forPath("/path")); // 查看节点内容
(4)修改节点的内容
client.setData().forPath("/path", "克林特.伊斯特伍德".getBytes()); // 修改节点的内容
(5)删除节点
client.delete().forPath("/path"); // 删除节点
以上就是使用Curator实现zk节点的简单操作,以上使用的都是Curator提供的同步接口,Curator还提供了异步接口可供使用:下面进行简单的尝试。
(6)异步创建zk连接,当创建节点后会回调processResult,通过processResult可以将对应的事件的code和类型获取
public static void main(String[] args) throws Exception {
client.start();
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
.inBackground(new BackgroundCallback() {
@Override
public void processResult(CuratorFramework arg0, CuratorEvent event) throws Exception {
System.out.println("Code:" + event.getResultCode() + "Type:" + event.getType());
}
}).forPath("/Zookpeer", "init".getBytes()); // 创建一个持久节点
client.delete().deletingChildrenIfNeeded()
.inBackground(new BackgroundCallback() {
@Override
public void processResult(CuratorFramework arg0, CuratorEvent event) throws Exception {
System.out.println("Code:" + event.getResultCode() + "Type:" + event.getType());
}
}).forPath("/Zookpeer"); // 删除持久节点
Thread.sleep(90);
}