Curator Framework提供了簡化使用zookeeper更高階的API介面。它包涵很多優秀的特性,主要包括以下三點:
- 自動連線管理:自動處理zookeeper的連線和重試存在一些潛在的問題;可以watch NodeDataChanged event和獲取updateServerList;Watches可以自動被Cruator recipes刪除;
- 更乾淨的API:簡化raw zookeeper方法,事件等;提供現代流式API介面
- Recipe實現:leader選舉,分散式鎖,path快取,和watcher,分散式佇列等。
Zookeeper在實際生產環境中應用比較廣泛,比如SOA的服務監控系統,Hadoop,spark的分散式排程系統。Curator框架提供的優秀特性可以使得我們更加便捷的開發zookeeper應用。本文主要講解了curator的基本使用方法。
CuratorFramework例項建立
Curator框架透過CuratorFrameworkFactory以工廠模式和builder模式建立CuratorFramework實 例。 CuratorFramework例項都是執行緒安全的,我們應該當在ZooKeeper Cluster中共享同一個CuratorFramework例項。工廠方法newClient() 提供了簡便建立client例項方式,使用start和close方法啟動和關閉客戶端。使用Curator框架建立客戶端程式碼如下,
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework newClient=CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
運算元據節點
zookeeper中,節點的組織類似於linux的檔案系統,使用path來標識每個節點(znode),znode作為儲存資料的容器,資料量限制在1M以內,這部分介紹如何使用curator框架建立,獲取,更新,以及刪除節點。
建立節點
Curator建立znode節點程式碼如下所示:
public void createNode(CuratorFramework newClient, String path, CreateMode createMode, String data) {
try {
newClient.create().withMode(createMode).forPath(path, data.getBytes());
} catch (Exception e) {
System.out.println("建立節點失敗, elog=" + e.getMessage());
}
}
zookeeper中節點有兩種型別,臨時節點和永久節點,CreateMode類用於指定建立節點的型別,使用者可以選擇以下幾個引數:
- CreateMode.PERSISTENT: 建立節點後,不刪除就永久存在
- CreateMode.PERSISTENT_SEQUENTIAL:節點path末尾會追加一個10位數的單調遞增的序列
- CreateMode.EPHEMERAL:建立後,回話結束節點會自動刪除
- CreateMode.EPHEMERAL_SEQUENTIAL:節點path末尾會追加一個10位數的單調遞增的序列
forPath函式指定建立節點的path和儲存的資料,path的指定遵循linux檔案path格式,建立node時指定的path,父 path節點需要存在,否則建立節點失敗,比如建立"/parent/child"節點,若不存在節點"parent",那麼建立節點會失敗。在 znode中儲存的資料需要進行序列化,使用者可以選擇使用JSON,XML,java內建的序列化機制,或者Hession以及Google的 protocal Buffer等,為方便講解,節點儲存字串資料。
獲取節點資料
CuratorFramework提供getData函式,透過指定znode的path,就可以完成資料的獲取。
public String getData(CuratorFramework newClient, String path){
try {
return new String(newClient.getData().forPath(path));
} catch (Exception e) {
System.out.println("獲取資料失敗, elog=" + e.getMessage());
}
return null;
}
更新節點
同樣CuratorFramework提供setData函式,透過指定znode的path,可以完成資料的更新。
public void updateNodeDate(CuratorFramework newClient, String path, String data) {
try {
newClient.setData().forPath(path, data.getBytes());
} catch (Exception e) {
System.out.println("更新節點資料失敗, elog=" + e.getMessage());
}
}
刪除節點
和獲取,更新節點類似,CuratorFramework提供delete函式,指定znode的path刪除某一個節點。
public void deleteNode(CuratorFramework newClient, String path) {
try {
newClient.delete().forPath(path);
} catch (Exception e) {
System.out.println("刪除節點失敗, elog=" + e.getMessage());
}
}
Conclusion
本文和大家分享了CuratorFramework的基本使用方法,希望能對大家有所幫助。更多的使用方式可以參考官方給出的API文件。