Apache Curator简介
Apache Curator是Apache ZooKeeper的Java客户端库。Curator项目的目标是简化ZooKeeper客户端的使用。在ZooKeeper API中,我们都要自己处理ConnectionLossException。另外Curator为常见的分布式协同服务提供了高质量的实现。Apache Curator最初是Netflix研发的,后来捐献了Apache基金会,目前是Apache的顶级项目。
Curator技术栈
- Client: 封装了Zookeeper类,管理和ZooKeeper集群的连接,并提供了重连机制。
- Framework: 为所有的ZooKeeper提供了重试机制,对外提供了一个Fluent风格的API。
- Recipes: 使用framework实现了大量的ZooKeeper协同服务。
- Extensions:扩展模块。
Curator使用
Client初始化
初始化一个client分成两个步骤:
- 创建client
- 启动client 以下是两种创建client的方法:
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
//使用Factory方法
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
//使用Fluent风格
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(connectString)
.retryPolicy(retryPolicy)
.build();
//启动client
client.start();
Fluent风格API
//同步版本
client.create().withMode(CreateMode.PERSISTENT).forPath(path, data);
//异步版本
client.create().withMode(CreateMode.PERSISTENT).inBackground().forPath(path, data);
//使用watch
client.getData().watched().forPath(path);
测试用例示例代码:
public void testWatch() throws Exception {
String path = "/three";
byte[] data = {'3'};
byte[] newData = {'4'};
CountDownLatch latch = new CountDownLatch(1);
// Use listener only for watches
client
.getCuratorListenable()
.addListener(
(CuratorFramework c, CuratorEvent event) -> {
switch (event.getType()) {
case WATCHED:
WatchedEvent we = event.getWatchedEvent();
System.out.println("watched event: " + we);
if (we.getType() == Watcher.Event.EventType.NodeDataChanged
&& we.getPath().equals(path)) {
// 4. watch triggered
System.out.printf("got the event for the triggered watch\n");
byte[] actualData = c.getData().forPath(path);
assertThat(actualData).isEqualTo(newData);
}
latch.countDown();
break;
}
});
// 1. create
client.create().withMode(CreateMode.PERSISTENT).forPath(path, data);
// 2. getData and register a watch
byte[] actualData = client.getData().watched().forPath(path);
assertThat(actualData).isEqualTo(data);
// 3. setData
client.setData().forPath(path, newData);
latch.await();
// 5. delete
client.delete().forPath(path);
}
Curator源码中curator-examples项目下有许多示例的代码,有兴趣的可以看看。
按下面步骤把Curator的源码导入到Idea:
- 从Curator的主页 curator.apache.org/下载最新的版本,目前是5.1.0
- 然后把apache-curator-5.1.0-source-release.zip解压到本地目录
- 然后用Idea的导入maven项目的功能导入这个项目。