客户端能够实时洞察到服务器上下线变化。
创建节点:
create /servers "servers"
服务端注册:
public class DistributeServer {
private String connectString = "192.168.0.1:2181,192.168.0.2:2181";
private int sessionTimeout = 2000;
ZooKeeper zk;
private void getConnect() {
zk = new ZooKeeper(connectString,sessionTimeout,new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
private void regist(String hostname) {
String create = zk.create("/servers/"+hostname,hostname.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
sout(hostname+" is online");
}
public static void main(String[] args) {
DistributeServer server = new DistributeServer();
// 1 获取zk连接
server.getConnect();
// 2 注册服务器到zk集群
server.regist(args[0]);
// 3 启动业务逻辑
// ...
}
}
客户端监听:
public class DistributeClient {
private String connectString = "192.168.0.1:2181,192.168.0.2:2181";
private int sessionTimeout = 2000;
ZooKeeper zk;
private void getConnect() {
zk = new ZooKeeper(connectString,sessionTimeout,new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
getServerList();
}
});
}
private void getServerList(String hostname) {
List<String> children = zk.getChildren("/servers",true);
ArrayList<String> servers = new ArrayList<>();
for (String child : children) {
byte[] data = zk.getData("/servers/"+child,false,null);
servers.add(new String(data));
}
sout(servers);
}
public static void main(String[] args) {
DistributeClient client= new DistributeClient();
// 1 获取zk连接
client.getServerList();
// 2 监听/servers下面子节点的增加和删除
client.regist(args[0]);
// 3 启动业务逻辑
// ...
}
}
测试:
(1)启动DistributeClient。
在客户端命令行执行:
# 创建临时带序号节点
create -e -s /servers/server1 "server1"
create -e -s /servers/server2 "server2"
(2)启动DistributeClient,之后启动DistributeServer。