環境搭建
- 創建一個普通的Maven項目
- 導入log4j.properties日志文件到項目的根目錄或者resource文件下。
-
在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>
- 除了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) { } });
連接成功:

【注意】
- 在字符串中,兩段千萬不能加空格,否則就會報錯
- 如果在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的類型有:持久節點、持久有序號的節點、短暫節點、短暫有序號的節點

創建節點
-
創建 持久不帶序號節點
@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); }
持久化節點創建成功:


-
創建 持久帶序號的節點:
@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); }
創建成功:


-
創建 短暫不帶序號節點:
@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); }

-
創建 短暫帶序號節點
創建短暫帶序號節點就可以參照創建持久帶序號節點完成了,只需要將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); }
刪除成功:



