当前位置: 首页 > news >正文

ZooKeeper 服务器动态上下线监听案例

1. 需求

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


2. 需求分析

核心流程

  1. 服务端启动时去注册信息(创建都是临时节点)
  2. 客户端获取到当前在线服务器列表,并且注册监听
  3. 服务器节点下线(临时节点自动删除)
  4. 客户端收到服务器节点上下线事件通知,重新获取服务器列表

3. 具体实现

3.1 先在集群上创建/servers节点

[zk:localhost:2181(CONNECTED)10]create /servers"servers"Created /servers

3.2 在Idea中创建包名

com.atguigu.zkcase1

3.3 服务器端向Zookeeper注册代码

packagecom.atguigu.zkcase1;importjava.io.IOException;importorg.apache.zookeeper.CreateMode;importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.ZooDefs.Ids;publicclassDistributeServer{privatestaticStringconnectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";privatestaticintsessionTimeout=2000;privateZooKeeperzk=null;privateStringparentNode="/servers";// 创建到zk的客户端连接publicvoidgetConnect()throwsIOException{zk=newZooKeeper(connectString,sessionTimeout,newWatcher(){@Overridepublicvoidprocess(WatchedEventevent){}});}// 注册服务器publicvoidregistServer(Stringhostname)throwsException{Stringcreate=zk.create(parentNode+"/server",hostname.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname+" is online "+create);}// 业务功能publicvoidbusiness(Stringhostname)throwsException{System.out.println(hostname+" is working ...");Thread.sleep(Long.MAX_VALUE);}publicstaticvoidmain(String[]args)throwsException{// 1 获取zk连接DistributeServerserver=newDistributeServer();server.getConnect();// 2 利用zk连接注册服务器信息server.registServer(args[0]);// 3 启动业务功能server.business(args[0]);}}

3.4 客户端代码

packagecom.atguigu.zkcase1;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooKeeper;publicclassDistributeClient{privatestaticStringconnectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";privatestaticintsessionTimeout=2000;privateZooKeeperzk=null;privateStringparentNode="/servers";// 创建到zk的客户端连接publicvoidgetConnect()throwsIOException{zk=newZooKeeper(connectString,sessionTimeout,newWatcher(){@Overridepublicvoidprocess(WatchedEventevent){// 再次启动监听try{getServerList();}catch(Exceptione){e.printStackTrace();}}});}// 获取服务器列表信息publicvoidgetServerList()throwsException{// 1 获取服务器子节点信息,并且对父节点进行监听List<String>children=zk.getChildren(parentNode,true);// 2 存储服务器信息列表ArrayList<String>servers=newArrayList<>();// 3 遍历所有节点,获取节点中的主机名称信息for(Stringchild:children){byte[]data=zk.getData(parentNode+"/"+child,false,null);servers.add(newString(data));}// 4 打印服务器列表信息System.out.println(servers);}// 业务功能publicvoidbusiness()throwsException{System.out.println("client is working ...");Thread.sleep(Long.MAX_VALUE);}publicstaticvoidmain(String[]args)throwsException{// 1 获取zk连接DistributeClientclient=newDistributeClient();client.getConnect();// 2 获取servers的子节点信息,从中获取服务器信息列表client.getServerList();// 3 业务进程启动client.business();}}

4. 测试

4.1 在Linux命令行上操作增加减少服务器

(1) 启动DistributeClient客户端

(2) 在hadoop102上zk的客户端/servers目录上创建临时带序号节点

[zk:localhost:2181(CONNECTED)5]create-e-s/servers/hadoop102"hadoop102"Created /servers/hadoop1020000000000[zk:localhost:2181(CONNECTED)6]create-e-s/servers/hadoop103"hadoop103"Created /servers/hadoop1030000000001

(3) 观察Idea控制台变化

[hadoop102, hadoop103]

(4) 执行删除操作

[zk:localhost:2181(CONNECTED)8]delete /servers/hadoop1020000000000

(5) 观察Idea控制台变化

[hadoop103]

4.2 在Idea上操作增加减少服务器

(1) 启动DistributeClient客户端(如果已经启动过,不需要重启)

(2) 启动DistributeServer服务

  1. 点击Edit Configurations…

  1. 在弹出的窗口中(Program arguments)输入想启动的主机,例如,hadoop102

  1. 回到DistributeServer的main方法,右键,在弹出的窗口中点击Run

  1. 观察DistributeServer控制台,提示hadoop102 is working

  2. 观察DistributeClient控制台,提示hadoop102已经上线


总结

角色核心功能关键代码
DistributeServer向Zookeeper注册临时节点zk.create(..., CreateMode.EPHEMERAL_SEQUENTIAL)
DistributeClient监听/servers子节点变化,获取服务器列表zk.getChildren(parentNode, true)
临时节点特性服务器断开连接后节点自动删除,客户端收到通知EPHEMERAL_SEQUENTIAL
Watch机制节点变化触发回调,重新获取列表process()中调用getServerList()
http://www.rkmt.cn/news/1461396.html

相关文章:

  • 2026 甄选建站工具,开发微信小程序用什么软件 - FaiscoJeff
  • 实战应用:基于快马平台快速开发可部署的内网服务监控仪表板
  • 基于Arduino Uno的复古街机DIY:从电路设计到游戏开发全流程
  • 高效Windows APK安装器:无需模拟器的Android应用安装解决方案
  • 2026年中国建筑照明优质企业TOP3盘点:头部总部照明服务商选品指南
  • Zotero Style插件版本兼容性深度解析:从4.4.0到4.5.8的升级之路
  • 2026 年 6 月二建考前刷题实测:考点精准 + 解析专业才是提分关键 - 讲清楚了
  • 基于CD4007芯片的AM发射器制作:从原理到实践搭建微型电台
  • 2026青岛留学机构排名:八家优选本地化服务高性价比TOP榜 - 速递信息
  • 2026年送朋友保温杯推荐:五家优选品牌全面评测 - 科技焦点
  • 一个人,300个店,零封号:我写了一套店群自动化软件,把运营成本打下来了
  • 如何用深度学习解决城市交通流量预测难题
  • 一个人写了一套店群矩阵自动化软件:我是如何把繁琐切号流程彻底干掉的
  • ControlNet-v1-1 FP16模型完全指南:如何轻松掌握AI绘画控制技术
  • 银泰百货卡回收转让规则与5种认可方式 - 淘淘收小程序
  • 申论对策题万能公式:掌握这5个维度,轻松解决推对策难题
  • 如何用歌词滚动姬快速制作专业级LRC歌词文件?
  • 终极解决方案:3分钟在Windows上安装Dlib预编译包,告别复杂编译环境
  • 利用OpenWrt与Debian套娃方案,将旧路由器改造为本地IP摄像头NVR
  • 2026广州除四害公司口碑排名榜,选对靠谱不吃亏 - 资讯速览
  • 绍兴市GEO公司哪家好|2026绍兴优质GEO服务商TOP3权威榜单发布 - 浙江稻盛和夫
  • 从一次网络故障排查说起:我是如何通过分析PPTP的GRE报文,定位到那个诡异的隧道断开问题的
  • 基于树莓派与SANE打造独立扫描仪:低成本实现文档数字化
  • 基于40106与555芯片的科幻射线枪声光特效系统设计与实现
  • Linux命令:userdel
  • 终极指南:如何用obs-backgroundremoval插件免费实现专业级虚拟背景效果
  • 全屋智能解决方案深度盘点:主流套系主动智能全景解析 - 资讯焦点
  • UVa 384 Slurpys
  • 【Agent实战】Agent Skills 深度解析:从原理到落地的完整指南
  • 看完就会:2026年闭眼可入的专业AI论文网站