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文檔。