一、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/zh-tw/n/249328.html
微信掃一掃
支付寶掃一掃