之前一篇文档讲的是直接使用ZK的API做数据节点的操作,但是代码重复度过高,而且代码还特别多,写和维护方面不太友好,所以这里面就有一个封装好了的工具jar包,这里面做个和下面文章中的案例一样的操作,对比一下,这里把集成API的文章再引入一下:
开源介绍
ZkClient是Github上的一个开源的zk客户端,是对远程的zk API进行了进一步的封装,比原生的代码更简单易用,同时还是先了很多Session超时重连、Watcher反复注册等功能,接下来咱们用ZkClient是先一下对Znode的操作
添加pom依赖
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
创建会话
public class CreateSession {
public static void main(String[] args) {
ZkClient zkClient=new ZkClient("127.0.0.1:2181");
System.out.println("zk session created");
}
}
日志打印结果:
创建节点
public class CreateNode {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
//createParents的值设置为true,可以递归创建节点
zkClient.createPersistent("/api-zkClient",true);
System.out.println("znode success create ");
}
}
日志打印结果:
可视化工具展示:
更新节点
可视化工具看一下修改之前的值:
修改代码如下:
public class UpdateNode {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
//createParents的值设置为true,可以递归创建节点
zkClient.writeData("/api-zkClient","I was updated");
System.out.println("znode success update ");
}
}
修改之后的值:
获取节点信息
public class GetNode {
public static void main(String[] args) throws UnsupportedEncodingException {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
//createParents的值设置为true,可以递归创建节点
boolean exists = zkClient.exists("/api-zkClient");
if(exists){
//存在就打印
zkClient.setZkSerializer(new MyZkSerializer());
Object data = zkClient.readData("/api-zkClient");
System.out.println("znode success read :" + data);
}else{
System.out.println("znode fail read");
}
}
}
class MyZkSerializer implements ZkSerializer {
//序列化,数据--》byte[]
public byte[] serialize(Object o) throws ZkMarshallingError {
return String.valueOf(o).getBytes();
}
//反序列化,byte[]--->数据
public Object deserialize(byte[] bytes) throws ZkMarshallingError {
return new String(bytes);
}
}
日志打印结果:
获取子节点
public class GetChildren {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
List<String> children = zkClient.getChildren("/api-zkClient");
System.out.println("znode child success add :"+children.size());
}
}
日志打印结果:
删除节点
删除节点之前,先查看一下Znode Tree:
接下来我们就直接删除api-zkClient节点,附上代码:
public class DeleteNode {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
zkClient.delete("/api-zkClient");
System.out.println("znode success delete ");
}
}
日志打印结果如下:
再看一下可视化工具的Tree:
到这里就证明,刚才的 api-zkClient已被删除
使用客户端工具比我们直接用原生的API接口要省力很多,其实这种封装zk的客户端除了ZkClient,还有其他的客户端,比如:Curator等等,感兴趣的童鞋可以自己百度搜索试一试,大同小异,主要还是对原生API的封装,建议大家还是对原生API先做一次了解,然后再结合来整理开源客户端