一、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-hant/n/249328.html