通过Zookeeper动态感知服务器上下线[案例]
https://blog.csdn.net/USTC_Zn/article/details/54974982
主体思路:
服务器端:服务器上线、在zookeeper创建 临时的序列化结点
客户端:已启动getchildren 并注册监听 ,获取到当前在线服务器列表。
效果:
客户端能动态感知服务器上下线情况、并获取新的服务器列表
服务器端源码:
- package com.zn.zk1;
- import org.apache.zookeeper.CreateMode;
- import org.apache.zookeeper.WatchedEvent;
- import org.apache.zookeeper.Watcher;
- import org.apache.zookeeper.ZooDefs.Ids;
- import org.apache.zookeeper.ZooKeeper;
- public class DistributedServer {
- private static final String connectString = "zk01:2181,zk02:2181,zk03:2181";
- private static final int sessionTimeout = 2000;
- private static final String parentNode = "/servers";
- private ZooKeeper zk = null;
- /**
- * 模拟服务器上线
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- // 获取zk连接
- DistributedServer server = new DistributedServer();
- server.getConnect();
- // 利用zk连接注册服务器信息
- server.registerServer(args[0]);
- // 启动业务功能
- server.handleBussiness(args[0]);
- }
- /**
- * 创建到zk的客户端连接
- *
- * @throws Exception
- */
- public void getConnect() throws Exception {
- zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
- public void process(WatchedEvent event) {
- // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
- System.out.println(event.getType() + "---" + event.getPath());
- try {
- zk.getChildren("/", true);
- } catch (Exception e) {
- }
- }
- });
- }
- /**
- * 向zk集群注册服务器信息
- *
- * @param hostname
- * @throws Exception
- */
- public void registerServer(String hostname) throws Exception {
- //运行时请手动创建父节点/servers
- //临时的临时的序列化结点
- String create = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
- System.out.println(hostname + "is online.." + create);
- }
- /**
- * 业务功能
- *
- * @throws InterruptedException
- */
- public void handleBussiness(String hostname) throws InterruptedException {
- System.out.println(hostname + "start working.....");
- Thread.sleep(Long.MAX_VALUE);
- }
- }
-----------------------华丽的分界线---------------------
客户端源码:
- package com.zn.zk1;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.zookeeper.KeeperException;
- import org.apache.zookeeper.WatchedEvent;
- import org.apache.zookeeper.Watcher;
- import org.apache.zookeeper.ZooKeeper;
- public class DistributedClient {
- private static final String connectString = "zk01:2181,zk02:2181,zk03:2181";
- private static final int sessionTimeout = 2000;
- private static final String parentNode = "/servers";
- /** 注意:加<span style="color:#ff0000;"><strong>volatile的意义</strong></span>何在?---serverList对象在JVM堆中,多线程时会对该对象进行更改,每个线程对该对象操作会
- * copy一个副本到本地线程栈,再对该对象进行修改操作,改完后,再将该对象同步到共享的堆内存中。
- * 被volatile修饰的对象则不会被copy到本地线程栈。所有线程看到的该对象是同一个。不会出现多线程问题。
- */
- private volatile List<String> serverList;
- private ZooKeeper zk = null;
- public static void main(String[] args) throws Exception {
- // 获取zk连接
- DistributedClient client = new DistributedClient();
- //创建zookeeper连接
- client.getConnect();
- // 获取servers的子节点信息(并监听),从中获取服务器信息列表
- client.getServerList();
- // 业务线程启动
- client.handleBussiness();
- }
- /**
- * 业务功能
- *
- * @throws InterruptedException
- */
- public void handleBussiness() throws InterruptedException {
- System.out.println("client start working.....");
- Thread.sleep(Long.MAX_VALUE);
- }
- /**
- * 创建到zk的客户端连接
- * @throws Exception
- */
- public void getConnect() throws Exception {
- zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
- public void process(WatchedEvent event) {
- // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
- try {
- //重新更新服务器列表,并且注册了监听
- getServerList();
- } catch (Exception e) {
- }
- }
- });
- }
- /**
- * 获取服务器信息列表
- *
- * @throws Exception
- */
- public void getServerList() throws Exception {
- // 获取服务器子节点信息,并且对父节点进行监听
- List<String> children = zk.getChildren(parentNode, true);
- // 先创建一个局部的list来存服务器信息
- List<String> servers = new ArrayList<String>();
- for (String child : children) {
- // child只是子节点的节点名
- byte[] data = zk.getData(parentNode + "/" + child, false, null);
- servers.add(new String(data));
- }
- // 把servers赋值给成员变量serverList,已提供给各业务线程使用
- serverList = servers;
- //打印服务器列表
- System.out.println(serverList);
- }
- }
最后:可以将两个java文件分别打包、部署到服务器测试、也可以在IDE上测试执行效果。
转载于:https://www.cnblogs.com/davidwang456/articles/8729355.html
通过Zookeeper动态感知服务器上下线[案例]相关推荐
- Mosquitto感知客户端上下线的方法
欢迎加入QQ群:221779856,国内最活跃的Mosquitto沟通社区,关于MQTT.Mosquitto.IM.推送系统.物联网.高并发处理等技术. 设备上下线的通知不属于mqtt协议的一部分,m ...
- linux :Docker 方式 安装 zookeeper、阿里服务器上 Docker 运行 zookeeper
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. 查找官方镜像,并下载镜像: # 搜索镜像: docker search zookeeper# ...
- ipa 修改服务器地址,动态更改服务器上的.ipa文件
正如已经指出,你可以简单地解压缩和重新压缩创建自己的ipa. 您还需要添加一些不需要代码签名的资源. 最好的办法是在ipa中创建一个新的(空的)目录.目录本身没有签名,但在设备上解压,可以通过您的代码 ...
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...
- 服务器动态上下线监听案例
服务器动态上下线监听案例 文章目录 1.需求 2.需求分析 3.编程实现 1.先在集群上创建/servers节点 2.服务器端向Zookeeper注册代码(Server) 3.客户端代码(Client ...
- Zookeeper——服务器动态上下线、客户端动态监听
文章目录: 1.前言 2.实操步骤 2.1 服务端代码 2.2 客户端代码 2.3 测试 1.前言 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. ...
- zookeeper实现服务器动态上下线,分布式锁
通过前面的Zookeeper学习,我做了几个例子来巩固以下: 1.服务器动态上下线 需求:app client可以感知到app server的上下线(app client和app server是指我们 ...
- Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决
Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决 运行server服务类时报错:Exception in thread"m ...
- 分布式服务动态上下线感知
分布式服务动态上下线感知 首先,我们要从解决问题的角度得知分布式服务的由来,从单机服务到分布式服务经历了哪些过程 起初,服务是比较单一的,在一个工程包之中会包含所有的模块,但随着互联网的快速发展,客户 ...
最新文章
- php网站白页面_php页面空白怎么回事 php出现空白页的解决方法
- c++ clang_complete
- Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
- javaEE项目部署方式
- Oracle10gR5GridControl InstallOnLinux
- eclipse中配置server
- excanvas让canvas兼容ie7,8
- python中文聊天_GitHub - 116pythonZS/chinese_chatbot_corpus: 中文公开聊天语料库
- HTML网页设计原理是什么,HTML+CSS网页设计详解
- 死链对网站的影响、产生过程、解决办法汇总
- android自定义键盘 下划线,TabLayout 自定义下划线
- Oracle数据库表空间整理回收与释放操作
- 电子实训与毕业设计开放式训练装置
- java中slacc意思,家用联通光纤开启IPv6
- python supper代码详解
- c++ http服务器之Apache工具ab压力测试(nginx与brpc)
- ORACLE找出最大的数返回 GREATEST()函数
- ChatGPT 加图数据库 NebulaGraph 预测 2022 世界杯冠军球队
- 专业的软件开发公司有哪些优势?
- 文件名变乱码解决方案
热门文章
- 唐筛的准确率这么低为什么还要做_【NT 唐筛 四维】 【唐筛结果通知】...
- 但是尚未从池中获取连接_SQLServer超时时间已到,但是尚未从池中获取连接
- java发布sevlet_发布一个java Servlet (静态发布)
- oracle union详解,Oracle中的union和join
- 静电场的有限差分法与matlab 仿真课程设计,计算物理和MATLAB课程设计--自激振动系统的MATLAB仿真.doc...
- window服务器cpu过高的排查_高频面试题:Java程序占用 CPU 过高怎么排查
- dump java崩溃自动 不生成_GitHub 自动生成 .gitignore,只想写代码不重要的事情别烦我...
- android ip rule 策略路由,ip rule 策略路由
- oracle11g数据文件路径,oracle11g修改数据文件路径
- carplay是否可以用安卓系统_是否可以仅用键盘来操作Windows 10系统和Windows 10应用?...