表白时刻网站,价格网站,示范校建设专题网站,2023新闻大事10条服务器动态上下线监听案例
需求
在分布式系统中#xff0c;主节点可以有多台#xff0c;可以动态上下线#xff0c;任意一台客户端都能实时感知到主节点服务器的上下线。
需求分析
客户端能实时洞察到服务器上下线的变化
基本流程#xff1a;
1.服务端启动时去注册…服务器动态上下线监听案例
需求
在分布式系统中主节点可以有多台可以动态上下线任意一台客户端都能实时感知到主节点服务器的上下线。
需求分析
客户端能实时洞察到服务器上下线的变化
基本流程
1.服务端启动时去注册信息创建的都是临时节点
2.客户端获取到当前在线服务器列表并注册监听
3.当服务器节点下线
4.服务器节点上下线的通知
5.process()重新再去获取服务器列表并注册监听
具体实现
环境准备
在pom.xml添加相关依赖 dependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversionRELEASE/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.8.2/version/dependencydependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.6.1/version/dependency/dependencies1、启动zookeeper集群在集群上创建/servers节点
[rootkk01 ~]# xzk.sh start # zk集群启动脚本# 如果没有脚本使用下面命令去集群的每台机器收到启动zkServer也可以
zkServer.sh start# 进入zk客户端
[rootkk01 ~]# zkCli.sh -server# 创建servers节点
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 4] create /servers servers
Created /servers
2.服务器端向zookeeper注册代码
public class DistributeServer {private String connectString kk01:2181,kk02:2181,kk01:2181;private int sessionTimeout 2000;private ZooKeeper zk;public static void main(String[] args) {DistributeServer server new DistributeServer();try {// 1.获取zk连接server.getConnect();// 2.注册服务器到zk集群server.regist(args[0]);// 3.业务逻辑因为是演示所以睡眠即可server.business();} catch (IOException e) {e.printStackTrace();} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}private void business() throws InterruptedException {// 模拟业务逻辑Thread.sleep(Long.MAX_VALUE);}private void regist(String hostname) throws KeeperException, InterruptedException {zk.create(/servers/hostname, hostname.getBytes(),// CreateMode.EPHEMERAL_SEQUENTIAL 表示创建的是临时顺序节点ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname is online);}private void getConnect() throws IOException {zk new ZooKeeper(connectString, sessionTimeout, new Watcher() {Overridepublic void process(WatchedEvent event) {}});}
}
3.客户端获取到当前在线服务器列表并注册监听代码如下 public class DistributeClient {private String connectString kk01:2181,kk02:2181,kk01:2181;private int sessionTimeout 2000;private ZooKeeper zk;public static void main(String[] args) {DistributeClient client new DistributeClient();try {// 1.获取zk连接client.getConnect();// 2.监听 /server 下面子节点的增加和删除client.getServerList();// 3.业务逻辑因为是演示所以睡眠即可client.business();} catch (IOException e) {e.printStackTrace();} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}private void business() throws InterruptedException {// 模拟业务逻辑Thread.sleep(Long.MAX_VALUE);}private void getServerList() throws KeeperException, InterruptedException {ListString children zk.getChildren(/servers, true);ListString servers new ArrayList();for (String child : children) {byte[] data zk.getData(/servers/ child, false, null);servers.add(new String(data));}// 打印System.out.println(servers);}private void getConnect() throws IOException {zk new ZooKeeper(connectString, sessionTimeout, new Watcher() {Overridepublic void process(WatchedEvent event) {try {getServerList();} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}
}
测试
1、在Linux上zk客户端命令行增加减少服务器
1启动 DistributeClient 客户端
即在idea上运行
2在kk01上的zk客户端 /servers 目录下创建 临时带序号节点
[zk: localhost:2181(CONNECTED) 11] create -e -s /servers/hadoop100 hadoop100
Created /servers/hadoop1000000000000
[zk: localhost:2181(CONNECTED) 12] create -e -s /servers/hadoop101 hadoop101
Created /servers/hadoop1010000000001
[zk: localhost:2181(CONNECTED) 13] create -e -s /servers/hadoop103 hadoop103
Created /servers/hadoop1030000000002
[zk: localhost:2181(CONNECTED) 18] ls /servers
[hadoop1000000000000, hadoop1010000000001, hadoop1030000000002]
3观察idea控制台变化
[]
[]
[hadoop100]
[hadoop101, hadoop100][hadoop101, hadoop100, hadoop103]
4执行删除操作删除部分节点
[zk: localhost:2181(CONNECTED) 19] delete /servers/hadoop1030000000002
[zk: localhost:2181(CONNECTED) 20] ls /servers
[hadoop1000000000000, hadoop1010000000001]
5再次观察idea控制台变化
[hadoop101, hadoop100]2、在idea上操作增加减少服务器
1启动 DistributeClient客户端如果前面已经启动过了则忽略此步骤
2启动DistributeServer服务
在args[]数组传入 hadoop103
3观察idea控制台发现打印了如下信息
hadoop103 is online4在zkClient查询节点信息如下
[zk: localhost:2181(CONNECTED) 33] ls /servers
[hadoop1000000000000, hadoop1010000000001, hadoop1030000000003]