Zookeeper原生Java API、ZKClient和Apache Curator 區別對比


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 的頂級項目。

其特點:

  1. Apache 的開源項目
  2. 解決Watch注冊一次就會失效的問題
  3. 提供一套Fluent風格的 API 更加簡單易用
  4. 提供更多解決方案並且實現簡單,例如:分布式鎖
  5. 提供常用的ZooKeeper工具類
  6. 編程風格更舒服

除此之外,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();
}
}

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM