1. 程式人生 > >Zookeeper開源客戶端Curator之基本功能講解

Zookeeper開源客戶端Curator之基本功能講解

簡介

Curator是Netflix公司開源的一套Zookeeper客戶端框架。瞭解過Zookeeper原生API都會清楚其複雜度。Curator幫助我們在其基礎上進行封裝、實現一些開發細節,包括接連重連、反覆註冊Watcher和NodeExistsException等。目前已經作為Apache的頂級專案出現,是最流行的Zookeeper客戶端之一。從編碼風格上來講,它提供了基於Fluent的程式設計風格支援。

除此之外,Curator還提供了Zookeeper的各種應用場景:Recipe、共享鎖服務、Master選舉機制和分散式計數器等。 
這裡寫圖片描述

專案及依賴

版本

目前Curator有2.x.x和3.x.x兩個系列的版本,支援不同版本的Zookeeper。其中Curator 2.x.x相容Zookeeper的3.4.x和3.5.x。而Curator 3.x.x只相容Zookeeper 3.5.x,並且提供了一些諸如動態重新配置、watch刪除等新特性。

專案元件

名稱 描述
Recipes Zookeeper典型應用場景的實現,這些實現是基於Curator Framework。
Framework Zookeeper API的高層封裝,大大簡化Zookeeper客戶端程式設計,添加了例如Zookeeper連線管理、重試機制等。
Utilities 為Zookeeper提供的各種實用程式。
Client Zookeeper client的封裝,用於取代原生的Zookeeper客戶端(ZooKeeper類),提供一些非常有用的客戶端特性。
Errors Curator如何處理錯誤,連線問題,可恢復的例外等。

Maven依賴

Curator的jar包已經發布到Maven中心,由以下幾個artifact的組成。根據需要選擇引入具體的artifact。但大多數情況下只用引入curator-recipes即可。

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環境的橋接。

根據上面的描述,開發人員大多數情況下使用的都是curator-recipes的依賴,此依賴的maven配置如下:

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.12.0</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

由於版本相容原因,採用了2.x.x的最高版本。

案例及功能說明

建立會話

Curator的建立會話方式與原生的API和ZkClient的建立方式區別很大。Curator建立客戶端是通過CuratorFrameworkFactory工廠類來實現的。其中,此工廠類提供了三種建立客戶端的方法。 
前兩種方法是通過newClient來實現,僅引數不同而已。

public static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy)

public static CuratorFramework newClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs, RetryPolicy retryPolicy)
  • 1
  • 2
  • 3

使用上面方法創建出一個CuratorFramework之後,需要再呼叫其start()方法完成會話建立。 
例項程式碼:

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
        CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",retryPolicy);
        client.start();
  • 1
  • 2
  • 3
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",
                5000,1000,retryPolicy);
         client.start();
  • 1
  • 2
  • 3
  • 4

其中引數RetryPolicy提供重試策略的介面,可以讓使用者實現自定義的重試策略。預設提供了以下實現,分別為ExponentialBackoffRetry、BoundedExponentialBackoffRetry、RetryForever、RetryNTimes、RetryOneTime、RetryUntilElapsed。

進一步檢視原始碼可以得知,其實這兩種方法內部實現一樣,只是對外包裝成不同的方法。它們的底層都是通過第三個方法builder來實現的。 
例項程式碼:

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
        CuratorFramework client =CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181")
                .retryPolicy(retryPolicy)
                .sessionTimeoutMs(6000)
                .connectionTimeoutMs(3000)
                .build();
        client.start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

觀察上面的例項,我們可以看到此處已經使用了Fluent風格的編碼。其中namespace(“demo”)這項設定用來定義此會話的獨立名稱空間,隨後的相應操作都是在此名稱空間下進行操作。

重試策略

上面的例子中使用到了ExponentialBackoffRetry重試策略實現。此策略先給定一個初始化sleep時間baseSleepTimeMs,在此基礎上結合重試次數,通過以下程式碼計算當前需要的sleep時間:

long sleepMs = baseSleepTimeMs * Math.max(1, random.nextInt(1 << (retryCount + 1)));
if ( sleepMs > maxSleepMs ){
            sleepMs = maxSleepMs;
 }
  • 1
  • 2
  • 3
  • 4

隨著重試次數的增加,計算出的sleep時間也會越來越大。如果超過maxSleepMs則使用maxSleepMs的時間。其中maxRetries限制了最大的嘗試次數。

建立節點

Curator建立節點的方法也是基於Fluent風格編碼,原生API中的引數很多都轉化為一層層的方法呼叫來進行設定。下面簡單介紹一下常用的幾個節點建立場景。 
(1)建立一個初始內容為空的節點

client.create().forPath(path);
  • 1

Curator預設建立的是持久節點,內容為空。 
(2)建立一個包含內容的節點

client.create().forPath(path,"我是內容".getBytes());
  • 1

