005_Java操作ZooKeeper
1. ZooKeeper的JavaClient是我們更輕松的去對(duì)ZooKeeper進(jìn)行各種操作。我們僅需要引入zookeeper-3.7.0.jar和zookeeper-jute-3.7.0.jar兩個(gè)jar包即可。
2. 創(chuàng)建會(huì)話
2.1. 客戶端可以創(chuàng)建一個(gè)ZooKeeper實(shí)例來連接ZooKeeper服務(wù)器。
2.2. ZooKeeper構(gòu)造函數(shù)的connectString參數(shù), 連接服務(wù)器列表, 使用,分割多個(gè)服務(wù)器地址。
2.3. ZooKeeper構(gòu)造函數(shù)的sessionTimeout參數(shù), 心跳檢測時(shí)間周期, 以毫秒為單位。
2.4. ZooKeeper構(gòu)造函數(shù)的watcher參數(shù), 事件處理通知器。
2.5. ZooKeeper客戶端和服務(wù)器會(huì)話的創(chuàng)建是一個(gè)異步的過程, 也就是說在程序中, ZooKeeper實(shí)例創(chuàng)建完成后立即返回, 但是大多數(shù)情況下我們并沒有真正構(gòu)建好一個(gè)可用會(huì)話, 在會(huì)話的生命周期處于CONNECTING時(shí)才算真正建立完畢。
3. 創(chuàng)建節(jié)點(diǎn)?
3.1. ZooKeeper提供了兩套創(chuàng)建節(jié)點(diǎn)的方法, 同步和異步創(chuàng)建節(jié)點(diǎn)方式。
3.2. 創(chuàng)建節(jié)點(diǎn)path參數(shù), 節(jié)點(diǎn)路徑, 不允許遞歸創(chuàng)建節(jié)點(diǎn)。
3.3. 創(chuàng)建節(jié)點(diǎn)data參數(shù), 節(jié)點(diǎn)內(nèi)容, 字節(jié)數(shù)組類型。
3.4. 創(chuàng)建節(jié)點(diǎn)acl參數(shù), 節(jié)點(diǎn)權(quán)限, 最簡單的值Ids.OPEN_ACL_UNSAFE開放權(quán)限。
3.5. 創(chuàng)建節(jié)點(diǎn)createMode參數(shù), 創(chuàng)建節(jié)點(diǎn)類型。CreateMode.PERSISTENT持久節(jié)點(diǎn); CreateMode.PERSISTENT_SEQUENTIAL持久順序節(jié)點(diǎn); CreateMode.EPHEMERAL臨時(shí)節(jié)點(diǎn); CreateMode.EPHEMERAL_SEQUENTIAL臨時(shí)順序節(jié)點(diǎn)。
3.6. 創(chuàng)建節(jié)點(diǎn)Create2Callback參數(shù), 注冊(cè)一個(gè)異步回調(diào)函數(shù)。rc: 服務(wù)器相應(yīng)碼, 0表示創(chuàng)建成功, -4表示端口未連接, -110表示指定節(jié)點(diǎn)存在, -112表示會(huì)話過期。path: 接口調(diào)用時(shí)傳入API的數(shù)據(jù)節(jié)點(diǎn)的路徑參數(shù)。xtx: 為接口傳入API的上下文參數(shù)值。name: 實(shí)際在服務(wù)器端創(chuàng)建節(jié)點(diǎn)的名稱。stat: 節(jié)點(diǎn)屬性信息。
3.7. 創(chuàng)建節(jié)點(diǎn)ctx參數(shù), 為接口調(diào)用傳入上下文參數(shù)。
4. 創(chuàng)建節(jié)點(diǎn)例子
4.1. 新建一個(gè)名為zookeeper的Java項(xiàng)目, 同時(shí)拷入相關(guān)jar包
4.2. 創(chuàng)建Create.java
package com.zk.rm;import java.io.IOException; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.AsyncCallback.Create2Callback; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat;public class Create {private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";private static final CountDownLatch cdl = new CountDownLatch(1);public static void main(String[] args) {try {// 創(chuàng)建連接ZooKeeper zk = new ZooKeeper(connectString, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected == event.getState()) {// 剛剛連接成功, 沒有事件if(EventType.None == event.getType()) {// 如果建立連接成功, 發(fā)送信號(hào)量, 讓后續(xù)阻塞程序能夠繼續(xù)向下執(zhí)行cdl.countDown();System.out.println("建立連接成功了。");} }}});// 進(jìn)行阻塞cdl.await();// 創(chuàng)建父節(jié)點(diǎn)String ret = zk.create("/myRoot", "創(chuàng)建了一個(gè)我的根節(jié)點(diǎn)。".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(System.currentTimeMillis() + " " + ret);// 異步創(chuàng)建子節(jié)點(diǎn)zk.create("/myRoot/child1", "根節(jié)點(diǎn)上創(chuàng)建了一個(gè)child1的子節(jié)點(diǎn)".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL, new Create2Callback() {@Overridepublic void processResult(int rc, String path, Object ctx, String name, Stat stat) {System.out.println("rc = " + rc + ", path = " + path + ", ctx = " + ctx + ", name = " + name);}}, "/myRoot/child1下文參數(shù)");zk.create("/myRoot/child2", "根節(jié)點(diǎn)上創(chuàng)建了一個(gè)child2的子節(jié)點(diǎn)".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new Create2Callback() {@Overridepublic void processResult(int rc, String path, Object ctx, String name, Stat stat) {System.out.println("rc = " + rc + ", path = " + path + ", ctx = " + ctx + ", name = " + name);}}, "/myRoot/child2下文參數(shù)");// 關(guān)閉連接zk.close();} catch (InterruptedException | IOException | KeeperException e) {e.printStackTrace();}} }4.3. 運(yùn)行結(jié)果
5. 刪除節(jié)點(diǎn)
5.1. delete刪除節(jié)點(diǎn)也有同步刪除和異步刪除兩套API。
5.2. 刪除節(jié)點(diǎn)path參數(shù), 節(jié)點(diǎn)名稱。
5.3. 刪除節(jié)點(diǎn)version參數(shù), 版本號(hào), -1跳過版本檢查。
5.4. 刪除節(jié)點(diǎn)cb參數(shù), 一個(gè)異步回調(diào)函數(shù)。
5.5. 刪除節(jié)點(diǎn)ctx參數(shù), 用于傳遞上下文信息的對(duì)象。
5.6. 在ZooKeeper中, 只允許刪除葉子節(jié)點(diǎn)信息, 也就是說如果節(jié)點(diǎn)下還有子孫節(jié)點(diǎn), 必須刪除所有子孫節(jié)點(diǎn)才能刪除該節(jié)點(diǎn)。
6. 檢查節(jié)點(diǎn)是否存在
6.1. exists檢查節(jié)點(diǎn)是否存在方法也有同步檢查和異步檢查兩套API。
6.2. 檢查節(jié)點(diǎn)是否存在path參數(shù), 節(jié)點(diǎn)名稱。
6.3. 檢查節(jié)點(diǎn)是否存在watch參數(shù), 注冊(cè)一個(gè)監(jiān)聽對(duì)象。
6.4. 檢查節(jié)點(diǎn)是否存在cb參數(shù), 一個(gè)異步回調(diào)函數(shù)。
6.5. 檢查節(jié)點(diǎn)是否存在ctx參數(shù), 用于傳遞上下文信息的對(duì)象。
7. 刪除和檢查節(jié)點(diǎn)是否存在例子
7.1. 創(chuàng)建ExistsDelete.java
package com.zk.rm;import java.io.IOException; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.AsyncCallback.VoidCallback; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooKeeper;public class ExistsDelete {private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";private static final CountDownLatch cdl = new CountDownLatch(1);public static void main(String[] args) {try {ZooKeeper zk = new ZooKeeper(connectString, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected == event.getState()) {if(EventType.None == event.getType()) {// 如果建立連接成功, 發(fā)送信號(hào)量, 讓后續(xù)阻塞程序能夠繼續(xù)向下執(zhí)行cdl.countDown();System.out.println("建立連接成功了。");}}}});// 進(jìn)行阻塞cdl.await();if(zk.exists("/myRoot", null) != null) {// 同步刪除方法// zk.delete("/myRoot", -1);// 異步刪除方法zk.delete("/myRoot", -1, new VoidCallback() {@Overridepublic void processResult(int rc, String path, Object ctx) {System.out.println("rc = " + rc + ", path = " + path + ", ctx = " + ctx);}}, "delete /myRoot上下文參數(shù)");}zk.close();} catch (InterruptedException | IOException | KeeperException e) {e.printStackTrace();}} }7.2. 運(yùn)行結(jié)果
8. 獲取子節(jié)點(diǎn)例子
8.1. 創(chuàng)建GetChildren.java
package com.zk.rm;import java.io.IOException; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooKeeper;public class GetChildren {private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";private static final CountDownLatch cdl = new CountDownLatch(1);public static void main(String[] args) {try {ZooKeeper zk = new ZooKeeper(connectString, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected == event.getState()) {// 剛剛連接成功, 沒有事件if(EventType.None == event.getType()) {// 如果建立連接成功, 發(fā)送信號(hào)量, 讓后續(xù)阻塞程序能夠繼續(xù)向下執(zhí)行cdl.countDown();System.out.println("建立連接成功了。");}}}});// 進(jìn)行阻塞cdl.await();// 獲取子節(jié)點(diǎn)List<String> children = zk.getChildren("/", false);for (String child : children) {System.out.println(child);}zk.close();} catch (InterruptedException | IOException | KeeperException e) {e.printStackTrace();}} }8.2. 運(yùn)行結(jié)果
9. 設(shè)置和獲取節(jié)點(diǎn)例子
9.1. 創(chuàng)建GetSetData.java
package com.zk.rm;import java.io.IOException; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat;public class GetSetData {private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";private static final CountDownLatch cdl = new CountDownLatch(1);public static void main(String[] args) {try {ZooKeeper zk = new ZooKeeper(connectString, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected == event.getState()) {if(EventType.None == event.getType()) {// 如果建立連接成功, 發(fā)送信號(hào)量, 讓后續(xù)阻塞程序能夠繼續(xù)向下執(zhí)行cdl.countDown();System.out.println("建立連接成功了。");}}}});// 進(jìn)行阻塞cdl.await();// 獲取節(jié)點(diǎn)byte[] data = zk.getData("/myRoot", false, null);System.out.println("根節(jié)點(diǎn)數(shù)據(jù): " + new String(data));Stat stat = zk.setData("/myRoot", "modify data".getBytes(), -1);System.out.println("czxid: " + stat.getCzxid() + ", ctime: " + stat.getCtime() + ", cversion: " + stat.getCversion());System.out.println("mzxid: " + stat.getMzxid() + ", mtime: " + stat.getMtime() + ", pzxid: " + stat.getPzxid());System.out.println("version: " + stat.getVersion() + ", dataLength: " + stat.getDataLength() + ", aversion: " + stat.getAversion());System.out.println("numChildren: "+ stat.getNumChildren() + ", ephemeralOwner: " + stat.getEphemeralOwner());zk.close();} catch (InterruptedException | IOException | KeeperException e) {e.printStackTrace();}} }9.2. 運(yùn)行結(jié)果
10. watch事件
10.1. ZooKeeper的watch事件監(jiān)聽節(jié)點(diǎn)的變化, 當(dāng)節(jié)點(diǎn)發(fā)生變化時(shí), 通知注冊(cè)了監(jiān)聽的客戶端。
10.2. 事件類型: EventType.NodeCreated創(chuàng)建節(jié)點(diǎn); EventType.NodeDataChanged節(jié)點(diǎn)數(shù)據(jù)發(fā)生變化; EventType.NodeChildrenChanged子節(jié)點(diǎn)發(fā)生變化; EventType.NodeDeleted刪除節(jié)點(diǎn)。
10.3. 狀態(tài)類型: KeeperState.SyncConnected建立連接成功; KeeperState.Disconnected未連接; KeeperState.AuthFailed認(rèn)證失敗; KeeperState.Expired連接過期。
11. watch事件例子
11.1.?創(chuàng)建Watch.java
package com.zk.rm;import java.io.IOException; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.AddWatchMode; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper;public class Watch {private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";private static final CountDownLatch cdl = new CountDownLatch(1);private static ZooKeeper zk;public static void main(String[] args) {try {zk = new ZooKeeper(connectString, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected == event.getState()) {try {if(EventType.None == event.getType()) {// 如果建立連接成功, 發(fā)送信號(hào)量, 讓后續(xù)阻塞程序能夠繼續(xù)向下執(zhí)行cdl.countDown();System.out.println("建立連接成功了。");} else if (EventType.NodeDataChanged == event.getType()) {System.out.println("data = " + new String(zk.getData("/myRoot", false, null)));} else if (EventType.NodeChildrenChanged == event.getType()) {System.out.println("allChildrenNumber = "+ zk.getAllChildrenNumber("/myRoot"));} else if (EventType.NodeCreated == event.getType()) {System.out.println("創(chuàng)建節(jié)點(diǎn)");} else if (EventType.NodeDeleted == event.getType()) {System.out.println("刪除節(jié)點(diǎn)");}} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}}});// 進(jìn)行阻塞cdl.await();// 添加節(jié)點(diǎn)監(jiān)聽zk.addWatch("/myRoot", AddWatchMode.PERSISTENT_RECURSIVE);String childRet2 = zk.create("/myRoot/child2", "根節(jié)點(diǎn)上創(chuàng)建了一個(gè)child2的子節(jié)點(diǎn)".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(childRet2);zk.setData("/myRoot", "修改/myRoot節(jié)點(diǎn)數(shù)據(jù)".getBytes(), -1);zk.delete("/myRoot/child2", -1);Thread.sleep(60000);zk.close();} catch (KeeperException | IOException | InterruptedException e) {e.printStackTrace();}} }11.2. 運(yùn)行結(jié)果
12. ACL例子
12.1. 創(chuàng)建AccessControlList.java
package com.zk.rm;import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.Watcher.Event.KeeperState; import org.apache.zookeeper.ZooDefs.Perms; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Id; import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;public class AccessControlList {private static final String connectString = "192.168.25.133:2181,192.168.25.135:2181,192.168.25.138:2181";private static final CountDownLatch cdl = new CountDownLatch(1);public static void main(String[] args) {try {ZooKeeper zk = new ZooKeeper(connectString, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected == event.getState()) {if(EventType.None == event.getType()) {// 如果建立連接成功, 發(fā)送信號(hào)量, 讓后續(xù)阻塞程序能夠繼續(xù)向下執(zhí)行cdl.countDown();System.out.println("建立連接成功了。");}}}});// 進(jìn)行阻塞cdl.await();List<ACL> acls = new ArrayList<ACL>();Id id1 = new Id("digest", DigestAuthenticationProvider.generateDigest("zs:123456"));ACL acl = new ACL(Perms.ALL, id1);acls.add(acl);String rt = zk.create("/myRoot", "my root data".getBytes(), acls, CreateMode.PERSISTENT);System.out.println(rt);zk.addAuthInfo("digest", "zs:123456".getBytes());System.out.println(new String(zk.getData("/myRoot", null, null)));zk.close();} catch (KeeperException | IOException | InterruptedException | NoSuchAlgorithmException e) {e.printStackTrace();}} }12.2. 運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的005_Java操作ZooKeeper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 004_ZooKeeper客户端基础命令
- 下一篇: 012_Java操作FastDFS