文章目录
服务器动态上下线监听案例
需求:
- 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。
需求分析:
- 服务器动态上下线
具体实现:
- 在集群上创建/servers 节点
[zk: localhost:2181(CONNECTED) 1] create /servers "servers"
Created /servers
- 服务器端向zookeeper注册代码
/**
* 模仿的是服务器端
* 需求是:模仿服务器上线
*
* @author wengjunwei
* @date 2023-03-16 23:53
*/
public class DistributeServer {
private static String connectString = "zookeeper02:2181,zookeeper03:2181,zookeeper04:2181";
private static int seesionTimeout = 2000;
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
// 创建zookeeper
ZooKeeper zooKeeper = new ZooKeeper(connectString, seesionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
// 注册服务到zk集群
zooKeeper.create("/servers/" + args[0], args[0].getBytes(StandardCharsets.UTF_8),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
// 睡觉
Thread.sleep(Long.MAX_VALUE);
}
}
- 客户端监听zookeeper节点代码
/**
* 模仿的是客户端
* 在客户端做监听
*
* @author wengjunwei
* @date 2023-03-17 20:53
*/
public class DistributeClient {
private static String connectString = "zookeeper02:2181,zookeeper03:2181,zookeeper04:2181";
private static int seesionTimeout = 2000;
ZooKeeper zooKeeper;
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
DistributeClient dc = new DistributeClient();
// 创建zk连接
dc.createZookeeper();
// 监听/servers下面子节点的增加和删除
dc.getServerList();
// 睡眠
Thread.sleep(Integer.MAX_VALUE);
}
private void createZookeeper() throws IOException {
zooKeeper = new ZooKeeper(connectString, seesionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
try {
getServerList();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
private void getServerList() throws KeeperException, InterruptedException {
// 开启监听
List<String> children = zooKeeper.getChildren("/servers", true);
List<String> servers = new ArrayList<>();
for (String child : children) {
byte[] data = zooKeeper.getData("/servers/" + child, false, null);
servers.add(new String(data));
}
System.out.println(servers);
}
}
- 测试
- ① 启动 DistributeClient 客户端
- ② 在 zookeeper04 上 zk 的客户端/servers 目录上创建临时带序号节点
[zk: localhost:2181(CONNECTED) 3] create -e -s /servers/zk1 "zk1"
Created /servers/zk10000000000
[zk: localhost:2181(CONNECTED) 4] create -e -s /servers/zk2 "zk2"
Created /servers/zk20000000001
- ③ 观察 Idea 控制台变化
- ④ 执行删除操作
[zk: localhost:2181(CONNECTED) 5] delete /servers/zk20000000001
- ⑤ 在 Idea 上操作增加减少服务器
(1)启动 DistributeClient 客户端(如果已经启动过,不需要重启)
(2)启动 DistributeServer 服务
①点击 modify run Configurations…
启动DistributeServer,DistributeClient会监听到zk3节点已经创建了。