Zookeeper ZkClient使用介紹
前言
接下來,還是從創(chuàng)建會話、創(chuàng)建節(jié)點、讀取數(shù)據(jù)、更新數(shù)據(jù)、刪除節(jié)點等方面來介紹如何使用zkClient 這個zookeeper客戶端
添加依賴:
在pom.xml?件中添加如下內(nèi)容
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.2</version> </dependency>
1、創(chuàng)建會話
使?ZkClient可以輕松的創(chuàng)建會話,連接到服務(wù)端
package com.lagou.zkClient; import org.I0Itec.zkclient.ZkClient; public class CreateSession { /* 借助zkClient完成會話創(chuàng)建 */ public static void main(String[] args) { /** * 創(chuàng)建一個zkClient實例就可以完成連接,完成會話的創(chuàng)建 * serverString : 服務(wù)器連接地址 * 注意:zkClient通過對zookeeperAPI內(nèi)部封裝,將這個異步創(chuàng)建會話的過程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("會話被創(chuàng)建了..."); } }
2、創(chuàng)建節(jié)點
ZkClient提供了遞歸創(chuàng)建節(jié)點的接口,即其幫助開發(fā)者先完成父節(jié)點的創(chuàng)建,再創(chuàng)建子節(jié)點
package com.lagou.zkClient; import org.I0Itec.zkclient.ZkClient; public class CreateNote { /* 借助zkClient完成會話創(chuàng)建 */ public static void main(String[] args) { /** * 創(chuàng)建一個zkClient實例就可以完成連接,完成會話的創(chuàng)建 * serverString : 服務(wù)器連接地址 * 注意:zkClient通過對zookeeperAPI內(nèi)部封裝,將這個異步創(chuàng)建會話的過程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("會話被創(chuàng)建了..."); // 創(chuàng)建節(jié)點 /** * createParents:是否要創(chuàng)建父節(jié)點,如果值為true,則就會遞歸創(chuàng)建節(jié)點 */ zkClient.createPersistent("/lg-zkClient/lg-c1", true); System.out.println("節(jié)點遞歸創(chuàng)建完成"); } }
值得注意的是,在原生態(tài)接口中是無法創(chuàng)建成功的(?節(jié)點不存在),但是通過ZkClient通過設(shè)置createParents參數(shù)為true可以遞歸的先創(chuàng)建父節(jié)點,再創(chuàng)建子節(jié)點
3、刪除節(jié)點
ZkClient提供了遞歸刪除節(jié)點的接口,即其幫助開發(fā)者先刪除所有子節(jié)點(存在),再刪除父節(jié)點
package com.lagou.zkClient; import org.I0Itec.zkclient.ZkClient; public class DeleteNote { /* 借助zkClient完成會話創(chuàng)建 */ public static void main(String[] args) { /** * 創(chuàng)建一個zkClient實例就可以完成連接,完成會話的創(chuàng)建 * serverString : 服務(wù)器連接地址 * 注意:zkClient通過對zookeeperAPI內(nèi)部封裝,將這個異步創(chuàng)建會話的過程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("會話被創(chuàng)建了..."); // 遞歸刪除子節(jié)點 String path = "/lg-zkClient/lg-c1"; zkClient.createPersistent(path+"/c11"); zkClient.deleteRecursive(path); System.out.println("遞歸刪除成功"); } }
結(jié)果表明ZkClient可直接刪除帶子節(jié)點的?節(jié)點,因為其底層先刪除其所有子節(jié)點,然后再刪除父節(jié)點
4、獲取子節(jié)點
package com.lagou.zkClient; import org.I0Itec.zkclient.IZkChildListener; import org.I0Itec.zkclient.ZkClient; import java.util.List; public class Get_NoteChildren { /* 借助zkClient完成會話創(chuàng)建 */ public static void main(String[] args) throws InterruptedException { /** * 創(chuàng)建一個zkClient實例就可以完成連接,完成會話的創(chuàng)建 * serverString : 服務(wù)器連接地址 * 注意:zkClient通過對zookeeperAPI內(nèi)部封裝,將這個異步創(chuàng)建會話的過程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("會話被創(chuàng)建了..."); // 獲取子節(jié)點列表 List<String> children = zkClient.getChildren("/lg-zkClient"); System.out.println(children); // 注冊監(jiān)聽對象 /* 客戶端可以對一個不存在的節(jié)點進行子節(jié)點變更的監(jiān)聽 只要該節(jié)點的子節(jié)點的列表發(fā)生變化,或者該節(jié)點本身被創(chuàng)建或則刪除,都會觸發(fā)監(jiān)聽 */ zkClient.subscribeChildChanges("/lg-zkClient-get", new IZkChildListener() { /** * @param list : 變化后的子節(jié)點列表 */ @Override public void handleChildChange(String parentPath, List<String> list) throws Exception { System.out.println(parentPath + "的子節(jié)點列表發(fā)生了變化,變化后的子節(jié)點列表為" + list); } }); // 測試 zkClient.createPersistent("/lg-zkClient-get"); Thread.sleep(1000); zkClient.createPersistent("/lg-zkClient-get/c1"); Thread.sleep(1000); } }
結(jié)果表明:客戶端可以對?個不存在的節(jié)點進行子節(jié)點變更的監(jiān)聽。?旦客戶端對?個節(jié)點注冊了子節(jié)點列表變更監(jiān)聽之后,那么當該節(jié)點的子節(jié)點列表發(fā)生變更時,服務(wù)端都會通知客戶端,并將最新的子節(jié)點列表發(fā)送給客戶端,該節(jié)點本身的創(chuàng)建或刪除也會通知到客戶端。
5、獲取數(shù)據(jù)(節(jié)點是否存在、更新、刪除)
package com.lagou.zkClient; import org.I0Itec.zkclient.IZkDataListener; import org.I0Itec.zkclient.ZkClient; public class Note_API { /* 借助zkClient完成會話創(chuàng)建 */ public static void main(String[] args) throws InterruptedException { /** * 創(chuàng)建一個zkClient實例就可以完成連接,完成會話的創(chuàng)建 * serverString : 服務(wù)器連接地址 * 注意:zkClient通過對zookeeperAPI內(nèi)部封裝,將這個異步創(chuàng)建會話的過程同步化了 */ ZkClient zkClient = new ZkClient("127.0.0.1:2181"); System.out.println("會話被創(chuàng)建了..."); // 創(chuàng)建節(jié)點 /** * createParents:是否要創(chuàng)建父節(jié)點,如果值為true,則就會遞歸創(chuàng)建節(jié)點 */ zkClient.createPersistent("/lg-zkClient/lg-c1", true); System.out.println("節(jié)點遞歸創(chuàng)建完成"); // 判斷節(jié)點是否存在 String path = "/lg-zkClient-Ep"; boolean exists = zkClient.exists(path); if (!exists) { // 創(chuàng)建臨時節(jié)點 zkClient.createEphemeral(path, "123"); } // 讀取節(jié)點內(nèi)容 Object o = zkClient.readData(path); System.out.println(o); // 注冊監(jiān)聽 zkClient.subscribeDataChanges(path, new IZkDataListener() { /* 當節(jié)點數(shù)據(jù)內(nèi)容發(fā)生變化時,執(zhí)行的回調(diào)方法 s : path o : 變化后的節(jié)點內(nèi)容 */ @Override public void handleDataChange(String s, Object o) throws Exception { System.out.println(s + ":該節(jié)點內(nèi)容被更新,更新后的內(nèi)容:" + o); } /* 當節(jié)點被刪除時,會執(zhí)行的回調(diào)方法 s : path */ @Override public void handleDataDeleted(String s) throws Exception { System.out.println(s + ":該節(jié)點被刪除"); } }); // 更新節(jié)點內(nèi)容 zkClient.writeData(path, "456"); Thread.sleep(2000); // 刪除節(jié)點 zkClient.delete(path); Thread.sleep(2000); } }
到此這篇關(guān)于Zookeeper ZkClient使用介紹的文章就介紹到這了,更多相關(guān)Zookeeper ZkClient內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC JSON數(shù)據(jù)交互及RESTful支持實現(xiàn)方法
這篇文章主要介紹了SpringMVC JSON數(shù)據(jù)交互及RESTful支持實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2020-06-06一文探索Apache HttpClient如何設(shè)定超時時間
Apache HttpClient是一個流行的Java庫,用于發(fā)送HTTP請求,這篇文章主要為大家介紹了Apache HttpClient如何設(shè)定超時時間,感興趣的小伙伴可以學(xué)習一下2023-10-10Druid連接池未關(guān)閉導(dǎo)致內(nèi)存泄漏問題
這篇文章主要介紹了Druid連接池未關(guān)閉導(dǎo)致內(nèi)存泄漏問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12SpringCloud Zuul在何種情況下使用Hystrix及問題小結(jié)
這篇文章主要介紹了SpringCloud Zuul在何種情況下使用Hystrix 及問題小結(jié),感興趣的朋友跟隨小編一起看看吧2018-11-11Java微服務(wù)Filter過濾器集成Sentinel實現(xiàn)網(wǎng)關(guān)限流過程詳解
這篇文章主要介紹了Java微服務(wù)Filter過濾器集成Sentinel實現(xiàn)網(wǎng)關(guān)限流過程,首先Sentinel規(guī)則的存儲默認是存儲在內(nèi)存的,應(yīng)用重啟之后規(guī)則會丟失。因此我們通過配置中心Nacos保存規(guī)則,然后通過定時拉取Nacos數(shù)據(jù)來獲取規(guī)則配置,可以做到動態(tài)實時的刷新規(guī)則2023-02-02springboot 集成redis哨兵主從的實現(xiàn)
本文主要介紹了springboot 集成redis哨兵主從的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2022-07-07Mybatis 一對多和多對一關(guān)聯(lián)查詢問題
這篇文章主要介紹了Mybatis 一對多和多對一關(guān)聯(lián)查詢問題,需要的朋友可以參考下2017-04-04