java本地监听zk服务器节点【动态上下线】

【README】

java本地访问 zk cluster, refer 2 https://blog.csdn.net/PacosonSWJTU/article/details/111404364 

【1】 客户端监听 zk节点变化 

1) zk客户端代码——http访问的客户端代码(请求zk获取 http服务器的上下线信息)

(对于zk来说,http的server或client都是客户端,这里要能够理解,本文只是将htpt作为例子以便理解,当然也可以是其他请求协议) 


/*** 分布式客户端 */
public class DistributeClient {public static void main(String[] args) throws Exception {DistributeClient client = new DistributeClient();/*1-获取zk连接 */client.getZkConn(); /*2-注册监听节点*/ client.registerListener();/*3-业务逻辑加工*/client.doBusi();}/*** zk客户端*/private ZooKeeper zkClient;/*** 获取子节点 * @throws KeeperException* @throws InterruptedException */private void registerListener() throws KeeperException, InterruptedException {/* 监听servers路径  */List<String> children = zkClient.getChildren("/servers", true);/* 存储服务器节点主机名称集合 */ArrayList<String> hosts = new ArrayList<>(); for(String child : children) {byte[] data = zkClient.getData("/servers/" + child, false, null);hosts.add(new String(data)); } /* 将所有主机名称打印到控制台 */System.out.println(hosts); }private void doBusi() throws InterruptedException {Thread.sleep(Long.MAX_VALUE); // 进程阻塞 }/*** zk server 连接串 */private final static String connectString  = "192.168.163.201:2181,192.168.163.202:2181,192.168.163.203:2181";/*** 超时时间*/private final static int sessionTimeout = 3000;  /*** 0-获取zk连接 */public ZooKeeper getZkConn() throws IOException {/* 连接zk服务器   */zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {try {registerListener();} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});return zkClient; }
}

2) centos8的zk节点操作

[zk: localhost:2181(CONNECTED) 1] create -e -s /servers/server "hadoo1202"
Created /servers/server0000000002
[zk: localhost:2181(CONNECTED) 2] create -e -s /servers/server "hadoop1203"
Created /servers/server0000000003
[zk: localhost:2181(CONNECTED) 3] create -e -s /servers/server "hadoop1204"
Created /servers/server0000000004
[zk: localhost:2181(CONNECTED) 4] quit
Quitting...
2020-12-20 00:25:34,695 [myid:] - INFO  [main:ZooKeeper@684] - Session: 0x1767ab9b8f10004 closed
2020-12-20 00:25:34,698 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@519] - EventThread shut down for session: 0x1767ab9b8f10004
[root@localhost zookeeper-3.4.10]# 

3)java日志 

[hadoo1202]
[hadoo1202]
[hadoop1203, hadoo1202]
[hadoop1204, hadoop1203, hadoo1202]
[]

 

【2】zk客户端代码——http访问的服务端代码(向zk写入 http服务器上线信息)

/*** 分布式服务器 */
public class DistributeServer {public static void main(String[] args) throws Exception {DistributeServer server = new DistributeServer();/*1-获取zk连接 */server.getZkConn(); /*2-注册监听节点*/server.registerServer(args[0]); // 传入服务器名称,如 hadoop102 /*3-业务逻辑加工*/server.doBusi();}/*** zk客户端*/private ZooKeeper zkClient; /*** 注册服务器 * @param hostname*/private void registerServer(String hostname) throws KeeperException, InterruptedException {String path = zkClient.create("/servers/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname + "is online");  System.out.printf("path = %s /n", path); } private void doBusi() throws InterruptedException {Thread.sleep(Long.MAX_VALUE); // 进程阻塞 }/*** zk server 连接串 */private final static String connectString  = "192.168.163.201:2181,192.168.163.202:2181,192.168.163.203:2181";/*** 超时时间*/private final static int sessionTimeout = 3000;  /*** 0-获取zk连接 */public ZooKeeper getZkConn() throws IOException {/* 连接zk服务器   */zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {
//				try {
//					/*3-获取子节点并监控节点变化*/
//					System.out.println("-------watcher start---------");
//					zkClient.getChildren("/", true).stream().forEach(System.out::println);
//					System.out.println("-------watcher end ---------");
//				} catch (KeeperException e) {
//					e.printStackTrace();
//				} catch (InterruptedException e) {
//					e.printStackTrace();
//				}}});return zkClient; }
}

step1) 启动 DistributeServer,参数为   hadoop102

