bboyjing's blog

Zookeeper学习笔记五【开源客户端之ZkClient】

开源客户端是对ZooKeeper原声API的封装,会屏蔽繁琐的细节,使开发人员用起来更方便,这一章我们就看一下ZkClient Api的使用。

准备环境

zookeeper-sample项目中新建名为zkclient的module,zkclent版本如下:

1
2
3
4
5
6
7
8
<dependencies>
<!-- zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
</dependencies>

创建会话

1
2
3
4
5
6
7
8
// 使用ZkClient来创建一个ZooKeeper客户端
public class CreateSessionSample {
public static void main(String[] args) {
//ZkClient通过内部封装,将zookeeper异步的会话过程同步化了
ZkClient zkClient = new ZkClient("localhost:2181", 5000);
System.out.println("ZooKeeper session established.");
}
}

创建节点

1
2
3
4
5
6
7
8
// 使用ZkClient创建节点
public class CreateNodeSample {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("localhost:2181", 5000);
//ZKClient可以递归创建父节点
zkClient.createPersistent("/zk-book/c1", true);
}
}

删除节点

1
2
3
4
5
6
7
8
9
10
11
//ZkClient删除节点数据
public class DelDataSample {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("localhost:2181", 2000);
/**
* 之间已经创建了节点/zk-boot/c1
* 该接口可以递归删除节点
*/
zkClient.deleteRecursive("/zk-book");
}
}

读取子节点信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// ZkClient获取子节点列表。
public class GetChildrenSample {
public static void main(String[] args) throws Exception {
String path = "/zk-book";
ZkClient zkClient = new ZkClient("localhost:2181", 5000);
/**
* 注册回调接口
* Listener不是一次性的,注册一次就会一直生效
*/
zkClient.subscribeChildChanges(path, (parentPath,currentChildren) -> {
System.out.println(parentPath + " 's child changed, currentChildren:" + currentChildren);
});
/**
* 第一次创建当前节点,客户端会收到通知
* /zk-book 's child changed, currentChildren:[]
*/
zkClient.createPersistent(path);
Thread.sleep( 1000 );
/**
* 创建子节点,客户端会收到通知
* /zk-book 's child changed, currentChildren:[c1]
*/
zkClient.createPersistent(path+"/c1");
Thread.sleep( 1000 );
/**
* 删除子节点,客户端会收到通知
* /zk-book 's child changed, currentChildren:[]
*/
zkClient.delete(path+"/c1");
Thread.sleep( 1000 );
/**
* 删除当前节点,客户端会收到通知
* /zk-book 's child changed, currentChildren:null
*/
zkClient.delete(path);
Thread.sleep( Integer.MAX_VALUE );
}
}

从输出结果可以得出一下结论:

  • 客户端可以对一个不存在的节点进行子节点变更的监听
  • 一旦客户端对一个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更的时候,服务都会通知客户端,并且把最新的子节点列表发送给客户端
  • 该节点本身的创建或删除也会通知到客户端

更新节点数据

1
2
3
4
5
6
7
8
9
//ZkClient更新节点数据
public class SetDataSample {
public static void main(String[] args) throws Exception {
String path = "/zk-book";
ZkClient zkClient = new ZkClient("localhost:2181", 2000);
zkClient.createEphemeral(path, new Integer(1));
zkClient.writeData(path, new Integer(1));
}
}

检测检点是否存在

1
2
3
4
5
6
7
8
//ZkClient检测节点是否存在
public class ExistNodeSample {
public static void main(String[] args) throws Exception {
String path = "/zk-book";
ZkClient zkClient = new ZkClient("localhost:2181", 2000);
System.out.println("Node " + path + " exists " + zkClient.exists(path));
}
}

以上只是简单的了解了下ZkClient Api,用起来确实比原声Api方便了许多。