zookeeper动态上下线感知系统

需求---->
某分布式系统当中,祝节点有多台,可以进行动态上下线,当有任何一台机器发生了动态的上下线,任何一台客户端都能感知得到。

思路---->
1、创建客户端与服务端
2、启动client 监听
3、启动server 注册
4、当server端 发生上下线
5、client都能感知的到


public class ZKServer{
	public static void main(String[] args){
		ZKServer zkServer = new ZKServer();
		//1、连接zkServer
		zkServer.getConnect();

		//2、注册节点信息 服务器IP添加到zk中
		zkServer.regist(args[0]);

		//3、业务逻辑处理
		zkServer.bulid(args[0])
	}

	private String connectString="ip1:2181,ip2:2181,ip3:2181";
	private int sessionTimeout = 3000;
	ZooKeeper zkCli = null;
	//定义父jiedian
	private String parentNode = "/servers";

	//连接zkServer
	public void getConnect() throws Exception{

		zkCli = new ZooKeeper(connectString,sessionTimeout,new Watcher(){
			@Override
			public void process(WatchedEvent event){

			}
		});
	}

	//注册信息
	public void regist(String hostname){
		zkCli.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println(node);
	}

	//构造服务器
	public void build(String hostname) throws InterruptException{
		System.out.println(hostname+":服务器上线了");

		Thread.sleep(Long.MAX_VALUE);
	}
}
//客户端
public class ZkClient{
	main{
		//1、获取链接
		ZkClient zkClient = new ZkClient();
		zkClient.getConnetc();

		//2、监听服务的节点信息
		zkClient.getServers();

		//3、业务逻辑(一直监听)
		zkClient.getWatch();
	}
	private String connectString="ip1:2181,ip2:2181,ip3:2181";
	private int sessionTimeout = 3000;
	ZooKeeper zkCli;

	public void getConnetc() throws KeeperException, InterruptException {
		zkCli = new ZooKeeper(connectString,sessionTimeout,new Watcher(){
			@Override
			public void process(WatchedEvent event){
				List<String> children ;
				try{
					//监听父节点
					children = zkCli.getChildren("/servers", true);

					//创建集合存储服务器列表
					ArrayList<String> serverList = new ArrayList<String>();

					//获取每个节点的数据
					for(String c: children){
						byte[] data = zkCli.getData("/servers"+c, true, null);
						serverList.add(new String(data));
					}

					//打印服务器列表
					System.out.println(serverList);

				}catch(Excepetion e){
					e.printStackTrace();
				}
				
			}
		});
	}

	public void getServers(){
		List<String> chidren = zkCli.getChildren("/servers", true);

		//创建集合存储服务器列表
		ArrayList<String> serverList = new ArrayList<String>();

		//获取每个节点的数据
		for(String c: children){
			byte[] data = zkCli.getData("/servers"+c, true, null);
			serverList.add(new String(data));
		}
		//打印服务器列表
		System.out.println(serverList);
	}

	public void getWatch() throws InterruptException{
		Thread.sleep(Long.MAX_VALUE);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42898914/article/details/85013847