需求:
某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线
服务端代码
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)