zookeeper节点类型,整合代码实现服务器动态监听
节点类型
持久(Persistent):客户端和服务器端断开连接后,创建的节点不删除
可分为无序号和有序号的,顺序号可以被用于 为所有的事件进行全局排序,这样客户端可以通 过顺序号推断事件的顺序
短暂(Ephemeral):客户端和服务器端断开连接后,创建的节点自己删除
也可分为无序号和有序号的
Linux中创建节点
创建永久节点名称为jiedian1,值为dadada,无序号
create /jiedian1 "dadada"
创建子节点
create /jiedian1/zijiedian "dadada"
获取节点值
get -s /jiedian1
创建带序号的节点 只需要加-s
create -s /jiedian1/zijiedian "xuhao"
创建临时
create -e /jiedian2 "linshi"
临时带序号
create -e -s /jiedian2 "linshixuhao"
此时 quit 退出后,临时节点会消失
修改节点
set /jiedian1 "123"
监听器原理
监听那个节点数据变化,若变化通知客户端
1)首先要有一个main()线程
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。
3)通过connect线程将注册的监听事件发送给Zookeeper。
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
6)listener线程内部调用了process()方法。
使用命令行操作,注册一次监听一次
get -w /jiedian1
此时用其他机器对节点进行修改,此时就会通知当前客户端
整合代码
创建maven工程,添加依赖
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.5</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.5.7</version></dependency>
</dependencies>
配置日志文件,在resource下创建log4j.properties
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
编写测试类
public class zkClient {//不能有空格private static String connectString = "192.168.6.100:2181,192.168.6.101:2181,192.168.6.102:2181";//超时时间private static int sessionTimeout = 2000;private ZooKeeper zkClient = null;//接连集群@Beforepublic void init() throws Exception {zkClient = new ZooKeeper(connectString, sessionTimeout, newWatcher() {@Overridepublic void process(WatchedEvent watchedEvent) {// 收到事件通知后的回调函数(用户的业务逻辑)System.out.println(watchedEvent.getType() + "--"+ watchedEvent.getPath());// 再次启动监听try {List<String> children = zkClient.getChildren("/",true);for (String child : children) {System.out.println(child);}} catch (Exception e) {e.printStackTrace();}}});}// 创建子节点@Testpublic void create() throws Exception {// 参数 1:要创建的节点的路径; 参数 2:节点数据 ; 参数 3:节点权限 ;参数 4:节点的类型String nodeCreated = zkClient.create("/lzq","jiedain".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}// 获取子节点并监听 注册一次生效一次@Testpublic void getChildren() throws Exception {List<String> children = zkClient.getChildren("/", true);for (String child : children) {System.out.println(child);}// 延时阻塞Thread.sleep(Long.MAX_VALUE);}}
写数据流程
写流程之写入请求直接发送给Leader节点,直接写,然后同步到从节点,当超过半数写完,返回给客户端
写流程之写入请求发送给follower节点,通知主节点写。。。。
服务器动态上下线监听
某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知 到主节点服务器的上下线
先在集群上创建/servers 节点
create /servers "servers"
IDEA中,服务器端向 Zookeeper 注册代码
import java.io.IOException;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
public class DistributeServer {private static String connectString ="192.168.6.100:2181,192.168.6.101:2181,192.168.6.102:2181";private static int sessionTimeout = 2000;private ZooKeeper zk = null;private String parentNode = "/servers";// 创建到 zk 的客户端连接public void getConnect() throws IOException{zk = new ZooKeeper(connectString, sessionTimeout, newWatcher() {@Overridepublic void process(WatchedEvent event) {}});}// 注册服务器public void registServer(String hostname) throws Exception{String create = zk.create(parentNode + "/server",hostname.getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname +" is online "+ create);}// 业务功能public void business(String hostname) throws Exception{System.out.println(hostname + " is working ...");Thread.sleep(Long.MAX_VALUE);}public static void main(String[] args) throws Exception {// 1 获取 zk 连接DistributeServer server = new DistributeServer();server.getConnect();// 2 利用 zk 连接注册服务器信息server.registServer(args[0]);// 3 启动业务功能server.business(args[0]);}
}
客户端
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
public class DistributeClient {private static String connectString ="192.168.6.100:2181,192.168.6.101:2181,192.168.6.102:2181";private static int sessionTimeout = 2000;private ZooKeeper zk = null;private String parentNode = "/servers";// 创建到 zk 的客户端连接public void getConnect() throws IOException {zk = new ZooKeeper(connectString, sessionTimeout, newWatcher() {@Overridepublic void process(WatchedEvent event) {// 再次启动监听try {getServerList();} catch (Exception e) {e.printStackTrace();}}});}// 获取服务器列表信息public void getServerList() throws Exception {// 1 获取服务器子节点信息,并且对父节点进行监听List<String> children = zk.getChildren(parentNode, true);// 2 存储服务器信息列表ArrayList<String> servers = new ArrayList<>();// 3 遍历所有节点,获取节点中的主机名称信息for (String child : children) {byte[] data = zk.getData(parentNode + "/" + child,false, null);servers.add(new String(data));}// 4 打印服务器列表信息System.out.println(servers);}// 业务功能public void business() throws Exception{System.out.println("client is working ...");Thread.sleep(Long.MAX_VALUE);}public static void main(String[] args) throws Exception {// 1 获取 zk 连接DistributeClient client = new DistributeClient();client.getConnect();// 2 获取 servers 的子节点信息,从中获取服务器信息列表client.getServerList();// 3 业务进程启动client.business();}
}
此时修改或创建节点就会在控制台输出
zookeeper节点类型,整合代码实现服务器动态监听相关推荐
- zookeeper专题:使用zookeeper客户端实现动态监听节点并获取数据
文章目录 1. zookeeper原生客户端 2. Curator客户端 1. zookeeper原生客户端 zookeeper原生客户端就是zookeeper官方自带的客户端,作为代码与zk服务器交 ...
- Zookeeper——服务器动态上下线、客户端动态监听
文章目录: 1.前言 2.实操步骤 2.1 服务端代码 2.2 客户端代码 2.3 测试 1.前言 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. ...
- 本地java【动态监听】zk集群节点变化
[README]搭建zk cluster, refer 2 https://blog.csdn.net/PacosonSWJTU/article/details/111404364 [1] 动态监听代 ...
- vue动态监听窗口高度 - 全背景banner
vue动态监听窗口高度 - 全背景banner 参考项目文件 src/hr/index.vue [结合下文:第一种方法] 第一种方法:[本文手写代码] data() {return {screenHe ...
- oracle未获得监听器,无监听文件listener.ora的动态监听小例试验
在数据库服务器上,监听文件的位置是:$ORACLE_HOME/network/admin/listener.ora 试验如下: 移动db服务器上的监听文件,如下命令: [oracle@ENMOEDU ...
- 聊聊RabbitMq动态监听这点事
很长时间没有分享过学习心得了,看了下发布记录,最后一篇文章的时间都在2020-12-10年了,今天抽时间整理下一个很早就想整理的技术分享.顺便说句题外话,因为我一直没时间整理,再加上开发的小伙伴对Mq ...
- 前端匹配服务器地址修改文件,修改服务器的监听地址
修改服务器的监听地址 内容精选 换一换 Atlas 200 DK开发者板支持通过USB接口或者网线与Mind Studio进行连接,连接示例图如图1所示.Ubuntu服务器若想与Atlas 200 D ...
- JavaScript巧用Object的get和set方法实现js变量的动态监听
javascript 面向对象系列更新: Javascript面向对象编程之工厂模式.构造函数和ES6的class类 JavaScript 面向对象之Object的getter和setter的使用 更 ...
- 动态监听DOM元素的高度
1.背景 考虑这样一种情况,产品同学希望达到以下功能: 在我们的网页中有一个固定区域,这个区域会用于渲染从后端拉取的含有图片等资源的富文本字符串. 他需要在内容不超过一个最大高度的时候完全显示所有内容 ...
最新文章
- 使用字符流 创建文件 写入文件 复制文件
- leetcode算法题--一和零★
- 安装VSTFS后遗症解决方法
- 这就是数据分析之数据分析入门
- java.lang.ExceptionInInitializerError解决办法
- 各种VC9 VC11版本的Apache
- SpringMVC 刷课笔记
- 传智播客黑马java 30期_黑马传智播客JavaEE57期 2019最新基础+就业+在职加薪_汇总...
- 华尔街不是中国的机会
- 模拟人生5显示与服务器,模拟人生5之人生无限
- google网盘 百度网盘文件互传
- 浅析部分物化以及冰山立方体的计算方法Star-Cubing
- Python:StringIO与cStringIO
- Mac Terminal (终端) 使用ssh快速登录远程服务器
- 南京印象之出租车司机
- uniapp自定义整包更新与热更新
- MySQL 开启大页内存
- 如何让安卓手机日历和Mac/iOS日历双向同步?
- python dataframe去掉索引_python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)...
- 吕鑫MFC学习系列十