需求:

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

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

服务端代码

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)