1. 程式人生 > >關於zookeeper第三方客戶端zkclient的使用說明

關於zookeeper第三方客戶端zkclient的使用說明

ZkClient

       在使用ZooKeeper的Java客戶端時,經常需要處理幾個問題:重複註冊watcher、session失效重連、異常處理。

       要解決上述的幾個問題,可以自己解決,也可以採用第三方的java客戶端來完成。這裡就介紹一種常用的客戶端zkclient,目前已經運用到了很多專案中,知名的有Dubbo、Kafka、Helix。

ZKClient的設計

 

ZkClient的元件說明

從上述結構上看,IZKConnection是一個ZkClient與ZooKeeper之間的一個介面卡。在程式碼裡直接使用的是ZKClient,其實質還是委託了zookeeper來處理了。

       前面有一篇文章中,已經說了,使用ZooKeeper客戶端來註冊watcher有幾種方法:1、建立ZooKeeper物件時指定預設的Watcher,2、getData(),3、exists(),4、getchildren。其中getdata,exists註冊的是某個節點的事件處理器(watcher),getchildren註冊的是子節點的事件處理器(watcher)。而在ZKClient中,根據事件型別,分為了節點事件(資料事件)、子節點事件。對應的事件處理器則是IZKDataListener和IZKChildListener。另外加入了Session相關的事件和事件處理器。

       ZkEventThread是專門用來處理事件的執行緒。

重要處理流程說明

啟動ZKClient

在建立ZKClient物件時,就完成了到ZooKeeper伺服器連線的建立。具體過程是這樣的:

      

1、  啟動時,指定好connection string,連線超時時間,序列化工具等。

2、  建立並啟動eventThread,用於接收事件,並排程事件監聽器Listener的執行。

3、  連線到zookeeper伺服器,同時將ZKClient自身作為預設的Watcher。

為節點註冊Watcher

       ZooKeeper的三個方法:getData、getChildren、exists,ZKClient都提供了相應的代理方法。就拿exists來看:

 

可以看到,是否註冊watcher,由hasListeners(path)來決定的。

 

hasListeners就是看有沒有與該資料節點繫結的listener。

所以呢,預設情況下,都會自動的為指定的path註冊watcher,並且是預設的watcher(ZKClient)。怎麼才能讓hasListeners判定值為true呢,也就是怎麼才能為path繫結Listener呢?

ZKClient提供了訂閱功能:

 

一個新建的會話,只需要在取得響應的資料節點後,呼叫subscribteXxx就可以訂閱上相應的事件了。

ZooKeeper的變更操作

Zookeeper中提供的變更操作有:節點的建立、刪除,節點資料的修改。

建立操作,資料節點分為四種,ZKClient分別為他們提供了相應的代理:

刪除節點的操作:

 

修改節點資料的操作:

 

writeDataReturnStat():寫資料並返回資料的狀態。

updateDataSerialized():修改已序列化的資料。執行過程是:先讀取資料,然後使用DataUpdater對資料修改,最後呼叫writeData將修改後的資料傳送給服務端。

客戶端處理變更

       前面已經知道,ZKClient是預設的Watcher,並且在為各個資料節點註冊的Watcher都是這個預設的Watcher。那麼該是如何將各種事件通知給相應的Listener呢?

處理過程大致可以概括為下面的步驟:

1、判斷變更型別:變更型別分為State變更、ChildNode變更(建立子節點、刪除子節點、修改子節點資料)、NodeData變更(建立指定node,刪除節點,節點資料變更)。

2、取出與path關聯的Listeners,併為每一個Listener建立一個ZKEvent,將ZkEvent交給ZkEventThread處理。

3、ZkEventThread執行緒,拿到ZkEvent後,只需要呼叫ZkEvent的run方法進行處理。

從這裡也可以知道,具體的怎麼如何呼叫Listener,還要依賴於ZkEvent的run()實現了。

序列化處理

ZooKeeper中,會涉及到序列化、反序列化的操作有兩種:getData、setData。在ZKClient中,分別用readData、writeData來替代了。

對於readData:先呼叫zookeeper的getData,然後進行使用ZKSerializer進行反序列化工作。

對於writeData:先使用ZKSerializer將物件序列化後,再呼叫zookeeper的setData。

ZkClient如何解決使用ZooKeeper客戶端遇到的問題的呢?

Watcher自動重註冊:這個要是依賴於hasListeners()的判斷,來決定是否再次註冊。如果對此有不清晰的,可以看上面的流程處理的說明

       Session失效重連:如果發現會話過期,就先關閉已有連線,再重新建立連線。

       異常處理:對比ZooKeeper和ZKClient,就可以發現ZooKeeper的所有操作都是拋異常的,而ZKClient的所有操作,都不會拋異常的。在發生異常時,它或做日誌,或返回空,或做相應的Listener呼叫。

相比於ZooKeeper官方客戶端,使用ZKClient時,只需要關注實際的Listener實現即可。所以這個客戶端,還是推薦大家使用的。