Curator和ZkClient不同的是依舊採用Zookeeper原生API的風格,內容使用byte[]作為方法引數。 
(3)建立臨時節點,並遞迴建立父節點

client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
  • 1

此處Curator和ZkClient一樣封裝了遞迴建立父節點的方法。在遞迴建立父節點時,父節點為持久節點。

刪除節點

刪除節點的方法也是基於Fluent方式來進行操作,不同型別的操作呼叫新增不同的方法呼叫即可。 
(1)刪除一個子節點

client.delete().forPath(path);
  • 1

(2)刪除節點並遞迴刪除其子節點

client.delete().deletingChildrenIfNeeded().forPath(path);
  • 1

(3)指定版本進行刪除

client.delete().withVersion(1).forPath(path);
  • 1

如果此版本已經不存在,則刪除異常,異常資訊如下。

org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for
  • 1

(4)強制保證刪除一個節點

client.delete().guaranteed().forPath(path);
  • 1

只要客戶端會話有效,那麼Curator會在後臺持續進行刪除操作,直到節點刪除成功。比如遇到一些網路異常的情況,此guaranteed的強制刪除就會很有效果。

讀取資料

讀取節點資料內容API相當簡單,Curator提供了傳入一個Stat,使用節點當前的Stat替換到傳入的Stat的方法,查詢方法執行完成之後,Stat引用已經執行當前最新的節點Stat。

// 普通查詢
client.getData().forPath(path);
// 包含狀態查詢
Stat stat = new Stat();
client.getData().storingStatIn(stat()).forPath(path);
  • 1
  • 2
  • 3
  • 4
  • 5

更新資料

更新資料,如果未傳入version引數,那麼更新當前最新版本,如果傳入version則更新指定version,如果version已經變更,則丟擲異常。

// 普通更新
client.setData().forPath(path,"新內容".getBytes());
// 指定版本更新
client.setData().withVersion(1).forPath(path);
  • 1
  • 2
  • 3
  • 4

版本不一直異常資訊:

org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for
  • 1

非同步介面

在使用以上針對節點的操作API時,我們會發現每個介面都有一個inBackground()方法可供呼叫。此介面就是Curator提供的非同步呼叫入口。對應的非同步處理介面為BackgroundCallback。此介面指提供了一個processResult的方法,用來處理回撥結果。其中processResult的引數event中的getType()包含了各種事件型別,getResultCode()包含了各種響應碼。

重點說一下inBackground的以下介面:

public T inBackground(BackgroundCallback callback, Executor executor);
  • 1

此介面就允許傳入一個Executor例項,用一個專門執行緒池來處理返回結果之後的業務邏輯。


相關推薦

Zookeeper開源客戶Curator基本功能講解

簡介 Curator是Netflix公司開源的一套Zookeeper客戶端框架。瞭解過Zookeeper原生API都會清楚其複雜度。Curator幫助我們在其基礎上進行封裝、實現一些開發細節,包括接連重連、反覆註冊Watcher和NodeExistsExcept

zookeeper開源客戶Curator典型應用場景-服務註冊與發現(十一)

隨著業務增加,以前簡單的系統已經變得越來越複雜,單純的提升伺服器效能也不是辦法,而且程式碼也是越來越龐大,維護也變得越來越困難,這一切都催生了新的架構設計風格 – 微服務架構的出現。 微服務給我們帶來了很多好處,例如:獨立可擴充套件、易維護。但是隨著應用的分解

zookeeper開源客戶Curator典型應用場景-Barrier屏障(十三)

什麼是Barrier Barrier是這樣的:Barrier是一個同步點,每一個程序到達此點都要等待,直到某一個條件滿足,然後所有的節點繼續進行。 比如:賽跑大家都知道,所有比賽人員都會在起跑線外等待,直到教練員的槍響之後,所有參賽者立刻開始賽跑。 JDK的併

zookeeper開源客戶Curator典型應用場景-分散式計數器(十四)

之前我們瞭解了基於Corator的分散式鎖之後,我們就很容易基於其實現一個分散式計數器,顧名思義,計數器是用來計數的, 利用ZooKeeper可以實現一個叢集共享的計數器。 只要使用相同的path就可以得到最新的計數器值, 這是由ZooKeeper的一致性保證

zookeeper開源客戶Curator典型應用場景-訊息佇列(十二)

Curator框架也有分散式佇列實現。 利用ZK的PERSISTENT SEQUENTIAL(持久順序)節點,可以保證放入到佇列中的專案是按照順序排隊的。並且宕機重啟並不丟失訊息, 如果單一的消費者從佇列中取資料, 那麼它是先入先出的,這也是佇列的特點。 如果

zookeeper開源客戶Curator典型應用場景-Master選舉(十)

在生產環境中,一般要保證服務的高可用,有時候只需要選出一臺機器來執行,其餘機器處於備用狀態,比如,在分散式系統中很常見的一個問題就是定時任務的執行。如果多臺機器同時執行相同的定時任務,業務複雜則可能出現災難性的後果。我使用的是噹噹網的elastic-job分散

