Curator简介
使用前准备工作
基本API
Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Curator使用链式编程风格,易读性强。
包:
1、curator-framework:对zookeeper的底层api的一些封装
2、curator-client:提供一些客户端的操作,例如重试策略等
3、curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等
参数名 | 说明 |
---|---|
connectString | 服务器列表(host:port)多服务器以“,”分隔 |
sessionTimeoutMs | 会话超时时间,默认60000ms |
connectionTimeoutMs | 连接超时时间,默认15000ms |
retryPolicy | 重试连接策略 |
namespace | 隔离命名空间,非必项 |
重试连接策略 | 说明 |
---|---|
ExponentialBackoffRetry | 重试指定次数,且每次重试之间停顿的时间逐增 |
RetryNtimes | 指定最大重试次数 |
RetryOneTimes | 仅重试一次 |
RetryUntilElapsed | 一直重试到达到规定时间 |
//重试策略,初试时间1秒,重试10次
RetryPolicy policy = new ExponentialBackoffRetry(1000, 10);
//通过工厂创建Curator
CuratorFramework client =
CuratorFrameworkFactory.builder().connectString(CONNECT_ADDR)
.sessionTimeoutMs(SESSION_TIMEOUT).retryPolicy(policy).namespace(NAMESPACE).build();
namespace为每个业务分配一个独立的命名空间,即指定一个根目录,这样zookeeper客户端和服务端就有一棵对应的树,实现不同业务之间的隔离。
client.start();
创建节点的链式项:creatingParentsIfNeeded(创建父节点,
自动递归创建所有所需的父节点)、withMode(创建的节点模式)、forPath(创建的节点路径)、withACL(安全项)
节点模式 | 说明 |
---|---|
PERSISTENT | 持久化 |
PERSISTENT_SEQUENTIAL | 持久化带序列号 |
EPHEMERAL | 临时 |
EPHEMERAL_SEQUENTIAL | 临时带序列号 |
ExecutorService executor = Executors.newCachedThreadPool();
// inBackground绑定异步回调方法。比如在创建节点时绑定一个回调方法,该回调方法可以输出服务器的状态码以及服务器的事件类型等信息,还可以加入一个线程池进行优化操作
curator.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
.inBackground((framework, event) -> { //添加回调
System.out.println("回调" );
}, executor).forPath("/path", "内容".getBytes());
client.checkExists().forPath("/path");
client.getData().forPath("/path");
// 读取节点数据,同时获取该节点的状态信息
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("/path");
Stat stat = client.setData().forPath("path","data".getBytes());
List children = client.getChildren().forPath("/path");
删除节点的链式项:deletingChildrenIfNeeded(删除子节点,
递归删除其所有的子节点)、guaranteed(安全删除,
只要客户端会话有效,那么Curator会在后台持续进行删除操作,直到删除节点成功)、withVersion(版本检查)、forPath(删除的节点路径)
client.delete().guaranteed().deletingChildrenIfNeeded().withVersion(10086).forPath("/path");
// 开启事务
CuratorTransaction transaction = client.inTransaction();
Collection results =
transaction.create().forPath("/a/path", "some data".getBytes())
.and()
.setData().forPath("/another/path", "other data".getBytes())
.and()
.delete().forPath("/yet/another/path")
.and().commit();
for (CuratorTransactionResult result : results) {
System.out.println(result.getForPath() + " - " + result.getType());
}
注意:事务操作的时候不支持自动创建父节点,也就是说你想创建的节点如果是多层的,那么父节点一定要存在才可以。
参考:1、http://www.throwable.club/2018/12/16/zookeeper-curator-usage/#Zookeeper客户端Curator使用详解
2、https://blog.csdn.net/haoyuyang/article/details/53469269
3、https://blog.csdn.net/qq_34021712/article/details/82872530
4、https://blog.csdn.net/zmx729618/article/details/62417330