##簡單API ZooKeeper的設計目標之一就是提供一個很是簡單的編程接口。這個編程接口主要支持如下幾種操做:html
操做 | 說明 |
---|---|
create | 在樹中建立一個節點 |
delete | 刪除一個節點 |
exists | 測試節點是否存在 |
get data | 讀取節點數據 |
set data | 將數據寫入節點 |
get children | 查詢節點的子節點 |
sync | 等待數據被傳輸 |
##代碼示例 下面的代碼是使用 ZooKeeper 原生 API 來實現的。apache
// 建立 ZooKeeper 實例 ZooKeeper zk = new ZooKeeper("192.168.109.137:2181,192.168.109.138:2181,192.168.109.139:2181", 500000, new Watcher() { // 監控被觸發的事件 public void process(WatchedEvent event) { System.out.println(event); } }); // 判斷 /zk_test 節點是否存在 System.out.println(zk.exists("/zk_test", true)); // 建立一個持久節點 /zk_test, 數據內容是 test-data, 不進行 ACL 權限控制 zk.create("/zk_test", "test-data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 建立兩個子節點, 節點類型均爲持久節點 zk.create("/zk_test/child_a", "test-data-child-a".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/zk_test/child_b", "test-data-child-b".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 獲取 /zk_test 節點數據 System.out.println(new String(zk.getData("/zk_test", false, null))); // 取出 /zk_test 節點的子節點列表 System.out.println(zk.getChildren("/zk_test", true)); // 更新 /zk_test 節點數據 zk.setData("/zk_test", "test-data-update".getBytes(), -1); // 獲取 /zk_test 節點更新後的數據 System.out.println(new String(zk.getData("/zk_test", false, null))); // 刪除子節點 zk.delete("/zk_test/child_a", -1); zk.delete("/zk_test/child_b", -1); // 刪除父節點 /zk_test zk.delete("/zk_test", -1); // 關閉鏈接 zk.close();
##Curator Curator 是 Netflix 公司開源的一個 ZooKeeper 客戶端框架, 由 Jordan Zimmerman 開發。Curator 提供了一套可讀性更強的 Fluent 風格的 API, 而且提供了 ZooKeeper 各類應用場景(recipe, 好比共享鎖服務, 集羣領導選舉機制)的抽象封裝。更多詳細介紹參見 Curator官網編程
###Curator組件 | 組件名稱 | 說明 | | ------------- |:-------------:| |Recipes |一些 ZooKeeper 經常使用應用場景的實現, 其實現是基於 Curator Framework。| |Framework |Curator Framework 是一個高級別的 API, 它極大的簡化了 ZooKeeper 的使用。它添加了不少使用 ZooKeeper 開發的特性, 而且能夠處理複雜的 ZooKeeper 集羣鏈接管理和重試操做。| |Utilities |使用 ZooKeeper 時不少實用的工具類。| |Client |ZooKeeper 原生客戶端的一個替代品, 它負責處理一些底層的操做並提供了一些實用工具類。| |Errors |Curator 用於處理錯誤, 鏈接問題, 恢復異常等。| |Extensions |curator-recipes 包實現了 ZooKeeper 文檔中描述的一些經常使用的應用場景。爲了不這個包變得很大, 將一些 recipes/applications 使用命名規則 curator-x-name 放到一個單獨的 extension 包中, 好比 curator-x-discovery, curator-x-discoveryserver 以及 curator-x-rpc 等等。| ###代碼示例 下面使用 Curator 提供的 API 來替換上面示例中 ZooKeeper 原生的 API。app
// ZooKeeper集羣地址 String zkConnectionString = "192.168.109.137:2181,192.168.109.138:2181,192.168.109.139:2181"; // 指定ZooKeeper集羣鏈接重試策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); // 使用CuratorFrameworkFactory建立Curator鏈接實例CuratorFramework, 只須要爲每一個鏈接的ZooKeeper集羣建立一個CuratorFramework對象實例 CuratorFramework zkClient = CuratorFrameworkFactory.newClient(zkConnectionString, retryPolicy); // 啓動客戶端 zkClient.start(); // 判斷 /zk_test 節點是否存在 zkClient.checkExists().forPath("/zk_test"); // 建立一個持久節點 /zk_test, 數據內容是 test-data。 zkClient.create().forPath("/zk_test", "test-data".getBytes()); // 建立兩個子節點, 節點類型均爲持久節點 zkClient.create().forPath("/zk_test/child_a", "test-data-child-a".getBytes()); zkClient.create().forPath("/zk_test/child_b", "test-data-child-b".getBytes()); // 獲取 /zk_test 節點數據 System.out.println(new String(zkClient.getData().forPath("/zk_test"))); // 取出 /zk_test 節點的子節點列表 System.out.println(zkClient.getChildren().forPath("/zk_test")); // 更新 /zk_test 節點數據 zkClient.setData().forPath("/zk_test", "test-data-update".getBytes()); // 獲取 /zk_test 節點更新後的數據 System.out.println(new String(zkClient.getData().forPath("/zk_test"))); // 刪除子節點 zkClient.delete().forPath("/zk_test/child_a"); zkClient.delete().forPath("/zk_test/child_b"); // 取出 /zk_test 節點的子節點列表 System.out.println(zkClient.getChildren().forPath("/zk_test")); // 刪除父節點 /zk_test zkClient.delete().forPath("/zk_test"); // 關閉鏈接 zkClient.close();
##參考資料 http://curator.apache.org/index.html框架