Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。
1.引入依赖:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
2。 curator 简单操作实例
public class CuratorDemo {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder() // 获取构造器
.connectString("192.168.254.135:2181," + "192.168.254.136:2181,192.168.254.137:2181") // 集群地址
.sessionTimeoutMs(4000) // session超时事件
.retryPolicy(new ExponentialBackoffRetry(1000, 3)) // 重试机制
.namespace("curator") // 命名构建 根节点
.build(); // 构造
curatorFramework.start();// 启动 连接
// 结果: /curator/mic/node1
// 原生api中,必须是逐层创建,也就是父节点必须存在,子节点才能创建
String path = curatorFramework.create() // 创建节点
.creatingParentsIfNeeded() // 如果需要创建父节点
.withMode(CreateMode.PERSISTENT) // 选择节点类型
.forPath("/wuzz/node1","1".getBytes()); // 路径及值
System.out.println(path);
Stat stat = new Stat();
curatorFramework.getData() // 获取
.storingStatIn(stat).forPath("/wuzz/node1");
System.out.println(stat);
curatorFramework.setData() // 修改
.withVersion(stat.getVersion()).forPath("/wuzz/node1", "xx".getBytes());
curatorFramework.delete()// 删除
.deletingChildrenIfNeeded().forPath("/mic/node1");
curatorFramework.close();// 关闭连接
}
}
监听事件实例:
public class CuratorWatcherDemo {
public static void main(String[] args) throws Exception {
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder() // 获取构造器
.connectString("192.168.254.135:2181," +
"192.168.254.136:2181,192.168.254.137:2181") // 集群地址
.sessionTimeoutMs(4000) // session超时事件
.retryPolicy(new ExponentialBackoffRetry(1000, 3)) // 重试机制
.namespace("curator") // 命名构建 根节点
.build(); // 构造
curatorFramework.start();// 启动 连接
//当前节点的创建和删除事件监听 ---永久的
// addListenerWithNodeCache(curatorFramework,"/wuzz");
//子节点的增加、修改、删除的事件监听
addListenerWithPathChildCache(curatorFramework,"/wuzz");
//综合节点监听事件
// addListenerWithTreeCache(curatorFramework,"/wuzz");
System.in.read();
}
public static void addListenerWithTreeCache(CuratorFramework curatorFramework,String path) throws Exception {
TreeCache treeCache=new TreeCache(curatorFramework,path);
TreeCacheListener treeCacheListener=new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
System.out.println(event.getType()+"->"+event.getData().getPath());
}
};
treeCache.getListenable().addListener(treeCacheListener);
treeCache.start();
}
/**
* PathChildCache 监听一个节点下子节点的创建、删除、更新
* NodeCache 监听一个节点的更新和创建事件
* TreeCache 综合PatchChildCache和NodeCache的特性
*/
public static void addListenerWithPathChildCache(CuratorFramework curatorFramework,String path) throws Exception {
PathChildrenCache pathChildrenCache=new PathChildrenCache(curatorFramework,path,true);
PathChildrenCacheListener pathChildrenCacheListener=new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
System.out.println("Receive Event2:"+event.getType());
}
};
pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);
pathChildrenCache.start(PathChildrenCache.StartMode.NORMAL);
}
// 监听一个节点的更新,创建/wuzz节点事件
public static void addListenerWithNodeCache(CuratorFramework curatorFramework,String path) throws Exception {
final NodeCache nodeCache=new NodeCache(curatorFramework,path,false);
NodeCacheListener nodeCacheListener=new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("Receive Event1:"+nodeCache.getCurrentData().getPath());
}
};
nodeCache.getListenable().addListener(nodeCacheListener);
nodeCache.start();
}
}
简单实用,敲起来就是一把舒服。。。