另外,是關於zkclient的一些介面,我們可以通過這些介面直接呼叫,使其完成一些相應的任務。

1.建立會話

  1. publicclass createSession {  
  2.     publicstaticvoid main(String[] args) {  
  3.         //zk叢集的地址
  4.         String ZKServers = "192.168.30.164:2181,192.168.30.165:2181,192.168.30.166:2181";  
  5.         /** 
  6.          * 建立會話 
  7.          * new SerializableSerializer() 建立序列化器介面,用來序列化和反序列化 
  8.          */
  9.         ZkClient zkClient = new ZkClient(ZKServers,10000,10000,new SerializableSerializer());  
  10.         System.out.println("conneted ok!");  
  11.     }  
  12. }  

2.建立節點
  1. publicclass createNode {  
  2.     publicstaticvoid main(String[] args) {  
  3.         //zk叢集的地址
  4.         String ZKServers = "192.168.30.164:2181,192.168.30.165:2181,192.168.30.166:2181";  
  5.         ZkClient zkClient = new ZkClient(ZKServers,10000,10000,new SerializableSerializer());  
  6.         System.out.println("conneted ok!");  
  7.         User user = new User();  
  8.         user.setId(1);  
  9.         user.setName("testUser");  
  10.         /** 
  11.          * "/testUserNode" :節點的地址 
  12.          * user:資料的物件 
  13.          * CreateMode.PERSISTENT:建立的節點型別 
  14.          */
  15.         String path = zkClient.create("/testUserNode", user, CreateMode.PERSISTENT);  
  16.         //輸出建立節點的路徑
  17.         System.out.println("created path:"+path);  
  18.     }  
  19. }  
  1. //注意:一定要實現序列化介面  implements Serializable
  2. publicclass User implements Serializable{  
  3.     private Integer id;  
  4.     private String name;  
  5.     public Integer getId() {  
  6.         return id;  
  7.     }  
  8.     publicvoid setId(Integer id) {  
  9.         this.id = id;  
  10.     }  
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.     publicvoid setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17. }  

3.獲取節點中的資料
  1. publicclass getData {  
  2.     publicstaticvoid main(String[] args) {  
  3.                 //zk叢集的地址
  4.                 String ZKServers = "192.168.30.164:2181,192.168.30.165:2181,192.168.30.166:2181";  
  5.                 ZkClient zkClient = new ZkClient(ZKServers,10000,10000,new SerializableSerializer());  
  6.                 System.out.println("conneted ok!");  
  7.                 Stat stat = new Stat();  
  8.                 //獲取 節點中的物件
  9.                 User  user = zkClient.readData("/testUserNode",stat);  
  10.                 System.out.println(user.getName());  
  11.                 System.out.println(stat);  
  12.     }  
  13. }  

4.判斷節點是否存在
  1. publicclass getData {  
  2.     publicstaticvoid main(String[] args) {  
  3.                 //zk叢集的地址
  4.                 String ZKServers = "192.168.30.164:2181,192.168.30.165:2181,192.168.30.166:2181";  
  5.                 ZkClient zkClient = new ZkClient(ZKServers,10000,10000,new SerializableSerializer());  
  6.                 System.out.println("conneted ok!");  
  7.                 boolean e = zkClient.exists("/testUserNode");  
  8.                 //返回 true表示節點存在 ,false表示不存在
  9.                 System.out.println(e);  
  10.     }  
  11. }  

