Zookeeper客戶端詳解

zk常見客戶端有三種

  • zookeeper原生Java API
  • ZkClient
  • Apache curator

1.原生ZookeeperAPI

<dependency> 
    <groupId>org.apache.zookeeper</groupId> 
    <artifactId>zookeeper</artifactId> 
    <version>3.5.5</version>
</dependency>

 

import org.apache.zookeeper.ZooKeeper; 

ZooKeeper zooKeeper = new ZooKeeper("192.162.101.129:2181", 50000, event -> { System.out.println(event); });

 

Zookeeper客戶端提供了基本的操作,比如,創建會話、創建節點、讀取節點、更新數據、刪除節點和檢查節點是否存在等。但對於開發人員來說,Zookeeper提供的基本操縱還是有一些不足之處。

Zookeeper API不足之處

  • Watcher註冊是一次性的,每次觸發之後都需要重新進行註冊;
  • Session超時之後沒有實現重連機制;
  • 異常處理繁瑣,Zookeeper提供了很多異常,對於開發人員來說可能根本不知道該如何處理這些異常信息;
  • 只提供了簡單的byte[]數組的接口,沒有提供針對對象級別的序列化;
  • 創建節點時如果節點存在拋出異常,需要自行檢查節點是否存在;
  • 刪除節點無法實現級聯刪除;

基於以上原因,直接使用Zookeeper原生API的人並不多。

 

2.ZKClient

<dependency> 
    <groupId>com.101tec</groupId> 
    <artifactId>zkclient</artifactId> 
    <version>0.11</version> 
</dependency>

import org.I0Itec.zkclient.ZkClient; 

ZkClient zkClient = new ZkClient(server, 5000, 100000);

 

ZkClient是一個開源客戶端,在Zookeeper原生API接口的基礎上進行了包裝,更便於開發人員使用。解決如下問題:

  • 1)session會話超時重連
  • 2)解決Watcher反覆註冊
  • 3)簡化API開發

雖然 ZkClient 對原生 API 進行了封裝,但也有它自身的不足之處:

  • 幾乎沒有參考文檔;
  • 異常處理簡化(拋出RuntimeException);
  • 重試機制比較難用;
  • 沒有提供各種使用場景的實現;

 

3.Apache Curator框架的ZooKeeper使用詳解

<dependency> 
    <groupId>org.apache.curator</groupId> 
    <artifactId>curator-framework</artifactId> 
    <version>RELEASE</version> 
    <scope>compile</scope> 
</dependency>

 

import org.apache.curator.RetryPolicy; 
import org.apache.curator.framework.CuratorFramework; 
import org.apache.curator.framework.CuratorFrameworkFactory; 
import org.apache.curator.retry.ExponentialBackoffRetry; 


// 重試策略:初試時間爲1s 重試10次 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10); 
// 通過工廠創建連接 
CuratorFramework zkClient = CuratorFrameworkFactory.builder() .connectString("192.168.1.1:2100,192.168.1.1:2101,192.168.1.:2102") .connectionTimeoutMs(3000) 
.sessionTimeoutMs(3000) 
.retryPolicy(retryPolicy) 
.build();

官網解釋:

 

Apache Curator是用於Apache ZooKeeper(一種分佈式協調服務)的Java / JVM客戶端庫。 它包括一個高級API框架和實用程序,使使用Apache ZooKeeper更加容易和可靠。 它還包括針對常見用例和擴展的配方,例如服務發現和Java 8異步DSL。

Curator主要解決了三類問題:

  • 封裝ZooKeeper client與ZooKeeper server之間的連接處理
  • 提供了一套Fluent風格的操作API
  • 提供ZooKeeper各種應用場景(recipe, 比如:分佈式鎖服務、集羣領導選舉、共享計數器、緩存機制、分佈式隊列等)的抽象封裝

 

Curator主要從以下幾個方面降低了zk使用的複雜度

  • 重試機制:提供可插拔的重試機制,它將給捕獲所有可恢復的異常配置一個重試策略,並且內部也提供了集中標準的重試策略(比如指數補償等)
  • 連接狀態監控:Curator初始化之後會一直對zk連接進行監聽,一旦發現連接狀態發生變化將會作出相應的處理
  • zk客戶端實例管理:Curator會對zk客戶端到server集羣的連接進行管理,並在需要的時候重建zk實例,保證與zk集羣連接的可靠性
  • 各種使用場景支持:Curator實現了zk支持的大部分使用場景(甚至包括zk自身不支持的場景),這些實現都遵循了zk的最佳實踐,並考慮了各種極端情況

上述就是zookeeper三種客戶端的介紹✔✔✔

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章