zookeeper開源客戶Curator介紹(六)

上一篇文章介紹了zookeeper原生API的使用,使用過原生API不得不說,有很多的問題,比如:不能遞迴建立和刪除節點、Watcher只能使用一次、還有很多可以解決分散式應用問題的api(比如分散式鎖,leader選舉等),但由於ZooKeeper提供的原始

7.5 zookeeper客戶curator基本使用

serve server 超時 one c-c tlist result 強制 car 使用zookeeper原生API實現一些復雜的東西比較麻煩。所以,出現了兩款比較好的開源客戶端,對zookeeper的原生API進行了包裝:zkClient和curator。後者是Net

Zookeeper開源客戶框架Curator簡介

curator簡介 Netflix curator 是Netflix公司開源的一個Zookeeper client library,用於簡化zookeeper客戶端程式設計,包含一下幾個模組: curator-client - zookeeper client封裝,用於

【hadoop zookeeperZookeeper開源客戶框架Curator簡介

Curator是Netflix開源的一套ZooKeeper客戶端框架. Netflix在使用ZooKeeper的過程中發現ZooKeeper自帶的客戶端太底層, 應用方在使用的時候需要自己處理很多事情, 於是在它的基礎上包裝了一下, 提供了一套更好用的客戶端框架. Netf

Zookeeper 開源客戶 ZkClient 版本 api介紹和示例

ZkClient是由Datameer的工程師開發的開源客戶端,對Zookeeper的原生API進行了包裝,實現了超時重連、Watcher反覆註冊等功能。 ZKClient版本及原始碼 maven依賴 ZkClient目前有兩個不同artifactId的系列。  其中最早

開源客戶Curator 使用(上)

一 介紹 Curator是Netflix公司開源的一款Zookeeper客戶端框架,Curator解決了很多Zookeeper客戶端非常底層的細節開發工作,包括連線重連、反覆註冊Watcher等,實現Fluent風格的API介面,目前已經成為Apache的頂級專案,是全世界

寫了個Android聊天客戶框架,基本聊天功能、資料庫、伺服器都有。大家可以看一看。已經開源

寫了個Android聊天客戶端框架,基本聊天功能、資料庫、伺服器都有。大家可以看一看。已經開源(希望兩個手機通訊的話,改一下pushid就可以) 幾點說明: 1:包含的基本功能。: 1.1比如gif動態表情展示、語音、聊天表情、拍照、多圖的傳送、大圖片的處理、listview快取的處理等。 &n

Zookeeper學習六】——開源客戶ZKClient和Curator介紹與應用

前言 在真正的專案中通常使用的是zkclient和curator,而不是原生的zookeeper客戶端,因為zookeeper原生的客戶端存在一定的侷限性,本篇小編主要講解一下這兩種zookeeper客戶端的使用! 內容 1.1zk原生api不足之

Zookeeper開源客戶ZkClient

ZkClient是由Datameer的工程師開發的開源客戶端,對Zookeeper的原生API進行了包裝,實現了超時重連、Watcher反覆註冊等功能。 ZKClient版本及原始碼 maven依賴 ZkClient目前有兩個不同artifactI

ZookeeperZookeeper底層客戶架構實現原理(轉載)

一次 描述 綁定 機制 一個 ini fin 源碼 receive Zookeeper的Client直接與用戶打交道,是我們使用Zookeeper的interface。了解ZK Client的結構和工作原理有利於我們合理的使用ZK,並能在使用中更早的發現問題。本文將在研究源

java在線聊天項目0.9版 實現把服務接收到的信息返回給每一個客戶窗口中顯示功能客戶接收

nec 一個 out for tex ava 添加 implement com 客戶端要不斷接收服務端發來的信息 與服務端不斷接收客戶端發來信息相同,使用線程的方法,在線程中循環接收 客戶端修改後代碼如下: package com.swift; import java.

Zookeeper分散式及客戶Curator的API簡單使用

最近公司專案中使用了分散式Zookeeper及Dubbo,為了弄清楚這些框架在專案中的使用,在我業餘時間中學習了一些Zookeeper的簡單用法,分享出來,若有不足之處,望大家給與建議...... 一、什麼是分散式系統? 我的理解:將原有的系統拆分為多個子系統組成一個龐大的系統,這個龐大

zookeeper客戶curator簡易使用

zookeeper客戶端curator簡易使用 寫在前面:目前Curator有2.x.x和3.x.x兩個系列的版本,支援不同版本的Zookeeper。其中Curator 2.x.x相容Zookeeper的3.4.x和3.5.x。而Curator 3.x.x只相容Zookeeper

zookeeper使用(三)--開源客戶

一、前言   上一篇部落格已經介紹瞭如何使用Zookeeper提供的原生態Java API進行操作,本篇博文主要講解如何通過開源客戶端來進行操作。 二、ZkClient   ZkClient是在Zookeeper原聲API介面之上進行了包裝,是一個更易用的Zookeeper客戶端,其內部