Zookeeper监听服务器节点动态上下线案例
时间:2019-10-22
本文章向大家介绍Zookeeper监听服务器节点动态上下线案例,主要包括Zookeeper监听服务器节点动态上下线案例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.需求
某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。
2.需求分析
3.具体实现
(0)先在集群上创建/servers节点:
[zk: localhost:2181(CONNECTED) 10] create /servers "servers" Created /servers
(1)服务器端向Zookeeper注册代码:
import org.apache.zookeeper.*; import org.jetbrains.annotations.NotNull; import java.io.IOException; public class DistributeServer { public static void main(@NotNull String[] args) throws IOException, KeeperException, InterruptedException { DistributeServer server = new DistributeServer(); // 思路:先写大框架!在考虑细节 // 1.连接zookeeper集群 server.getConnect(); // 2.注册节点 server.regist(args[0]); // 3.业务逻辑处理 server.business(); } private void business() throws InterruptedException { // 睡眠,保证进程不结束 Thread.sleep(Long.MAX_VALUE); } private void regist(String hostname) throws KeeperException, InterruptedException { // 由于每次注册只调用下面这一个方法,故设置CreateMode时只能设置临时带序号的类型 zkClient.create("/servers/server",hostname.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println(hostname + " is online !"); } private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181"; private int sessionTimeout = 2000; private ZooKeeper zkClient;//客户端对象 private void getConnect() throws IOException { zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() { public void process(WatchedEvent event) { } }); } }
(2)客户端代码
import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class DistributeClient { private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181"; private int sessionTimeout = 2000; private ZooKeeper zkClient;//客户端对象 public static void main(String[] args) throws IOException, KeeperException, InterruptedException { DistributeClient client = new DistributeClient(); // 1.获取zookeeper集群连接 client.getConnect(); // 2. 注册监听 client.getChildren(); // 3.业务逻辑处理 client.business(); } private void business() throws InterruptedException { Thread.sleep(Long.MAX_VALUE); } private void getChildren() throws KeeperException, InterruptedException { // 监听/servers 启动监听之后会进入new Watcher()的process方法中 List<String> children = zkClient.getChildren("/servers", true); // 存储服务器节点主机的名称,放在集合里 ArrayList<String> hosts = new ArrayList<String>();; for (String child : children) { // 拼接可得要获得的数据目的地 byte[] data = zkClient.getData("/servers/" + child, false, null); hosts.add(new String(data)); } // 将所有在线主机名称打印到控制台 System.out.println(hosts); } private void getConnect() throws IOException { zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() { public void process(WatchedEvent event) { System.out.println("启用的监听!"); // 如果不将下面的代码放在此处,那么监听只会执行一次 try { // 为了动态监听 getChildren(); } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }
要记得在运行时候main中args[ ]要事先配置哦!
原文地址:https://www.cnblogs.com/Mark-blog/p/11722442.html
- React技巧1(状态组件与无状态组件的使用)
- zoj 1315 Excuses, Excuses!
- ZOJ 2724 Windows Message Queue(优先队列)
- React多页面应用7(引入eslint代码检查)
- Trie树
- React第三方组件1(路由管理之Router的使用⑤按需加载-下)
- zoj 2876 Phone List
- PHP小知识
- Where's Waldorf?
- POj 1797 Heavy Transportation
- 卡特兰数简介原理性质应用参考:
- UVA Machined Surfaces
- NBUT 1117 Kotiya's Incantation
- React第三方组件1(路由管理之Router的使用④按需加载-上)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Selenium 系列篇(六):反反爬篇
- Selenium 系列篇(五):文件篇
- 腾讯大佬整理了 Python 所有内置异常,Python高手必备的排错手册
- Selenium 系列篇(四):JS 篇
- 【5分钟玩转Lighthouse】家乡的战疫
- Kubernetes 源码学习之延时队列
- Selenium 系列篇(三):窗口篇
- Selenium 系列篇(二):元素定位
- ES2020 中 Javascript 10 个你应该知道的新功能
- Selenium 系列篇(一):准备篇
- HTML5+CSS3高级动画的应用实践
- 这五个有用的 CSS 属性完全被我忽视了
- 在 Kubernetes 中使用 Helm Hooks 迁移数据库
- 漫画:如何螺旋遍历二维数组?
- 轻松学Pytorch-迁移学习实现表面缺陷检查