Zookeeper的Java API操作(一)


環境搭建

  1. 創建一個普通的Maven項目
  2. 導入log4j.properties日志文件到項目的根目錄或者resource文件下。
  3. 在pom.xml中 添加Zookeeper的相關依賴
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!--junit單元測試-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
        <scope>runtime</scope>
    </dependency>
  4. 除了maven的項目依賴,還可以通過導入Zookeeper相關jar包部署Zookeeper環境。Zookeeper所需要的的jar包如下:
  • ZOOKEEPER_HOME目錄:

    zookeeper-3.5.7.jar

  • ZOOKEEPER_HOME/lib目錄:

    jline-0.9.94.jar、

    log4j-1.2.16.jar、

    netty-3.10.5.Final.jar、

    slf4j-api-1.6.1.jar、

    slf4j-log4j12-1.6.1.jar

    將上述jar包拷貝到工程的lib目錄。並build一下,導入工程。

API操作Zookeeper

環境搭建完成之后,就可以使用Java代碼來操作Zookeeper啦!第一步當然是連接Zookeeper了。

連接Zookeeper

前言

Java API連接Zookeeper只需要一步:即創建Zookeeper對象

首先進入到Zookeeper類中可以看到:

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException {
    this(connectString, sessionTimeout, watcher, false);
}

創建Zookeeper對象需要傳入三個參數:

  • connectString:連接的地址,包括主機名和端口號。
  • sessionTimeout:表示Zookeeper等待客戶端通信的最長時間,客戶端如果超過這個時間沒有和服務端進行通信,那么就認為該客戶端已終止,一般設置值5~10s。單位是毫秒。
  • watcher:監聽器。用於接收會話事件的接口,需要自己定義,實現process()方法。

有了上述基礎之后,就可以連接Zookeeper了!

連接Zookeeper

Zookeeper zkClient = "";
String connectStr = "node1:2181,node2:2181,node3:2181";
zkClient = new ZooKeeper(connectStr, 2000, new Watcher() {
    @Override
    public void process(WatchedEvent watchedEvent) { }
});

連接成功:

【注意】

  1. 字符串中,兩段千萬不能加空格,否則就會報錯
  2. 如果在Windows上也想使用node1,node2,node3主機名來代替輸入主機ip,那么我們必須在Windows本地配置主機ip映射。Windows配置主機映射目錄C:\Windows\System32\drivers\etc\hosts。只需要在該文件下添加 "ip 主機名"字段即可。

    此時在Windows命令行就可以實現直接ping主機名了。

創建節點

前言

創建節點所需要的方法是create()。此處需要傳入四個參數:

public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException {}

其中四個參數代表的含義是:

  • String path:節點路徑
  • byte[] data,:節點數據---字節數組
  • List<ACL> acl:節點權限
  • CreateMode createMode:節點類型

其中,設置文件權限的基本參數解讀如下:

(1) OPEN_ACL_UNSAFE :完全開放。 事實上這里是采用了world驗證模式,由於每個zk連接都有world驗證模式,所以znode在設置了 OPEN_ACL_UNSAFE 時,是對所有的連接開放。

(2) CREATOR_ALL_ACL :給創建該znode連接所有權限。 事實上這里是采用了auth驗證模式,使用sessionID做驗證。所以設置了 CREATOR_ALL_ACL 時,創建該znode的連接可以對該znode做任何修改。

(3) READ_ACL_UNSAFE :所有的客戶端都可讀。 事實上這里是采用了world驗證模式,由於每個zk連接都有world驗證模式,所以znode在設置了READ_ACL_UNSAFE時,所有的連接都可以讀該znode。

設置文件類型的基本參數解讀如下:

觀察CreateMode源碼可以發現CreateMode是一個枚舉類。 創建Node的類型有:持久節點、持久有序號的節點、短暫節點、短暫有序號的節點

創建節點

  1. 創建 持久不帶序號節點
    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISENT);
        System.out.println(node);
    }

    持久化節點創建成功:

  2. 創建 持久帶序號的節點:
    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient1", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISENT_SEQUENTIAL);
        System.out.println(node);
    } 

    創建成功:

  3. 創建 短暫不帶序號節點:
    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient2", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println(node);
    } 

    創建成功:

    注意】創建成功后在主機查看卻發現沒有/javaClient2這個節點。因為在Java運行結束之后,客戶端服務就關閉了,此時臨時節點已經刪除,再去查看的時候已經沒有了。此時可以通過設置一個線程睡眠時間,就可以在睡眠時間內另一台客戶端看到文件。

    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient3", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println(node);
        Thread.sleep(10000);
    } 

  4. 創建 短暫帶序號節點

    創建短暫帶序號節點就可以參照創建持久帶序號節點完成了,只需要將CreateMode的值設為 "EPHEMERAL_SEQUENTIAL"即可

刪除節點

前言

刪除節點可以使用Zookeeper中的delete()方法

public void delete(String path, int version) throws InterruptedException, KeeperException {}

兩個參數:第一個是刪除的節點路徑,第二個是要刪除節點的版本號版本號可以通過ls -s path查看節點詳情信息,cversion即是對應的版本值

如果寫的版本不正確,將會報如下錯誤:

注意】delete方法是用來刪除單個節點的,不能進行迭代刪除。

由於此處的/test節點下還有一個子節點

如果使用delete去刪除,還會報如下錯誤:

刪除節點

public void deleteNode() throws InterruptedException, KeeperException {
    zkClient.delete("/test20000000006", 0);
}

刪除成功:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM