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三種客戶端的介紹✔✔✔