Zookeeper应用:服务端上下线

版权声明:有问题咨询请发邮件zengmiaogen@126.com。CSDN的留言和私信不好使。 https://blog.csdn.net/zengmingen/article/details/53186595


需求

客户端感知服务器的上下线。


示意图


步骤

服务端:

1、所有机子向Zookeeper注册,注册znode为临时的。

2、有机子下线,连接断开后被Zookeeper自动删除,触发监听事件。

3、有机子上线,触发监听事件。


客户端:

1、连接Zookeeper,获取服务器注册的znode,getchildren(),并注册监听。

2、当Zookeeper触发监听,会rpc远程调用process。

3、process调用getchildren().


服务端代码

package hello.zookeeper.schange;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class Server {

	private String connUrl = "zk1:2181,zk2:2181,zk3:2181";
	private int outTime = 1000;
	private String parentNode="/servers/";//Zookeeper先建好这个持久节点

	private ZooKeeper zk = null;

	public void getConnection() throws Exception {

		zk = new ZooKeeper(connUrl, outTime, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				System.out.println("Server Watcher:" + event.getType() + "---" + event.getPath());
			}
		});
	}

	public void registerServer(String server) throws Exception {
		String msg = zk.create(parentNode+server, server.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
		System.out.println("registerServer:" + msg);
	}

	public static void main(String[] args) throws Exception {

		String name = "server4";
		Server server = new Server();
		server.getConnection();
		server.registerServer(name);

		System.out.println(name + "----start------");

		Thread.sleep(Long.MAX_VALUE);
	}

}


客户端代码

package hello.zookeeper.schange;

import java.util.List;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;

public class Client {
	
	private String connUrl = "zk1:2181,zk2:2181,zk3:2181";
	private int outTime = 1000;
	private String parentNode="/servers";

	private ZooKeeper zk = null;

	public void getConnection() throws Exception {

		zk = new ZooKeeper(connUrl, outTime, new Watcher() {

			@Override
			public void process(WatchedEvent event) {
				System.out.println("Client Watcher:" + event.getType() + "---" + event.getPath());
				try {
					getServerList();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	
	
	public void getServerList() throws Exception{
		
		List<String> children = zk.getChildren(parentNode, true);
		if(children!=null&&children.size()>0){
			System.out.println("服务器列表如下:");
			for(String child:children){
				System.out.println(child);
			}
		}
	}
	
	
	public static void main(String[] args) throws Exception {
		Client client=new Client();
		client.getConnection();
		client.getServerList();
		
		Thread.sleep(Long.MAX_VALUE);
	}
	
	
}


运行结果

开了4台服务端,3台客户端



Zookeeper里/servers节点下有4台注册在线的服务器



客户端运行获取服务端列表



服务器下线一台,三个客户端都受到通知




-------------

更多的Java,Angular,Android大数据,J2EE,Python数据库Linux,Java架构师,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html


阅读更多

没有更多推荐了,返回首页