Zookeeper監聽伺服器節點動態上下線案例
阿新 • • 發佈:2018-12-02
需求:
某分散式系統中,主節點可以有多臺,可以動態上下線,任意一臺客戶端都能實時感知到主節點伺服器的上下線
服務端程式碼
package com.zyd.zook; import java.io.IOException; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.ZooDefs.Ids; public class ZkServer { private String connectString = "testnote01:2181,testnote02:2181,testnote03:2181"; private int sessionTimeout = 2000; private ZooKeeper zkClient; private String parentNode = "/servers"; public static void main(String[] args) throws IOException, KeeperException, InterruptedException { ZkServer server = new ZkServer(); //1 獲取連線zkServer server.getConnect(); //2 註冊伺服器節點資訊 server.regist(args[0]); //3 業務邏輯處理 server.business(args[0]); } private void business(String hostname) { System.out.println(hostname+"is online"); } private void regist(String hostname) throws KeeperException, InterruptedException { String path = zkClient.create(parentNode+"/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println(path); } private void getConnect() throws IOException { zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher(){ @Override public void process(WatchedEvent event) { } }); } }
客戶端程式碼
package com.zyd.zook; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; public class ZkClient { public static void main(String[] args) throws IOException, KeeperException, InterruptedException { ZkClient client = new ZkClient(); //1 獲取連線 client.getConnect(); //2 監聽伺服器節點路徑 client.getServerList(); //3 業務處理 client.business(); } private void business() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } //獲取伺服器列表 private void getServerList() throws KeeperException, InterruptedException { // 獲取伺服器子節點資訊,並且對父節點進行監聽 List<String> children = zkClient.getChildren(parentNode, true); //儲存伺服器列表 ArrayList<String> serverList = new ArrayList<String>(); //獲取每個節點中的資料 for (String child : children) { byte[] data = zkClient.getData("/servers"+child, false, null); } System.out.println(serverList); } private String connectString = "testnote01:2181,testnote02:2181,testnote03:2181"; private int sessionTimeout = 2000; ZooKeeper zkClient ; private String parentNode = "/servers"; private void getConnect() throws IOException { zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher(){ @Override public void process(WatchedEvent event) { try { getServerList(); } catch (KeeperException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}); } }
客戶端程式碼有問題,bug不知
Exception in thread "main" org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /serversserver0000000000 at org.apache.zookeeper.KeeperException.create(KeeperException.java:111) at org.apache.zookeeper.KeeperException.create(KeeperException.java:51) at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1212) at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:1241) at com.zyd.zook.ZkClient.getServerList(ZkClient.java:35) at com.zyd.zook.ZkClient.access$0(ZkClient.java:28) at com.zyd.zook.ZkClient$1.process(ZkClient.java:51)