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

