Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。
Zookeeper的节点创建模式:
- PERSISTENT:持久化
- PERSISTENT_SEQUENTIAL:持久化并且带序列号
- EPHEMERAL:临时
- EPHEMERAL_SEQUENTIAL:临时并且带序列号
POM依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.14.3</version>
<scope>compile</scope>
</dependency>
示例代码:
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.testng.annotations.Test;
public class zkNew {
/**
* 创建永久节点
* @throws Exception
*/
@Test
public void createNode() throws Exception {
/**
* 重试参数对象:
* 第一个参数: 重试等待时间
* 第二个参数: 重试的次数
*/
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);//通过工厂类, 获取客户端对象
/**
* 第一个参数: 链接的地址:
* 第二个参数: session
* 第三个参数:链接超时时间
* 第四个参数: 重试参数对象
*/
CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", 3000, 3000, retryPolicy);
//调用start开启客户端操作 !!!
client.start();
//通过create来进行创建节点,并且需要指定节点类型
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello3/world","my hello3/world".getBytes());
client.close();
}
/**
* 节点下面添加数据与修改是类似的,一个节点下面会有一个数据,新的数据会覆盖旧的数据
* @throws Exception
*/
@Test
public void nodeData() throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(2000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", 3000, 3000, retryPolicy);
client.start();
// 使用设置 setData() 设置数据
client.setData().forPath("/hello3", "hello7".getBytes());
client.close();
}
/**
* 数据查询
*/
@Test
public void updateNode() throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(2000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", 3000, 3000, retryPolicy);
client.start();
// 获取数据通过: getData()
byte[] forPath = client.getData().forPath("/hello3");
System.out.println(new String(forPath));
client.close();
}
/**
* zookeeper 的watch机制
* @throws Exception
*/
@Test
public void watchNode() throws Exception {
RetryPolicy policy = new ExponentialBackoffRetry(2000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", policy);
///调用start开启客户端操作
client.start();
// ExecutorService pool = Executors.newCachedThreadPool();
//设置节点的cache
TreeCache treeCache = new TreeCache(client, "/hello3");
//设置监听器和处理过程
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
ChildData data = event.getData();
if(data !=null){
// 通过 switch 进行判断, 并执行相关的对应的事件
switch (event.getType()) {
case NODE_ADDED:
System.out.println("NODE_ADDED : "+ data.getPath() +" 数据:"+ new String(data.getData()));
break;
case NODE_REMOVED:
System.out.println("NODE_REMOVED : "+ data.getPath() +" 数据:"+ new String(data.getData()));
break;
case NODE_UPDATED:
System.out.println("NODE_UPDATED : "+ data.getPath() +" 数据:"+ new String(data.getData()));
break;
default:
break;
}
}else{
System.out.println( "data is null : "+ event.getType());
}
}
});
//开始监听
treeCache.start();
Thread.sleep(50000000);
}
}