https://blog.csdn.net/USTC_Zn/article/details/54974982

主体思路:

服务器端:服务器上线、在zookeeper创建 临时的序列化结点

客户端:已启动getchildren 并注册监听 ,获取到当前在线服务器列表。

效果:

客户端能动态感知服务器上下线情况、并获取新的服务器列表

 

服务器端源码:

[java] view plaincopy
  1. package com.zn.zk1;
  2. import org.apache.zookeeper.CreateMode;
  3. import org.apache.zookeeper.WatchedEvent;
  4. import org.apache.zookeeper.Watcher;
  5. import org.apache.zookeeper.ZooDefs.Ids;
  6. import org.apache.zookeeper.ZooKeeper;
  7. public class DistributedServer {
  8. private static final String connectString = "zk01:2181,zk02:2181,zk03:2181";
  9. private static final int sessionTimeout = 2000;
  10. private static final String parentNode = "/servers";
  11. private ZooKeeper zk = null;
  12. /**
  13. * 模拟服务器上线
  14. * @param args
  15. * @throws Exception
  16. */
  17. public static void main(String[] args) throws Exception {
  18. // 获取zk连接
  19. DistributedServer server = new DistributedServer();
  20. server.getConnect();
  21. // 利用zk连接注册服务器信息
  22. server.registerServer(args[0]);
  23. // 启动业务功能
  24. server.handleBussiness(args[0]);
  25. }
  26. /**
  27. * 创建到zk的客户端连接
  28. *
  29. * @throws Exception
  30. */
  31. public void getConnect() throws Exception {
  32. zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
  33. public void process(WatchedEvent event) {
  34. // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
  35. System.out.println(event.getType() + "---" + event.getPath());
  36. try {
  37. zk.getChildren("/", true);
  38. } catch (Exception e) {
  39. }
  40. }
  41. });
  42. }
  43. /**
  44. * 向zk集群注册服务器信息
  45. *
  46. * @param hostname
  47. * @throws Exception
  48. */
  49. public void registerServer(String hostname) throws Exception {
  50. //运行时请手动创建父节点/servers
  51. //临时的临时的序列化结点
  52. String create = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  53. System.out.println(hostname + "is online.." + create);
  54. }
  55. /**
  56. * 业务功能
  57. *
  58. * @throws InterruptedException
  59. */
  60. public void handleBussiness(String hostname) throws InterruptedException {
  61. System.out.println(hostname + "start working.....");
  62. Thread.sleep(Long.MAX_VALUE);
  63. }
  64. }

-----------------------华丽的分界线---------------------

客户端源码:

[java] view plaincopy
  1. package com.zn.zk1;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.zookeeper.KeeperException;
  5. import org.apache.zookeeper.WatchedEvent;
  6. import org.apache.zookeeper.Watcher;
  7. import org.apache.zookeeper.ZooKeeper;
  8. public class DistributedClient {
  9. private static final String connectString = "zk01:2181,zk02:2181,zk03:2181";
  10. private static final int sessionTimeout = 2000;
  11. private static final String parentNode = "/servers";
  12. /** 注意:加<span style="color:#ff0000;"><strong>volatile的意义</strong></span>何在?---serverList对象在JVM堆中,多线程时会对该对象进行更改,每个线程对该对象操作会
  13. *      copy一个副本到本地线程栈,再对该对象进行修改操作,改完后,再将该对象同步到共享的堆内存中。
  14. *     被volatile修饰的对象则不会被copy到本地线程栈。所有线程看到的该对象是同一个。不会出现多线程问题。
  15. */
  16. private volatile List<String> serverList;
  17. private ZooKeeper zk = null;
  18. public static void main(String[] args) throws Exception {
  19. // 获取zk连接
  20. DistributedClient client = new DistributedClient();
  21. //创建zookeeper连接
  22. client.getConnect();
  23. // 获取servers的子节点信息(并监听),从中获取服务器信息列表
  24. client.getServerList();
  25. // 业务线程启动
  26. client.handleBussiness();
  27. }
  28. /**
  29. * 业务功能
  30. *
  31. * @throws InterruptedException
  32. */
  33. public void handleBussiness() throws InterruptedException {
  34. System.out.println("client start working.....");
  35. Thread.sleep(Long.MAX_VALUE);
  36. }
  37. /**
  38. * 创建到zk的客户端连接
  39. * @throws Exception
  40. */
  41. public void getConnect() throws Exception {
  42. zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
  43. public void process(WatchedEvent event) {
  44. // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
  45. try {
  46. //重新更新服务器列表,并且注册了监听
  47. getServerList();
  48. } catch (Exception e) {
  49. }
  50. }
  51. });
  52. }
  53. /**
  54. * 获取服务器信息列表
  55. *
  56. * @throws Exception
  57. */
  58. public void getServerList() throws Exception {
  59. // 获取服务器子节点信息,并且对父节点进行监听
  60. List<String> children = zk.getChildren(parentNode, true);
  61. // 先创建一个局部的list来存服务器信息
  62. List<String> servers = new ArrayList<String>();
  63. for (String child : children) {
  64. // child只是子节点的节点名
  65. byte[] data = zk.getData(parentNode + "/" + child, false, null);
  66. servers.add(new String(data));
  67. }
  68. // 把servers赋值给成员变量serverList,已提供给各业务线程使用
  69. serverList = servers;
  70. //打印服务器列表
  71. System.out.println(serverList);
  72. }
  73. }

