Zookeeper之Curator(1)客戶端基本的建立,刪除,更新,查詢操作api

Love Lenka發表於2017-04-21

Curator Framework提供了簡化使用zookeeper更高階的API介面。它包涵很多優秀的特性,主要包括以下三點:

  1. 自動連線管理:自動處理zookeeper的連線和重試存在一些潛在的問題;可以watch NodeDataChanged event和獲取updateServerList;Watches可以自動被Cruator recipes刪除;
  2. 更乾淨的API:簡化raw zookeeper方法,事件等;提供現代流式API介面
  3. 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類用於指定建立節點的型別,使用者可以選擇以下幾個引數:

  1. CreateMode.PERSISTENT: 建立節點後,不刪除就永久存在
  2. CreateMode.PERSISTENT_SEQUENTIAL:節點path末尾會追加一個10位數的單調遞增的序列
  3. CreateMode.EPHEMERAL:建立後,回話結束節點會自動刪除
  4. 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文件。

相關文章