5.刪除節點
  1. publicclass getData {  
  2.     publicstaticvoid

    相關推薦

    關於zookeeper第三方客戶zkclient的使用說明

    ZkClient        在使用ZooKeeper的Java客戶端時,經常需要處理幾個問題:重複註冊watcher、session失效重連、異常處理。        要解決上述的幾個問題,可以自己解決,也可以採用第三方的java客戶端來完成。這裡就介

    ZooKeeper(四)-- 第三方客戶 ZkClient的使用

    實現 kafka int java pid () config obj 9.1 前言   zkClient主要做了兩件事情:     一件是在session loss和session expire時自動創建新的ZooKeeper實例進行重連。     另一件是將一次性wat

    Zookeeper 開源客戶 ZkClient 版本 api介紹和示例

    ZkClient是由Datameer的工程師開發的開源客戶端,對Zookeeper的原生API進行了包裝,實現了超時重連、Watcher反覆註冊等功能。 ZKClient版本及原始碼 maven依賴 ZkClient目前有兩個不同artifactId的系列。  其中最早

    Zookeeper學習六】——開源客戶ZKClient和Curator介紹與應用

    前言 在真正的專案中通常使用的是zkclient和curator,而不是原生的zookeeper客戶端,因為zookeeper原生的客戶端存在一定的侷限性,本篇小編主要講解一下這兩種zookeeper客戶端的使用! 內容 1.1zk原生api不足之

    Zookeeper之開源客戶ZkClient

    ZkClient是由Datameer的工程師開發的開源客戶端,對Zookeeper的原生API進行了包裝,實現了超時重連、Watcher反覆註冊等功能。 ZKClient版本及原始碼 maven依賴 ZkClient目前有兩個不同artifactI

    ZookeeperZookeeper底層客戶架構實現原理(轉載)

    一次 描述 綁定 機制 一個 ini fin 源碼 receive Zookeeper的Client直接與用戶打交道,是我們使用Zookeeper的interface。了解ZK Client的結構和工作原理有利於我們合理的使用ZK,並能在使用中更早的發現問題。本文將在研究源

    存儲過程被程序和第三方客戶執行很慢,而sql server management studio執行速度正常

    一次 com 客戶 正常 gem class .net 顯示 exec 來自:http://blog.csdn.net/pgbiao/article/details/22388945 原因分析:由於存儲過程是預編譯的, 在第一次執行的時候, 會生成執行計劃, 以後執行的

    zookeeper客戶應用

    什麼zookeeper?   ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。 ZooKeeper

    zookeeper原生客戶

    一:zookeeper常用客戶端 zookeeper:官方提供的,原生的api,使用起來比較麻煩,比較底層,不夠直接,不建議使用。 zkclient: 對原生api的封裝,開源專案(https://github.com/adyliu/zkclient),dubbo中使用

    zookeeper客戶和服務的區別

    客戶端是叢集外的訪問,服務端才是叢集上的提供服務的。   使用bin/zkServer.sh start開啟的zookeeper上的一個服務端,而使用bin/zkCli.sh是將客戶端連到服務端上。 客戶端可以通過服務端建立znode,刪除znode,寫znode,讀znod

    zookeeper(三)——客戶指令碼

    zkCli.sh介紹: 進入bin目錄下執行命令: sh zkCli.sh 當看到如下輸出資訊時,表示連線成功上本地的zookeeper伺服器了: WatchedEvent state:SyncConnected type:None path:null [zk:

    linux mysql安裝配置 第三方客戶sqlyog遠端連線

    ubuntu條件下,其他系統的小夥伴可以檢視別的方法 依此執行 sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmysqlclient-d

    zookeeper開源客戶Curator介紹(六)

    上一篇文章介紹了zookeeper原生API的使用,使用過原生API不得不說,有很多的問題,比如:不能遞迴建立和刪除節點、Watcher只能使用一次、還有很多可以解決分散式應用問題的api(比如分散式鎖,leader選舉等),但由於ZooKeeper提供的原始

    zookeeper開源客戶Curator典型應用場景之-服務註冊與發現(十一)

    隨著業務增加,以前簡單的系統已經變得越來越複雜,單純的提升伺服器效能也不是辦法,而且程式碼也是越來越龐大,維護也變得越來越困難,這一切都催生了新的架構設計風格 – 微服務架構的出現。 微服務給我們帶來了很多好處,例如:獨立可擴充套件、易維護。但是隨著應用的分解

    zookeeper開源客戶Curator典型應用場景之-Barrier屏障(十三)

    什麼是Barrier Barrier是這樣的:Barrier是一個同步點,每一個程序到達此點都要等待,直到某一個條件滿足,然後所有的節點繼續進行。 比如:賽跑大家都知道,所有比賽人員都會在起跑線外等待,直到教練員的槍響之後,所有參賽者立刻開始賽跑。 JDK的併

    zookeeper簡單客戶API

    public class ZKclient{ public static void main(String[] args){ private String connectString="ip1:2181,ip2:2181,ip3:2181"; private int sessio

    [微信第三方客戶]wewechat免費版

    wewechat mac版是mac上一款製作精良的微信第三方開源客戶端,wewechat mac版基於 React + Electron + 微信 Web 開發,目前具備的功能已足夠日常使用,包括群聊(新建)、發表情、收紅包、拖拽式發文件、發動圖,甚至是多發訊息功能均已支援。小編現為您帶來wewec

    zookeeper(5)客戶

      zookeeper客戶端主要負責與使用者進行互動,將命令傳送到伺服器,接收伺服器的響應,反饋給使用者。主要分為一下三層: 使用者命令處理層    使用者命令處理層的功能是讀取使用者輸入的命令,解析使用者命令和輸入引數,根據命令和引數,進行一些校驗,然後執行節點操作。 原始碼例項(Zoo

    zookeeper開源客戶Curator典型應用場景之-分散式計數器(十四)

    之前我們瞭解了基於Corator的分散式鎖之後,我們就很容易基於其實現一個分散式計數器,顧名思義,計數器是用來計數的, 利用ZooKeeper可以實現一個叢集共享的計數器。 只要使用相同的path就可以得到最新的計數器值, 這是由ZooKeeper的一致性保證

    Zookeeper C客戶解析

    Zookeeper客戶端主要有以下幾個核心元件組成: Zookeeper控制代碼:儲存預設Watcher、Zookeeper伺服器地址列表等; Adaptor:包含兩個執行緒:I/O執行緒和Completion執行緒,其中,I/O執行緒負責客戶端與服務端之間的I/O通訊;Comp