Zookeeper服务器有三种Java客户端;
Zookeeper: Zookeeper官方提供的原生java客户端;
Zkclient: 在原生zookeeper基础上进行扩展的开源第三方Java客户端;
Curator:Netflix公司在原生zookeeper基础上开源的Java客户端;
1.Curator编程客户端
API文档: https://zookeeper.apache.org/doc/current/api/index.html
主要API:
create: 创建结点;
delete: 删除结点;
exists: 判断结点是否存在;
get data: 读取结点数据;
set data: 写入结点数据;
get children: 获取结点的子结点;
public class CuratorClient01 {
private static final String ADDRESS = "192.168.6.128:2181";
private static final String ROOT_NODE = "/root/node";
public static void main(String[] args) {
// 设置重试策略,3次每次等待2秒
RetryPolicy retry = new RetryNTimes(3,2000);
CuratorFramework client = CuratorFrameworkFactory.newClient(ADDRESS, retry);
// 启动客户端
client.start();
// 拿到zookeeper状态
CuratorFrameworkState state = client.getState();
System.out.println(state);
}
}
持久化模式创建节点
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
.forPath(ROOT_NODE,"node helle data".getBytes());
修改节点信息
/**
*
* 2.更新节点信息必须指定节点的版本,-1表示任何版本都可以
*
*/
Stat stat = client.setData().withVersion(-1).forPath(ROOT_NODE, "node data change".getBytes());
System.out.println(stat.toString());
读取节点信息
// 读取状态数据
Stat stat = new Stat();
byte[] bytes = client.getData().storingStatIn(stat).forPath(ROOT_NODE);
// 数据
System.out.println(new String(bytes));
// 状态信息
System.out.println(stat.toString());
查询节点信息
List<String> list = client.getChildren().forPath("/root");
for (String s : list) {
System.out.println(s);
}
判断节点是否存在
Stat stat1 = client.checkExists().forPath("/root");
if(stat1 == null ){
System.out.println("节点不存在");
}
else{
System.out.println("节点存在");
}
删除节点
/**
* 子节点一起删除
*/
client.delete().deletingChildrenIfNeeded().forPath("/root");
监听节点
final NodeCache nodeCache = new NodeCache(client,ROOT_NODE);
// 是否拿到节点数据
nodeCache.start(true);
if(nodeCache.getCurrentData() != null){
byte[] data = nodeCache.getCurrentData().getData();
System.out.println(new String(data));
}
else{
System.out.println("没有拿到数据");
}
nodeCache.getListenable().addListener(new NodeCacheListener() {
public void nodeChanged() throws Exception {
System.out.println("监听到事件了:");
byte[] data = nodeCache.getCurrentData().getData();
System.out.println(new String(data));
System.out.println("节点数据:"+nodeCache.getPath());
}
});
监听子节点
PathChildrenCache pathChildrenCache = new PathChildrenCache(client,ROOT_NODE,true);
// 设置启动模式
pathChildrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
byte[] bytes1 = event.getData().getData();
new String(bytes1);
new String(event.getData().getData());
System.out.println("节点数据:["+new String(event.getData().getData())+"]");
PathChildrenCacheEvent.Type eventType = event.getType();
System.out.println("事件类型:["+eventType.name()+"]");
}
});