ZooKeeper簡單API

##簡單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框架

相關文章
相關標籤/搜索