当前位置: 首页 > 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.jsqmd.com/news/949861/

相关文章:

  • 2026 甄选建站工具,开发微信小程序用什么软件 - FaiscoJeff
  • 基于Arduino Uno的复古街机DIY:从电路设计到游戏开发全流程
  • 实战应用:基于快马平台快速开发可部署的内网服务监控仪表板
  • 光耦隔离放大器设计:从原理到实践,实现安全信号传输
  • 高效Windows APK安装器:无需模拟器的Android应用安装解决方案
  • QMCDecode完整指南:如何在macOS上快速解密QQ音乐加密文件
  • ncmdumpGUI:3步轻松解密网易云音乐NCM文件,实现音乐自由播放
  • 2026年中国建筑照明优质企业TOP3盘点:头部总部照明服务商选品指南
  • 2026佛山包包回收排名,全品类适配,高低奢包均可优质变现 - 奢侈品回收测评
  • 2026 广州市知识产权专项资金新政全解析|发明 / 实用新型 / 外观补贴申领、费减优惠、高企加分、专精特新认定、预审加急申报指南 本土专利申报机构 TOP4 优选、补贴代办避坑全覆盖 - 资讯速览
  • Python阴影识别与修复工具集:含可运行代码、效果对比图和教学PPT
  • Zotero Style插件版本兼容性深度解析:从4.4.0到4.5.8的升级之路
  • 告别厂商私货!用OpenConfig统一管理思科、华为、Juniper网络设备的保姆级指南
  • 2026 年 6 月二建考前刷题实测:考点精准 + 解析专业才是提分关键 - 讲清楚了
  • 基于CD4007芯片的AM发射器制作:从原理到实践搭建微型电台
  • 2026青岛留学机构排名:八家优选本地化服务高性价比TOP榜 - 速递信息
  • 揭秘QQ音乐加密文件转换:qmcflac2mp3轻松突破格式限制
  • 2026年送朋友保温杯推荐:五家优选品牌全面评测 - 科技焦点
  • 一个人,300个店,零封号:我写了一套店群自动化软件,把运营成本打下来了
  • 终端美化——Zsh+Oh-my-zsh+powerlevel10k
  • 2026最新版Java面试进阶核心宝典!
  • GSE高级宏编译器:魔兽世界一键技能循环的终极解决方案
  • Visual C++运行库终极指南:一键解决Windows程序兼容性问题
  • 如何用深度学习解决城市交通流量预测难题
  • 2026 文旅展厅设计公司排行避坑攻略,文旅项目挑选设计公司行业实用参考指南 - 商业新知
  • 一个人写了一套店群矩阵自动化软件:我是如何把繁琐切号流程彻底干掉的
  • 海口同城上门收金避坑全攻略,5 家正规门店实地探店,合扬三种交易模式适配多元需求 - 开心测评
  • 如何快速创建专业H5页面:拖拽式可视化编辑器的完整教程
  • 大疆无人机固件自由:如何用DankDroneDownloader完全掌控你的设备
  • Qwen3-VL-235B-A22B-Instruct-w8a8-QuaRot 单机部署