-- log
hadoop102 is online
path = /servers/server0000000005  

step2) 查看 DistributeClient 控制台

-- log
[hadoop102]

step3) 启动 DistributeServer,参数为   hadoop103

-- loghadoop103 is online
path = /servers/server0000000006

step4) 查看 DistributeClient 控制台

-- log
[hadoop103, hadoop102]

step5)关闭 DistributeServer 进程(参数为 hadoop103 的进程)

查看 DistributeClient 控制台

-- log
[hadoop102]

step6)关闭 DistributeServer 进程(参数为 hadoop102 的进程)

查看 DistributeClient 控制台

-- log
[]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面象对象设计6大原则之一:单一职责原则

转载自 面象对象设计6大原则之一&#xff1a;单一职责原则单一职责原则&#xff08;SRP&#xff09;&#xff0c;The Single Responsibility Principle定义一个类的修改只能有一个被修改的原因。通俗地讲&#xff0c;就是一个类只能负责一个职责&#xff0c;修改一个类不能影响…

vue 实现 js css html分离

方法一 分别创建 index.js, index.css index.js: export default {data:function(){return {//...};},methods:{//...} }index.vue 代码 <template>.... </template><script> //index.js 的相对路径 import index from "./index.js";// 名字可…

基于centos8搭建zookeeper集群

【README】 本文基于centos8 搭建 1&#xff0c;其他linux版本&#xff0c;命令可能不同&#xff1b; 2&#xff0c;集群包括3个节点&#xff0c;如下&#xff08;因为采用NAT模型进行网络连接&#xff0c;需要让windows和linux机器在同一个网段&#xff09;&#xff1a; ce…

面象对象设计6大原则之二:开放封闭原则

转载自 面象对象设计6大原则之二&#xff1a;开放封闭原则开放封闭原则&#xff08;OCP&#xff09;&#xff0c;The Open Closed Principle定义一个软件的实体&#xff0c;包括类、方法、模块、应该对扩展开放&#xff0c;对修改关闭。也就是说一个软件的实体应该通过扩展的方…

Java 泛型实现方法 — 擦拭法

所谓擦拭法是指&#xff0c;虚拟机对泛型其实一无所知&#xff0c;所有的工作都是编译器做的。 例如&#xff0c;我们编写了一个泛型类Pair&#xff0c;这是编译器看到的代码&#xff1a; public class Pair<T> {private T first;private T last;public Pair(T first, T…

shell脚本启动kafka集群的多台节点

【README】 由于集群有多台机器&#xff0c;启动kafka &#xff0c;查看其状态&#xff0c;都需要每台机器去执行命令&#xff0c; 可以写个脚本基于ssh免密登录批量执行&#xff1b; 【1】启动kafak (kk.sh) #!/bin/bash case $1 in "start"){for i in centos201…

面象对象设计6大原则之三:里氏替换原则

转载自 面象对象设计6大原则之三&#xff1a;里氏替换原则里氏替换原则&#xff08;LSP&#xff09;&#xff0c;The Liskov Substitution Principle定义所有引用基类的地方必须能透明地引用其子类的对象&#xff0c;即子类可以拓展父类的功能&#xff0c;但不能修改父类已有的…

kafka命令行操作

【README】 kafka集群 -- kafka集群 3台机器 centos201 192.168.163.201 centos202 192.168.163.202 centos203 192.168.163.203【1】主题topic 操作命令 序号 命令 1 kafka-topics.sh -- create 新增 2 kafka-topics.sh -- list 查看列表 3 kafka-topics.sh -- d…

面象对象设计6大原则之四:接口隔离原则

转载自 面象对象设计6大原则之四&#xff1a;接口隔离原则接口隔离原则&#xff08;ISP&#xff09;&#xff0c;The Interface Segregation Principle定义客户端不需要强迫依赖那些它们不需要的接口。类与接口的依赖应该建议在最小的接口上&#xff0c;也就是说接口应该最小化…

Spring 拦截器和过滤器中自动注入为 null 的原因及解决方案

起因 开发过程中在过滤器&#xff08;filter&#xff09;中注入Bean出现空指针异常&#xff0c;通过查找资料了解空指针的原因&#xff0c;特此记录。 问题分析 由于其他bean在service&#xff0c;controller层注入一点问题也没有&#xff0c;开始根本没意识到Bean无法注入是…

kafka命令行生产者消费者测试

【README】 基于命令行开启生产者&#xff0c;消费者线程&#xff0c;测试kafka的消费转发功能&#xff1b; 【1】生产者与消费者 生产者201 [rootcentos201 logs]# kafka-console-producer.sh --topic first --broker-list centos201:9092 >hello-world >sichuan-c…

面象对象设计6大原则之五:依赖倒置原则

转载自 面象对象设计6大原则之五&#xff1a;依赖倒置原则依赖倒置原则&#xff08;DIP&#xff09;&#xff0c;The Dependency Inversion Principle定义1、高层模块不应该依赖低层模块&#xff0c;两都应该依赖于抽象。2、抽象不依赖于具体细节。3、具体细节应该依赖于抽象。…

实现简单的注解型MVC框架 —— 低配SpringMVC

文章目录目标最终效果展示基本步骤1. 解析控制器类&#xff1a;2. 解析处理函数&#xff1a;3. 解析处理函数变量名&#xff1a;4. 监听TCP连接&#xff1a;5. 实现路由函数&#xff1a;知识点总结目标 与SpringMvc定义Controller类似效果 最终效果展示 主类 package org.e…

转:聊聊开发中幂等性问题(*)

【README】 这是一篇非常棒的&#xff0c; 讲解幂等性问题的post&#xff0c; 感谢原文作者&#xff1b; 转自&#xff1a; https://juejin.cn/post/6844903815552958477 幂等 (idempotence) 的概念 幂等的数学概念 幂等是源于一种数学概念。其主要有两个定义 如果在一元运…

面象对象设计6大原则之六:迪米特原则

转载自 面象对象设计6大原则之六&#xff1a;迪米特原则迪米特原则&#xff08;LOD&#xff09;&#xff0c;The Law Of Demeter&#xff0c;也称为最少知识原则定义一个对象应该对其他对象有最少的了解。也就是说一个类耦合和调用一个类应该知道的最少&#xff0c;它只关心被耦…

转-Apache kafka 工作原理介绍

转自&#xff1a; https://developer.ibm.com/zh/articles/os-cn-kafka/ 消息队列 消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上, 队列存储消息直到它们被应用程序读走。通过消息队列&#xff0c;应用程序可独立地执行–它们不需要知道彼此的…

Java内存区域(运行时数据区域)和内存模型(JMM)

原文作者&#xff1a;czwbig 原文&#xff1a;https://www.cnblogs.com/czwbig/p/11127124.html Java 内存区域和内存模型是不一样的东西&#xff0c;内存区域是指 Jvm 运行时将数据分区域存储&#xff0c;强调对内存空间的划分。 而内存模型&#xff08;Java Memory Model&am…

kafka 学习 非常详细的经典教程

转自&#xff1a; https://blog.csdn.net/tangdong3415/article/details/53432166 一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能&#xff0c;但具有自己独特的设计。 这个独特的设计是什么样的呢&#xff1f; 首先让我们看…

一个多线程死锁案例,如何避免及解决死锁问题

转载自 一个多线程死锁案例&#xff0c;如何避免及解决死锁问题 多线程死锁在java程序员笔试的时候时有遇见&#xff0c;死锁概念在之前的文章有介绍&#xff0c;大家应该也都明白它的概念&#xff0c;不清楚的去翻看历史文章吧。 下面是一个多线程死锁的例子 输出 thread1 get…

Thread打印值的含义

打印当前线程&#xff1a; log.warn("当前线程&#xff1a;"Thread.currentThread()");输出结果&#xff1a; 输出结果各部分的含义&#xff1a; Thread[ 线程名称, 线程优先级, 线程所属线程组 ]