1. 程式人生 > >【Zookeeper】——客戶端簡介

【Zookeeper】——客戶端簡介

        本篇部落格介紹客戶端,客戶端是開發人員使用Zookeeper最主要的途徑,包括Zookeeper的客戶端和第三方提供的客戶端。

Zookeeper的客戶端

對Zookeeper的客戶端只做簡單的介紹,主要是在linux系統上如何通過客戶端的命令檢視伺服器上的節點結構及節點中的資料。在Zookeeper的安裝的bin目錄下可以看做有一個zkCli.sh,這就是在linux上Zookeeper客戶端的啟動命令。

首先需要連線,進入到bin目錄,連線的格式如下:./zkCli.sh –timeout –r –server ip:port

-timeout:表示當前會話的超時時間,zookeper依靠與客戶端的心跳來判斷會話是否有效,單位是毫秒

-r:代表只讀模式,zookeeper的只讀模式指一個伺服器與叢集中過半機器失去連線以後,這個伺服器就不在處理客戶端的請求,但我們仍然希望該伺服器可以提供讀服務。

-server:指定伺服器ip地址和埠號

        使用時最簡單的只需要輸入ip和port,如下:

        連線成功後輸入h,可檢視可用命令列表:

        

        這些命令的使用可自己查詢,資料很多。以上是在linux中直接通過命令操作客戶端。Zookeeper本身還提供了Java的API來操作Zookeeper,這是在程式設計中使用的。

開源的第三方Zookeeper客戶端

開發中對Zookeeper的使用主要還是在程式碼中進行操作,比較常用的是zkClient和Curator,做測試時使用的是zkClient。zkClient是在Zookeeper原生的API介面上進行了包裝,是一個更加容易使用的Zookeeper客戶端。

首先說明一下,在使用zkClient進行建立節點的測試時出現的亂碼的情況,而且節點中的資料並不是中文,即使是英文字母也會出現亂碼,原因是這樣的windows系統預設編碼格式為GBK,linux預設為UTF-8,Zookeeper是安裝在linux系統上的,所以會出現亂碼,解決方法如下:

首先看一下通過zkClient建立節點的測試程式碼

public class CreateNode {
 
   public static void main(String[] args) {
      ZkClientzc = new ZkClient("192.168.169.30:2181",10000,10000,newSerializableSerializer());
      System.out.println("conneted ok!");
      //建立節點test,內容為test
      String path = zc.create("/test","test", CreateMode.PERSISTENT);
     
      System.out.println("created path:"+path);
   }
  
}

上面程式碼中建立了節點test,其中的資料值為test,在Zookeeper的伺服器上檢視會出現亂碼。

原因:建立zkClient時,第三個引數new SerializableSerializer(),沒有解決編碼問題

解決方法:

1、自己定義序列化類,使用UTF-8編碼,需要實現ZkSerializer介面,程式碼如下

public class MyZkSerializer implementsZkSerializer
{
   public Object deserialize(byte[] bytes) throws ZkMarshallingError
    {
       return new String(bytes, Charsets.UTF_8);
    }
 
   public byte[] serialize(Object obj) throws ZkMarshallingError
    {
       return String.valueOf(obj).getBytes(Charsets.UTF_8);
    }
}


2、建立zkClient時第三個引數使用自己定義的序列化類即可。

其他的zkClient的增刪改查節點及節點內資料的方法可以參考zkClient的API即可。

Zookeeper檢視節點除了可以使用自身的提供的命令,還有很多第三方的視覺化工具,自己在git上找到了一個,地址是:https://github.com/DeemOpen/zkui,有詳細的專案啟動說明。