1. 程式人生 > >Zookeeper監聽伺服器節點動態上下線案例

Zookeeper監聽伺服器節點動態上下線案例

需求:
某分散式系統中,主節點可以有多臺,可以動態上下線,任意一臺客戶端都能實時感知到主節點伺服器的上下線

在這裡插入圖片描述

服務端程式碼

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)