节点类型

持久(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节点类型,整合代码实现服务器动态监听相关推荐

  1. zookeeper专题:使用zookeeper客户端实现动态监听节点并获取数据

    文章目录 1. zookeeper原生客户端 2. Curator客户端 1. zookeeper原生客户端 zookeeper原生客户端就是zookeeper官方自带的客户端,作为代码与zk服务器交 ...

  2. Zookeeper——服务器动态上下线、客户端动态监听

    文章目录: 1.前言 2.实操步骤 2.1 服务端代码 2.2 客户端代码 2.3 测试 1.前言 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. ...

  3. 本地java【动态监听】zk集群节点变化

    [README]搭建zk cluster, refer 2 https://blog.csdn.net/PacosonSWJTU/article/details/111404364 [1] 动态监听代 ...

  4. vue动态监听窗口高度 - 全背景banner

    vue动态监听窗口高度 - 全背景banner 参考项目文件 src/hr/index.vue [结合下文:第一种方法] 第一种方法:[本文手写代码] data() {return {screenHe ...

  5. oracle未获得监听器,无监听文件listener.ora的动态监听小例试验

    在数据库服务器上,监听文件的位置是:$ORACLE_HOME/network/admin/listener.ora 试验如下: 移动db服务器上的监听文件,如下命令: [oracle@ENMOEDU ...

  6. 聊聊RabbitMq动态监听这点事

    很长时间没有分享过学习心得了,看了下发布记录,最后一篇文章的时间都在2020-12-10年了,今天抽时间整理下一个很早就想整理的技术分享.顺便说句题外话,因为我一直没时间整理,再加上开发的小伙伴对Mq ...

  7. 前端匹配服务器地址修改文件,修改服务器的监听地址

    修改服务器的监听地址 内容精选 换一换 Atlas 200 DK开发者板支持通过USB接口或者网线与Mind Studio进行连接,连接示例图如图1所示.Ubuntu服务器若想与Atlas 200 D ...

  8. JavaScript巧用Object的get和set方法实现js变量的动态监听

    javascript 面向对象系列更新: Javascript面向对象编程之工厂模式.构造函数和ES6的class类 JavaScript 面向对象之Object的getter和setter的使用 更 ...

  9. 动态监听DOM元素的高度

    1.背景 考虑这样一种情况,产品同学希望达到以下功能: 在我们的网页中有一个固定区域,这个区域会用于渲染从后端拉取的含有图片等资源的富文本字符串. 他需要在内容不超过一个最大高度的时候完全显示所有内容 ...

最新文章

  1. 使用字符流 创建文件 写入文件 复制文件
  2. leetcode算法题--一和零★
  3. 安装VSTFS后遗症解决方法
  4. 这就是数据分析之数据分析入门
  5. java.lang.ExceptionInInitializerError解决办法
  6. 各种VC9 VC11版本的Apache
  7. SpringMVC 刷课笔记
  8. 传智播客黑马java 30期_黑马传智播客JavaEE57期 2019最新基础+就业+在职加薪_汇总...
  9. 华尔街不是中国的机会
  10. 模拟人生5显示与服务器,模拟人生5之人生无限
  11. google网盘 百度网盘文件互传
  12. 浅析部分物化以及冰山立方体的计算方法Star-Cubing
  13. Python:StringIO与cStringIO
  14. Mac Terminal (终端) 使用ssh快速登录远程服务器
  15. 南京印象之出租车司机
  16. uniapp自定义整包更新与热更新
  17. MySQL 开启大页内存
  18. 如何让安卓手机日历和Mac/iOS日历双向同步?
  19. python dataframe去掉索引_python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)...
  20. 吕鑫MFC学习系列十

热门文章

  1. 木瓜蛋白酶和胃蛋白酶对免疫球蛋白Ig处理的不同
  2. icheck结合datatable使用方法及实现全选、反选功能
  3. Android的六大进程
  4. input 验证码 密码 输入框
  5. u盘linux系统安装文件,使用U盘安装LINUX系统
  6. 线性代数系列(十一)--正交矩阵和正交化
  7. 学习笔记:分库分表之中间件Mycat实战
  8. java 里面耦合和解耦
  9. handlebars使用
  10. Anaconda安装并配置