zookeeper之java客戶端使用總結

       如今市面上有不少種zookeeper的java客戶端庫,咱們這兒用的是apache的zookeeper庫(畢竟如今zookeeper是在apache裏面維護)。
java

1.明確幾個zookeeper裏面的概念

     Zookeeper的節點都是存放在內存中的,因此讀寫速度很快。更新日誌被記錄到了磁盤中,以便用於恢復數據。在更新內在中節點數以前,會先序列化到磁盤中,而後纔會加載到內存中。node

     ZooKeeper中的每一個節點存儲的數據要被原子性的操做。也就是說讀操做將獲取與節點相關的全部數據,寫操做也將替換掉節點的全部數據。另外,每個節點都擁有本身的ACL(訪問控制列表),這個列表規定了用戶的權限,即限定了特定用戶對目標節點能夠執行的操做。apache

2.引用zookeeper庫

       這兒用的是maven管理方式,pom.xml的配置:編程

<dependencies>
  <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.3</version>
      <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
         </exclusion>
         <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
            </exclusions>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.2</version>
    </dependency>
</dependencies>

3. zookeeper客戶端API的一些簡介

  Zookeeper API共包含五個包,分別爲:api

  (1)org.apache.zookeeper服務器

  (2)org.apache.zookeeper.datasession

  (3)org.apache.zookeeper.server異步

  (4)org.apache.zookeeper.server.quorummaven

  (5)org.apache.zookeeper.server.upgrade函數

       其中org.apache.zookeeper,包含Zookeeper類,他是咱們編程時最經常使用的類文件。這個類是Zookeeper客戶端的主要類文件。若是要使用Zookeeper服務,應用程序首先必須建立一個Zookeeper實例,這時就須要使用此類。一旦客戶端和Zookeeper服務創建起了鏈接,Zookeeper系統將會給次鏈接會話分配一個ID值,而且客戶端將會週期性的向服務器端發送心跳來維持會話鏈接。只要鏈接有效,客戶端就可使用Zookeeper API來作相應處理了。

4. zookeeper的java ApI詳解

4.1 鏈接zookeeper服務器

 public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

       參數說明

      connectString:zookeeper server列表, 以逗號隔開. ZooKeeper對象初始化後, 將從server列表中選擇一個server, 並嘗試與其創建鏈接. 若是鏈接創建失敗, 則會從列表的剩餘項中選擇一個server, 並再次嘗試創建鏈接。

      sessionTimeout:指定鏈接的超時時間。

      watcher:一個 watcher 實例。

       注意, 建立ZooKeeper對象時, 只要對象完成初始化便馬上返回. 創建鏈接是以異步的形式進行的, 當鏈接成功創建後, 會回調watcher的process方法. 若是想要同步創建與server的鏈接, 須要本身進一步封裝。通常咱們建立完Zookeeper以後,直接等着其鏈接好了以後,在watcher的process方法裏面讓主函數結束等待。

4.2 建立znode(zk節點)

public String create(final String path, byte data[], List<ACL> acl,
CreateMode createMode)

     參數說明

        path:znode的路徑,必須是絕對路徑。

        data:與znode關聯的數據。

        acl:指定權限信息, 若是不想指定權限, 能夠傳入Ids.OPEN_ACL_UNSAFE。

       createMode:指定znode類型. CreateMode是一個枚舉類, 從中選擇一個成員傳入便可。

createMode的可選的成員類型

PERSISTENT:建立後只要不刪就永久存在

EPHEMERAL:會話結束年結點自動被刪除,EPHEMERAL結點不容許有子節點

SEQUENTIAL:節點名末尾會自動追加一個10位數的單調遞增的序號,同一個節點的全部子節點序號是單調遞增的

PERSISTENT_SEQUENTIAL:結合PERSISTENT和SEQUENTIAL

EPHEMERAL_SEQUENTIAL:結合EPHEMERAL和SEQUENTIAL

4.3 刪除znode節點

    public void delete(final String path, int version)

      參數說明

            path:znode的路徑,必須是絕對路徑。

           version:指定要刪除的數據的版本, 若是version和真實的版本不一樣, 刪除操做將失敗. 指定version爲-1則忽略版本檢查.

4.4 更新znode節點中的數據

   public Stat setData(final String path, byte data[], int version)

      參數說明

            path:znode的路徑,必須是絕對路徑。

           data:要設置的到znode的數據,注意數據是直接清空原來的數據,而後寫新的數據,且數據的大小不能超過1MB。

           version:指定要更新的數據的版本, 若是version和真實的版本不一樣, 更新操做將失敗. 指定version爲-1則忽略版本檢查。

4.5 判斷znode是否存在

    public Stat exists(final String path, Watcher watcher)

      參數說明

            path:znode的路徑,必須是絕對路徑。

           watcher:一個 watcher 實例。

         若是該node存在, 則返回該node的狀態信息, 不然返回null.

public Stat exists(String path, boolean watch)

        其他和上面都同樣,就是boolean的若是爲true,表示要用watcher,這時的watcher是初始化zookeeper時候指定的watcher

4.6獲取znode節點的子節點列表 

    public List<String> getChildren(final String path, Watcher watcher)

      參數說明

            path:znode的路徑,必須是絕對路徑。

           watcher:一個 watcher 實例。

     若是有child存在,就返回child,若是沒有的話,就會返回null

   public List<String> getChildren(String path, boolean watch)

        其他和上面都同樣,就是boolean的若是爲true,表示要用watcher,這時的watcher是初始化zookeeper時候指定的watcher

4.7獲取znode節點的數據 

     public byte[] getData(final String path, Watcher watcher, Stat stat)

      參數說明

            path:znode的路徑,必須是絕對路徑。          

           watch:用於指定是否監聽path node的刪除事件, 以及數據更新事件注意, 不監聽path node的建立事件, 由於若是path node不存在, 該方法將拋出KeeperException.NoNodeException異常.

           stat:是個傳出參數, getData方法會將path node的狀態信息設置到該參數中.

public byte[] getData(String path, boolean watch, Stat stat)

            其他和上面都同樣,就是boolean的若是爲true,表示要用watcher,這時的watcher是初始化zookeeper時候指定的watcher。


總結:這幾個是最經常使用的API,熟悉了以後,基本95%多的工做均可以經過這個解決,其他的後面的API若是用到能夠查文檔。

相關文章
相關標籤/搜索