Zookeeper系列(十)Zookeeper开源客户端之ZKClient基本使用
来源:互联网 发布:linux权限设置 编辑:程序博客网 时间:2024/05/23 16:56
ZkClient是由Datameer的工程师开发的开源客户端,对Zookeeper的原生API进行了包装,实现了超时重连、Watcher反复注册等功能。
ZKClient版本及源码
maven依赖
ZkClient目前有两个不同artifactId的系列。
其中最早的0.1版本maven依赖如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
另外一个系列为的maven依赖为:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
其中第二个系列包含了从0.1~0.10的版本。查看dubbo的源代码,我们可以看到,dubbo采用了第一个系列的0.1版本。
源代码
github源代码地址:https://github.com/sgroschupf/zkclient
ZkClient使用
以下我们以第二个系列的0.10版本为例来说明ZKClient的API和使用
创建会话
ZkClient提供了7中创建会话的方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
上面方法的参数如果我们熟悉原生API的话,不难理解其参数,基本上参数名都是自描述的。值得留意的是ZkClient将ZK原生API中的异步处理进行了同步化。
其中一个参数IZkConnection是一个接口的定义。查看接口的方法不难发现它是对ZK原生接口最直接的包装。在此接口下面有两个实现方法ZkConnection和InMemoryConnection。在日常中直接使用ZkConnection方法就可以解决大部分的常见业务需求。
参数ZkSerializer同样是一个接口,定义了byte数组序列化和反序列化的两个方法。如果不传递此参数,则默认使用org.I0Itec.zkclient.serialize.SerializableSerializer实现类进行序列化。某些情况下此序列化接口会出现问题,比如乱码。此时,开发者可以直接实现ZkSerializer接口,重写自己的序列化方法。比如使用Hessian或Kryo等。
通观上面9个创建会话的构造方法,我们发现已经没有Watcher的存在了。同时,ZkClient通过Listener来实现Wather注册,从API级别来支持Watcher监听的注册。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
创建节点
ZkClient提供了15个创建节点的方法:
- 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
- 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
查看源代码可知,其实这些创建节点的方法都是对原生API的一层封装而已,底层实现基本相同。值得留意的一点是,原生API的参数通过byte[]来传递节点内容,而ZkClient支持自定义序列化,因此可以传输Object对象。
createParents参数决定了是否递归创建父节点。true表示递归创建,false表示不使用递归创建。这也正是ZkClient帮开发人员省去了不少繁琐的检查和创建父节点的过程。
删除节点
删除节点提供了以下方法:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
删除API其实很简单,重点说一下deleteRecursive接口,这个接口提供了递归删除的功能。在原生API中,如果一个节点存在子节点,那么它将无法直接删除,必须一层层遍历先删除全部子节点,然后才能将目标节点删除。
读取节点
获取节点列表
- 1
- 1
此接口返回子节点的相对路径列表。比如节点路径为/test/a1和/test/a2,那么当path为/test时,返回的结果为[a1,a2]。
其中在原始API中,对节点注册Watcher,当节点被删除或其下面的子节点新增或删除时,会通知客户端。在ZkClient中,通过Listener监听来实现,后续会将到具体的使用方法。
可以注册的Listener为,接口IZkChildListener下面的方法来实现:
- 1
- 1
获取节点内容
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
通过方法返回参数的定义,就可以得知,返回的结果(节点的内容)已经被反序列化成对象了。
对本接口实现监听的接口为IZkDataListener,分别提供了处理数据变化和删除操作的监听:
- 1
- 2
- 3
- 1
- 2
- 3
更新数据
更新操作可以通过以下接口来实现:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
监测节点是否存在
此API比较简单,调用以下方法即可:
- 1
- 1
注册监听
在ZkClient中客户端可以通过注册相关的事件监听来实现对Zookeeper服务端时间的订阅。其中ZkClient提供的监听事件接口有以下几种:
其中ZkClient还提供了一个unsubscribeAll方法,来解除所有监听。
下面以IZkChildListener为例来举例说明使用方法:
- 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
- 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
执行结果为:
- 1
- 2
- 3
- 1
- 2
- 3
上面展示了Listener的基本使用方法,其他方法的使用读者可以自行尝试。
- Zookeeper系列(十)Zookeeper开源客户端之ZKClient基本使用
- Zookeeper系列(九)Zookeeper开源客户端之ZKClient和Curator简介
- Zookeeper之开源客户端ZkClient
- 04.ZooKeeper读书笔记之开源客户端(ZkClient)
- zookeeper集群之开源客户端ZkClient的使用(四)
- Zookeeper系列(十一)Zookeeper开源客户端之Curator基本使用
- ZooKeeper之zkClient使用
- Zookeeper客户端库ZkClient
- Zookeeper客户端ZkClient
- Zookeeper开源客户端ZKClient和Curator简介
- zookeeper zkClient使用
- ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用
- zookeeper(2) zookeeper客户端ZkClient入门
- Zookeeper系列(十二)Zookeeper开源客户端之Curator的事件监听
- Zookeeper系列(十三)Zookeeper开源客户端之Curator的事件监听丢失分析
- Zookeeper系列(十四)Zookeeper开源客户端之Curator的Master/Leader选举
- zookeeper实战与源码分析----第三方客户端ZkClient使用之监听器
- I0Itec-zkClient --- Kafka中使用的Zookeeper客户端
- 新一代智能云网盘-百宝云企业版
- docker 原理之runc
- AWS CLI 的安装和使用
- stm32 中DMA的stream和channel关系
- Dynamic CRM 之联合查询实体间的数据
- Zookeeper系列(十)Zookeeper开源客户端之ZKClient基本使用
- href="<%=basePath%>报错
- 如何用U盘安装 linux&Win7 双系统?
- Android中的dpi,dip,dp,sp,pt
- 欢迎使用CSDN-markdown编辑器
- 程序猿
- Android退出整个应用的方法
- hadoop2.7.2学习笔记05-hadoop文件系统API定义-hadoop数据输入流类FSDataInputStream
- UVALive