最后:可以将两个java文件分别打包、部署到服务器测试、也可以在IDE上测试执行效果。

转载于:https://www.cnblogs.com/davidwang456/articles/8729355.html

通过Zookeeper动态感知服务器上下线[案例]相关推荐

  1. Mosquitto感知客户端上下线的方法

    欢迎加入QQ群:221779856,国内最活跃的Mosquitto沟通社区,关于MQTT.Mosquitto.IM.推送系统.物联网.高并发处理等技术. 设备上下线的通知不属于mqtt协议的一部分,m ...

  2. linux :Docker 方式 安装 zookeeper、阿里服务器上 Docker 运行 zookeeper

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 查找官方镜像,并下载镜像: # 搜索镜像: docker search zookeeper# ...

  3. ipa 修改服务器地址,动态更改服务器上的.ipa文件

    正如已经指出,你可以简单地解压缩和重新压缩创建自己的ipa. 您还需要添加一些不需要代码签名的资源. 最好的办法是在ipa中创建一个新的(空的)目录.目录本身没有签名,但在设备上解压,可以通过您的代码 ...

  4. 学习笔记:Zookeeper 应用案例(上下线动态感知)

    1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...

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

    服务器动态上下线监听案例 文章目录 1.需求 2.需求分析 3.编程实现 1.先在集群上创建/servers节点 2.服务器端向Zookeeper注册代码(Server) 3.客户端代码(Client ...

  6. Zookeeper——服务器动态上下线、客户端动态监听

    文章目录: 1.前言 2.实操步骤 2.1 服务端代码 2.2 客户端代码 2.3 测试 1.前言 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. ...

  7. zookeeper实现服务器动态上下线,分布式锁

    通过前面的Zookeeper学习,我做了几个例子来巩固以下: 1.服务器动态上下线 需求:app client可以感知到app server的上下线(app client和app server是指我们 ...

  8. Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决

    Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决 运行server服务类时报错:Exception in thread"m ...

  9. 分布式服务动态上下线感知

    分布式服务动态上下线感知 首先,我们要从解决问题的角度得知分布式服务的由来,从单机服务到分布式服务经历了哪些过程 起初,服务是比较单一的,在一个工程包之中会包含所有的模块,但随着互联网的快速发展,客户 ...

最新文章

  1. php网站白页面_php页面空白怎么回事 php出现空白页的解决方法
  2. c++ clang_complete
  3. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
  4. javaEE项目部署方式
  5. Oracle10gR5GridControl InstallOnLinux
  6. eclipse中配置server
  7. excanvas让canvas兼容ie7,8
  8. python中文聊天_GitHub - 116pythonZS/chinese_chatbot_corpus: 中文公开聊天语料库
  9. HTML网页设计原理是什么,HTML+CSS网页设计详解
  10. 死链对网站的影响、产生过程、解决办法汇总
  11. android自定义键盘 下划线,TabLayout 自定义下划线
  12. Oracle数据库表空间整理回收与释放操作
  13. 电子实训与毕业设计开放式训练装置
  14. java中slacc意思,家用联通光纤开启IPv6
  15. python supper代码详解
  16. c++ http服务器之Apache工具ab压力测试(nginx与brpc)
  17. ORACLE找出最大的数返回 GREATEST()函数
  18. ChatGPT 加图数据库 NebulaGraph 预测 2022 世界杯冠军球队
  19. 专业的软件开发公司有哪些优势?
  20. 文件名变乱码解决方案

热门文章

  1. 唐筛的准确率这么低为什么还要做_【NT 唐筛 四维】 【唐筛结果通知】...
  2. 但是尚未从池中获取连接_SQLServer超时时间已到,但是尚未从池中获取连接
  3. java发布sevlet_发布一个java Servlet (静态发布)
  4. oracle union详解,Oracle中的union和join
  5. 静电场的有限差分法与matlab 仿真课程设计,计算物理和MATLAB课程设计--自激振动系统的MATLAB仿真.doc...
  6. window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查
  7. dump java崩溃自动 不生成_GitHub 自动生成 .gitignore,只想写代码不重要的事情别烦我...
  8. android ip rule 策略路由,ip rule 策略路由
  9. oracle11g数据文件路径,oracle11g修改数据文件路径
  10. carplay是否可以用安卓系统_是否可以仅用键盘来操作Windows 10系统和Windows 10应用?...