Zookeeper ZkClient使用介绍
作者:悠然予夏
ZkClient是Github上⼀个开源的zookeeper客户端,在Zookeeper原生API接口之上进行了包装,是⼀个更易用的Zookeeper客户端,同时,zkClient在内部还实现了诸如Session超时重连、Watcher反复注册等功能
前言
接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等方面来介绍如何使用zkClient 这个zookeeper客户端
添加依赖:
在pom.xml⽂件中添加如下内容
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.2</version> </dependency>
1、创建会话
使⽤ZkClient可以轻松的创建会话,连接到服务端
package com.lagou.zkClient; import org.I0Itec.zkclient.ZkClient; public class CreateSession { /* 借助zkClient完成会话创建 */ public static void main(String[] args) { /** * 创建一个zkClient实例就可以完成连接,完成会话的创建 * serverString : 服务器连接地址 * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("会话被创建了..."); } }
2、创建节点
ZkClient提供了递归创建节点的接口,即其帮助开发者先完成父节点的创建,再创建子节点
package com.lagou.zkClient; import org.I0Itec.zkclient.ZkClient; public class CreateNote { /* 借助zkClient完成会话创建 */ public static void main(String[] args) { /** * 创建一个zkClient实例就可以完成连接,完成会话的创建 * serverString : 服务器连接地址 * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("会话被创建了..."); // 创建节点 /** * createParents:是否要创建父节点,如果值为true,则就会递归创建节点 */ zkClient.createPersistent("/lg-zkClient/lg-c1", true); System.out.println("节点递归创建完成"); } }
值得注意的是,在原生态接口中是无法创建成功的(⽗节点不存在),但是通过ZkClient通过设置createParents参数为true可以递归的先创建父节点,再创建子节点
3、删除节点
ZkClient提供了递归删除节点的接口,即其帮助开发者先删除所有子节点(存在),再删除父节点
package com.lagou.zkClient; import org.I0Itec.zkclient.ZkClient; public class DeleteNote { /* 借助zkClient完成会话创建 */ public static void main(String[] args) { /** * 创建一个zkClient实例就可以完成连接,完成会话的创建 * serverString : 服务器连接地址 * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("会话被创建了..."); // 递归删除子节点 String path = "/lg-zkClient/lg-c1"; zkClient.createPersistent(path+"/c11"); zkClient.deleteRecursive(path); System.out.println("递归删除成功"); } }
结果表明ZkClient可直接删除带子节点的⽗节点,因为其底层先删除其所有子节点,然后再删除父节点
4、获取子节点
package com.lagou.zkClient; import org.I0Itec.zkclient.IZkChildListener; import org.I0Itec.zkclient.ZkClient; import java.util.List; public class Get_NoteChildren { /* 借助zkClient完成会话创建 */ public static void main(String[] args) throws InterruptedException { /** * 创建一个zkClient实例就可以完成连接,完成会话的创建 * serverString : 服务器连接地址 * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("会话被创建了..."); // 获取子节点列表 List<String> children = zkClient.getChildren("/lg-zkClient"); System.out.println(children); // 注册监听对象 /* 客户端可以对一个不存在的节点进行子节点变更的监听 只要该节点的子节点的列表发生变化,或者该节点本身被创建或则删除,都会触发监听 */ zkClient.subscribeChildChanges("/lg-zkClient-get", new IZkChildListener() { /** * @param list : 变化后的子节点列表 */ @Override public void handleChildChange(String parentPath, List<String> list) throws Exception { System.out.println(parentPath + "的子节点列表发生了变化,变化后的子节点列表为" + list); } }); // 测试 zkClient.createPersistent("/lg-zkClient-get"); Thread.sleep(1000); zkClient.createPersistent("/lg-zkClient-get/c1"); Thread.sleep(1000); } }
结果表明:客户端可以对⼀个不存在的节点进行子节点变更的监听。⼀旦客户端对⼀个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更时,服务端都会通知客户端,并将最新的子节点列表发送给客户端,该节点本身的创建或删除也会通知到客户端。
5、获取数据(节点是否存在、更新、删除)
package com.lagou.zkClient; import org.I0Itec.zkclient.IZkDataListener; import org.I0Itec.zkclient.ZkClient; public class Note_API { /* 借助zkClient完成会话创建 */ public static void main(String[] args) throws InterruptedException { /** * 创建一个zkClient实例就可以完成连接,完成会话的创建 * serverString : 服务器连接地址 * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("会话被创建了..."); // 创建节点 /** * createParents:是否要创建父节点,如果值为true,则就会递归创建节点 */ zkClient.createPersistent("/lg-zkClient/lg-c1", true); System.out.println("节点递归创建完成"); // 判断节点是否存在 String path = "/lg-zkClient-Ep"; boolean exists = zkClient.exists(path); if (!exists) { // 创建临时节点 zkClient.createEphemeral(path, "123"); } // 读取节点内容 Object o = zkClient.readData(path); System.out.println(o); // 注册监听 zkClient.subscribeDataChanges(path, new IZkDataListener() { /* 当节点数据内容发生变化时,执行的回调方法 s : path o : 变化后的节点内容 */ @Override public void handleDataChange(String s, Object o) throws Exception { System.out.println(s + ":该节点内容被更新,更新后的内容:" + o); } /* 当节点被删除时,会执行的回调方法 s : path */ @Override public void handleDataDeleted(String s) throws Exception { System.out.println(s + ":该节点被删除"); } }); // 更新节点内容 zkClient.writeData(path, "456"); Thread.sleep(2000); // 删除节点 zkClient.delete(path); Thread.sleep(2000); } }
到此这篇关于Zookeeper ZkClient使用介绍的文章就介绍到这了,更多相关Zookeeper ZkClient内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!