Zookeeper(二)java api

     Zookeeper提供了Java API方便我們來操作zk服務,可以通過maven引入zk的相關依賴包。通過org.apache.zookeeper.Zookeeper類創建連接zk服務器的示例對象,在創建過程中給定zk服務器地址、會話持續時間以及監視器三個參數,當連接創建成功後,通過Zookeeper實例提供的接口來和服務器進行交互。Pom文件依賴內容如下:
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
          <version>3.4.5</version>

(一)創建連接

    使用Zookeeper類來表示連接,創建的該實例對象有四個構造方法來調用,不過一般最常用的是下面兩個構造方法的調用:ZooKeeper(connectString,session-Timeout,watcher)和ZooKeeper(connectString,sessionTimeout,watcher,canBeRead-Only);其中第一個構造方式底層調用第二個構造方法,只是canBeReadOnly參數設置爲false。connectString參數爲zk集羣服務器的連接url,當給定路徑的時候,表示所有的操作都是基於該路徑進行操作的(路徑只可以添加到最後)。例如: “hh:2181,hh:2182,hh:2183/app”;sessionTimeout爲會話過期時間,一般設置爲tickTime的3-4倍;watcher是監視器,用於觸發相應事件,可以爲空;canBeReadOnly是給定是否是隻讀連接,默認爲false。

import org.apache.zookeeper.Zookeeper;
...
// 創建連接,第一個參數可以只有IP地址列表,採用默認端口2181
Zookeeper client = new Zookeeper(“hh:2181,hh:2182,hh:2183”, 4000, null);
// 其實url的格式爲: ip[:port](,ip[:port])*[/path]
...
client.close(); // 關閉連接

 

(二)新增/創建節點

    ZK中新增子節點和創建節點其實是同一個含義,創建一個節點其實就相當於在根目錄下新增一個子節點,zk不支持爲不存在的父節點創建子節點(不支持循環創建)。創建節點的時候要求指明節點被創建的類型(CreateMode)。調用Zookeeper實例的create方法,需要給定的參數有:path(節點路徑), data(數據), acl(控制權限列表,不考慮權限的情況下給定爲: Ids.OPEN_ACL_UNSAFE), createMode(節點類型)。

                                                                             節點類型

.....// 初始化client
// 創建一個新節點root,數據爲data,類型爲永久節點
client.create("/root", "data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 給root節點添加一個子節點
client.create("/root/child", "child_data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
....// 關閉client


(三)刪除節點

     當系統不需要某個配置節點的時候,或者某個節點失效的時候,使用delete方法可以刪除該節點,刪除要求是:被刪除的節點沒有子節點,而且被刪除的節點存在,並且需要給定明確的版本號(可以給定-1,表示不管版本號是什麼都刪除)。代碼如下:
client.delete(“/root/child”, -1); // 不管版本號直接刪除
client.delete(“/root”, 0); // 直接刪除版本號爲0的root節點,如果zk上root節點的版本是0,那麼刪除成功,否則拋出異常

(四)設置節點內容

    當節點內容需要進行改變的時候可以調用setData方法設置節點內容,設置內容的時候也需要給定版本號,zk服務器會檢查該版本號,如果當前節點和你給定的版本號不一致,那麼直接拋出異常,否則更新成功。如果給定的版本號爲-1,那麼表示不檢查。代碼如下:
client.setData("/root/child", "new-data".getBytes(), -1); // 設置新的內容


(五)獲取節點內容

當應用系統需要讀取zk節點的內容的時候可以調用getData方法直接獲取節點設置的內容/數據。該方法有四個重載方法,一般情況下直接調用第一個方法即可,代碼如下:
// 獲取數據,不進行watch機制監控,state狀態信息爲空
String data = new String(client.getData("/root/child", false, null));
System.out.println(data);

 

(六)Watch機制

    Watch機制是zk中一種類似observer的機制,當節點發生變化的時候,會通知watch定義的方法。當發生變化的時候,zk服務器會發送一次且僅一次通知信息給客戶端(以節點和watcher爲計算單位,也就是說同一個節點,不同方法上使用同一個監視器(watcher實例)只會觸發一次)。如果使用該機制需要自定義實現org.apache.zookeeper.Watcher接口的process方法,該方法傳入一個org.apache.zookeeper.WatchedEvent的event參數。其中event中主要包含一個改變原因以及對應監視節點的路徑。只有exits、getChildren和getData三個方法上可以指定監視器。


總結:

1. 同一個node,同一個watcher實例,zk服務器只會通知一次。
2. watch的觸發有不同的觸發規則,不同的方法只會觸發不同類型的event。
3. watch機制只監控node節點本身以及node節點的第一代子節點。
4. 指定watch參數的時候,如果指定的是true,那麼表示使用默認的watch實例對象,即在創建連接的時候給定的watch實例對象。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章