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
- 基于SpringBoot的任务管理平台v1.0正式发布
- 大数据系统的Lambda架构
- AKKA中的事件流
- Java初涉感悟
- Android 6.0 Permission权限与安全机制
- SpringBoot工作机制
- Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
- SpringBoot中的IoC
- Sonar安装配置
- 《AngularJS深度剖析与最佳实践》推荐序
- JavaScript递归方法 生成 json tree 树形结构数据
- springboot使用hibernate validator校验
- 机器学习(三) ——k-近邻算法基础
- SpringBoot实战 之 异常处理篇
- 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 数组属性和方法
- dbms_lock.relase 无法释放自定义的锁?
- 传统路径导出 VS 直接路径导出(oracle exp direct=y)
- Oracle 索引监控(monitor index)
- 调整联机重做日志大小(change redo log size)
- 联机日志文件过小引发的log file 相关等待
- 收集统计信息导致索引被监控
- Oracle AWR 阙值影响历史执行计划
- Oracle 索引监控与外键索引
- Linux 下配置 HugePages
- Linux/Unix shell 脚本清除归档日志文件
- Oracle OWI 等待事件视图(v$session_wait/v$session_event/v$system_event)
- 不用MariaDB/Percona也能查看DDL的进度
- Oracle OWI 等待事件历史视图及相关视图
- Oracle 监控索引的使用率
- Oracle SGA 自动管理特性(sga_target参数)