一、zkclient 简介
zkclient 是一个优秀的 zookeeper 客户端库,其 API 接口调用简洁,易于使用,且支持 Java 语言。zkclient 相比较原生的 zookeeper 客户端,具有更高层次的封装,对于多个场景下的开发,都提供了便利。
使用 zkclient 可以方便地实现分布式锁、分布式队列、任务调度、配置管理等场景,zkclient 提供了丰富的 API,对于开发人员来说,zkclient 不需要了解 zookeeper 详细背后的原理,可以快速上手实现需要的功能。
二、zkclient 的基本用法
zkclient 的使用需要先引入依赖,maven 具体配置如下:
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
三、zkclient 创建几点
zkclient 作为 zookeeper 客户端库,在使用时需要先创建 zkclient 实例。需要创建客户端实例时,可以参照以下代码进行编写:
String zkServers = "zookeeper1:2181,zookeeper2:2181,zookeeper3:2181"; int connectionTimeout = 3000; ZkClient zkClient = new ZkClient(zkServers, connectionTimeout);
创建完实例之后,可以通过 API 对节点进行增删改查操作。其中,zkClient 可以管理多个 zookeeper 集群,可以在创建 zkClient 实例时,指定集群的名称。通过给集群命名,方便管理多个集群的实例,可以通过下面的代码实现创建:
String zkServers = "zookeeper1:2181,zookeeper2:2181,zookeeper3:2181"; int connectionTimeout = 3000; ZkClient zkClient = new ZkClient(zkServers, connectionTimeout,"MyZkClusterName");
四、zkclient 节点操作
zkclient 提供了节点的增删改查操作,下面分别讲解。
1. 创建节点
创建节点时,需要指定节点路径,节点数据和节点类型。具体代码如下:
String path = "/zkClientCreateNode"; String data = "zkClientCreateNode test"; CreateMode createMode = CreateMode.PERSISTENT; String createResult = zkClient.create(path, data.getBytes(), createMode); System.out.println("createResult: " + createResult);
其中,CreateMode 表示节点类型,这里的节点类型必须是 CreateMode 枚举类型中的值。createResult 表示节点在 zookeeper 中的真实路径。
2. 删除节点
删除节点时,需要指定节点路径。具体代码如下:
String path="/zkClientCreateNode"; boolean deleteResult = zkClient.delete(path); System.out.println("deleteResult: " + deleteResult);
其中,deleteResult 表示删除结点是否成功。
3. 修改节点
修改节点数据时,需要指定节点路径和修改后的节点数据。具体代码如下:
String path="/zkClientCreateNode"; String data="zkClientUpdateNode test"; Stat stat = zkClient.writeData(path, data.getBytes()); System.out.println("stat.getMzxid()=" + stat.getMzxid());
其中,writeData 方法返回 Stat 类型的对象,Stat 提供了节点的诸多属性信息。
4. 查询节点
查询节点时,需要指定节点路径,所得到的数据类型是 byte 数组类型。具体代码如下:
String path="/zkClientCreateNode"; byte[] data = zkClient.readData(path); System.out.println(new String(data));
五、zkclient 锁的使用
zkclient 提供了分布式锁的功能,可以通过 zkclient 实现分布式锁。下面菜单演示 zkclient 的锁功能。
1. 创建锁
创建锁时,需要指定锁的路径。具体代码如下:
String lockPath = "/zkClientLockPath"; InterProcessMutex lock = new InterProcessMutex(zkClient, lockPath);
其中,lockPath 指定的是锁的路径,InterProcessMutex 是 zkclient 提供的分布式锁实现类。
2. 加锁
加锁时,需要指定锁的超时时间,具体代码如下:
int timeOut=10; lock.acquire(timeOut, TimeUnit.SECONDS);
其中,timeOut 指定的是加锁超时的时间,这里是秒为单位。
3. 解锁
解锁时,只需要调用 InterProcessMutex 的 release() 方法即可,代码如下:
lock.release();
六、zkclient 事件监听
zkclient 提供了事件监听接口,可以监听节点的状态变化、子节点变化等多个种类的事件。当事件触发时,触发对应的监听器的方法回调。下面菜单演示 zkclient 事件的监听。
1. 节点数据更改监听
代码实现如下:
String path = "/zkClientListenerNode"; String data = "zkClientListenerNode"; String data2 = "zkClientListenerNodeUpdate"; zkClient.create(path, data.getBytes(), CreateMode.PERSISTENT); zkClient.writeData(path, data2.getBytes()); zkClient.subscribeDataChanges(path, new IZkDataListener() { @Override public void handleDataDeleted(String dataPath) throws Exception { System.out.println("handleDataDeleted"); } @Override public void handleDataChange(String dataPath, byte[] data) throws Exception { System.out.println("handleDataChange, dataPath:" + dataPath + ", data:" + new String(data)); } }); Thread.sleep(1000L);
其中,subscribeDataChanges 注册了数据变化的监听器,这里的 IZkDataListener 是 zkclient 提供的接口,用于监听数据的变化。
2. 子节点变更监听
代码实现如下:
String path = "/zkClientListenerChildChange"; String child = "/zkClientListenerChildChange/childNode"; zkClient.createPersistent(path); zkClient.subscribeChildChanges(path, new IZkChildListener() { @Override public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception { System.out.println("handleChildChange, parentPath:" + parentPath); for (String child : currentChilds) { System.out.println("child:" + child); } } }); zkClient.createEphemeral(child); Thread.sleep(1000L);
其中,subscribeChildChanges 方法中注册的监听器 IZKChildListener,用于监听子节点的变化。
七、结束语
zkclient 作为一个优秀的 zookeeper 客户端库,在使用时需要先了解 zookeeper 的基础概念与使用方法,并对 zkclient 的 API 进行深入的了解。本文针对 zkclient 的节点操作、锁的使用、以及事件监听进行了详细的介绍。对于需要使用 zookeeper 进行分布式应用场景的开发人员,zkclient 是必备的工具。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/249328.html