Zookeeper监听服务器节点动态上下线案例

版权声明:有一种生活不去经历不知其中艰辛,有一种艰辛不去体会,不会知道其中快乐,有一种快乐,没有拥有不知其中纯粹 https://blog.csdn.net/wwwzydcom/article/details/84189650

需求:
某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线

在这里插入图片描述

服务端代码

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)

猜你喜欢

转载自blog.csdn.net/wwwzydcom/article/details/84189650