zookeeper 常用的3種java客戶端:
- zookeeper原生Java API
- ZkClient
- Apache curator
1、zookeeper原生Java API
Zookeeper客戶端提供了基本的操作,比如,創建會話、創建節點、讀取節點、更新數據、刪除節點和檢查節點是否存在等。但對於開發人員來說,Zookeeper提供的基本操縱還是有一些不足之處。
Zookeeper API不足之處
(1)Session超時之后沒有實現重連機制,需要手動操作;
(2)Watcher注冊是一次性的,每次觸發之后都需要重新進行注冊;
(3)不支持遞歸創建節點;
(4)異常處理繁瑣,Zookeeper提供了很多異常,對於開發人員來說可能根本不知道該如何處理這些異常信息;
(5)只提供了簡單的byte[]數組的接口,沒有提供針對對象級別的序列化;
(6)創建節點時如果節點存在拋出異常,需要自行檢查節點是否存在;
(7)刪除節點無法實現級聯刪除;
基於以上原因,直接使用Zookeeper原生API的人並不多。
2、ZkClient
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.11</version> </dependency>
ZkClient是一個開源客戶端,在Zookeeper原生API接口的基礎上進行了包裝,更便於開發人員使用。解決如下問題:
1)session會話超時重連
2)解決Watcher反復注冊
3)簡化API開發
雖然 ZkClient 對原生 API 進行了封裝,但也有它自身的不足之處:
- 幾乎沒有參考文檔;
- 異常處理簡化(拋出RuntimeException);
- 重試機制比較難用;
- 沒有提供各種使用場景的實現;
3、Apache Curator
Curator是Netflix公司開源的一套Zookeeper客戶端框架,和ZkClient一樣,解決了非常底層的細節開發工作,包括連接重連、反復注冊Watcher和NodeExistsException異常等。目前已經成為 Apache 的頂級項目。
其特點:
- Apache 的開源項目
- 解決Watch注冊一次就會失效的問題
- 提供一套Fluent風格的 API 更加簡單易用
- 提供更多解決方案並且實現簡單,例如:分布式鎖
- 提供常用的ZooKeeper工具類
- 編程風格更舒服
除此之外,Curator中還提供了Zookeeper各種應用場景(Recipe,如共享鎖服務、Master選舉機制和分布式計算器等)的抽象封裝。
補充說明
Apache Curator是Apache ZooKeeper的Java / JVM客戶端庫,Apache ZooKeeper是一種分布式協調服務。
它包括一個高級API框架和實用程序,使Apache ZooKeeper更容易和更可靠。它還包括常見用例和擴展(如服務發現和Java 8異步DSL)的配方。
官網:http://curator.apache.org/index.html
Curator項目組件(下載官方源碼就可以看到以下組件)
Recipes: Zookeeper典型應用場景的實現,這些實現是基於Curator Framework。
Framework: Zookeeper API的高層封裝,大大簡化Zookeeper客戶端編程,添加了例如Zookeeper連接管理、重試機制等。
Utilities: 為Zookeeper提供的各種實用程序。
Client: Zookeeper client的封裝,用於取代原生的Zookeeper客戶端(ZooKeeper類),提供一些非常有用的客戶端特性。
Errors: Curator如何處理錯誤,連接問題,可恢復的例外等。
Maven依賴(地址:https://search.maven.org/search?q=org.apache.curator)
GroupID/Org ArtifactID/Name 描述 org.apache.curator curator-recipes 所有典型應用場景。需要依賴client和framework,需設置自動獲取依賴。 org.apache.curator curator-framework 同組件中framework介紹。 org.apache.curator curator-client 同組件中client介紹。 org.apache.curator curator-test 包含TestingServer、TestingCluster和一些測試工具。 org.apache.curator curator-examples 各種使用Curator特性的案例。 org.apache.curator curator-x-discovery 在framework上構建的服務發現實現。 org.apache.curator curator-x-discoveryserver 可以和Curator Discovery一起使用的RESTful服務器。 org.apache.curator curator-x-rpc Curator framework和recipes非java環境的橋接。
分布式鎖實現
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.1.0</version> </dependency>
public static void main(String[] args) { String zookeeperConnectionString = "localhost:2181"; RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy); client.start(); try { //創建分布式鎖, 鎖空間的根節點路徑為/curator/lock InterProcessMutex lock = new InterProcessMutex(client, "/curator/lock"); if ( lock.acquire(1000, TimeUnit.SECONDS) ) { try { // do some work inside of the critical section here System.out.println("do some work inside of the critical section here"); } finally { //完成業務流程, 釋放鎖 lock.release(); } } } catch (Exception e) { e.printStackTrace(); } }