zk监听主要是监听:节点创建,节点删除,节点改变、子节点改变
我这里用node-1和node-3同时连接node-1
zk客户端监听功能一般步骤:
1、客户端设置监听事件 命令:get 节点 watch (node-1上操作)
2、执行监听 命令:set 节点 改变内容 (node-3上操作)
3、触发事件、回调事件给客户端 node-1上会回调信息出来
监听机制的应用:高可用的切换,主备的切换

监听机制是一次性的、所以想要持续监听在回调事件之后设再次设置监听事件即可!!

watch机制特点:

一次性触发
事件发生触发监听,一个 watcher event 就会被发送到设置监听的客户端,
这种效果是一次性的,后续再次发生同样的事件,不会再次触发。

事件封装
ZooKeeper 使用 WatchedEvent 对象来封装服务端事件并传递。
WatchedEvent 包含了每一个事件的三个基本属性:
通知状态(keeperState) ,事件类型(EventType)和节点路径(path)

event 异步发送
watcher 的通知事件从服务端发送到客户端是异步的。

先注册再触发
Zookeeper 中的 watch 机制,必须客户端先去服务端注册监听,这样事件发
送才会触发监听,通知给客户端

方式二:java api 操作节点创建
开启idea:创建一个maven工程
导入jar包在pom文件:

<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version>
</dependency

代码:

import org.apache.zookeeper.*;import java.io.IOException;public class TestZKClient {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {//通过创建客户端实例:参数(本地系统host文件映射后才能用node,会话超时时间,监听匿名内部类)ZooKeeper zk=  new ZooKeeper("node-1:2181,node-2:2181,node-3:2181", 3000, new Watcher() {public void process(WatchedEvent watchedEvent) {}});//创建节点(节点名称,数组)zk.create("/createbyjava","么么哒".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//断开连接zk.close();}
}

查看:
命令:ls /
查看节点具体信息:get /createbyjava


java操作监听:先注册后监听原则,但是这边没有

public class TestZKClient {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {//通过创建客户端实例:参数(本地系统host文件映射后才能用node,会话超时时间,监听匿名内部类)ZooKeeper zk=  new ZooKeeper("node-1:2181,node-2:2181,node-3:2181", 3000, new Watcher() {//process方法就是监听回调客户的处理方法public void process(WatchedEvent event) {System.out.println("连接的状态为:"+event.getState());System.out.println("事件发生的类型:"+event.getType());System.out.println("事件发生的路径:"+event.getPath());}});//创建节点(节点名称,数组)zk.create("/createbyjava2","么么哒".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//断开连接zk.close();}
}

输出页面:

连接的状态为SyncConnected
事件发生的类型None
事件发生的路径null

原因:

zk的监听事件- 客户端连接状态监听事件  不需要用户注册满足条件即可触发 如果用户关心就去处理 如果不关心可以直接忽略
- 客户端用户自定义监听事件  :先注册再触发  一次性的监听

java设置监听:

public class TestZKClient {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {//通过创建客户端实例:参数(本地系统host文件映射后才能用node,会话超时时间,监听匿名内部类)ZooKeeper zk=  new ZooKeeper("node-1:2181,node-2:2181,node-3:2181", 3000, new Watcher() {//process方法就是监听回调客户的处理方法public void process(WatchedEvent event) {System.out.println("连接的状态为:"+event.getState());System.out.println("事件发生的类型:"+event.getType());System.out.println("事件发生的路径:"+event.getPath());}});//创建节点(节点名称,数组)//  zk.create("/createbyjava2","么么哒".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//设置监听(注意第二个参数,控制是否开启监听)zk.getData("/createbyjava",true,null);//修改节点数据,满足监听条件(第三个参数表示系统版本号自动维护)zk.setData("/createbyjava","呵呵哒".getBytes(),-1);//断开连接zk.close();}
}

输出:

连接的状态为:SyncConnected
事件发生的类型:NodeDataChanged
事件发生的路径:/createbyjava

修改多次也只会输出一次


永久类监听设置:

public class TestZKClient {private static   ZooKeeper zk=null;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {//通过创建客户端实例:参数(本地系统host文件映射后才能用node,会话超时时间,监听匿名内部类)zk=  new ZooKeeper("node-1:2181,node-2:2181,node-3:2181", 3000, new Watcher() {//process方法就是监听回调客户的处理方法public void process(WatchedEvent event) {System.out.println("连接的状态为:"+event.getState());System.out.println("事件发生的类型:"+event.getType());System.out.println("事件发生的路径:"+event.getPath());//如果想要实现永久监听在上一个监听结束前再次设置监听try {zk.getData("/createbyjava",true,null);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});//创建节点(节点名称,数组)//  zk.create("/createbyjava2","么么哒".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//设置监听(注意第二个参数,控制是否开启监听)zk.getData("/createbyjava",true,null);//修改节点数据,满足监听条件(第三个参数表示系统版本号自动维护)zk.setData("/createbyjava","呵呵哒".getBytes(),-1);zk.setData("/createbyjava","呵呵哒1".getBytes(),-1);//判断节点是否存在,设置是否监听//zk.exists("/createbyjava2",true);//删除节点 版本号自动维护// zk.delete("/createbyjava2",-1);//断开连接zk.close();}
}

输出:可以输出多次,

连接的状态为:SyncConnected
事件发生的类型:None
事件发生的路径:null
连接的状态为:SyncConnected
事件发生的类型:NodeDataChanged
事件发生的路径:/createbyjava
连接的状态为:SyncConnected
事件发生的类型:NodeDataChanged
事件发生的路径:/createbyjava

zk从时效性分临时节点和永久节点:

临时节点:节点生命周期将和创建它的客户端的会话相关,客户端断开连接,会话结束,节点消失、

永久节点:该节点和会话没有关系,创建之后一直存在,除非手动强制删除。

临时节点不允许拥有字节点、
节点拥有序列化特性、所以导致zk节点拥有四种类型:
PERSISTENT:永久节点
EPHEMERAL:临时节点
PERSISTENT_SEQUENTIAL:永久节点、序列化
EPHEMERAL_SEQUENTIAL:临时节点、序列

一般步骤:
1、客户端通过2181连接到zk集群任意机器上,产生会话关系(session)
2、在会话内,客户端可以针对目录树进行增删改查操作
3、操作结束,客户端断开连接 会话结束、

ZooKeeper shell
客户端连接 :开启zk
进入命令行工具
/export/servers/zookeeper/bin/zkCli.sh 连接自己
下面我是用node-3连接node-1的命令:
/export/servers/zookeeper/bin/zkCli.sh -server node-1

查看节点: ls / 命令 (默认会有一个zookeeper节点存在)
在node-3机子上用这个命令也能看到这个节点存在(此处只是想要说明zookeeper的特性:全局数据一致性)

shell的基本操作:节点的增删改查操作
创建节点 create [-s] [-e] path data acl
其中,-s 或-e 分别指定节点特性,顺序或临时节点,若不指定,则表示持
久节点;acl 用来进行权限控制

创建了临时节点之后退出,用另一台机子查看能看到临时节点会稍微停留一会再消失(延时防止网络波动)、
创建一个永久节点之后、不能再次创建、要创建必须加-s序列化特性,

序列化特性用处:控制做事的顺序!

读取节点:
与读取相关的命令有 ls 命令和 get 命令,ls 命令可以列出 Zookeeper 指
定节点下的所有子节点,只能查看指定节点下的第一级的所有子节点;get 命令
可以获取 Zookeeper 指定节点的数据内容和属性信息。
ls path [watch]
get path [watch]
ls2 path [watch]

删除节点 delete path [version]
若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除
父节点。
Rmr path
可以递归删除节点。

更新节点 set path data [version]
data 就是要更新的新内容,version 表示数据版本。

setquota -n|-b val path 对节点增加限制。
n:表示子节点的最大个数
b:表示数据值的最大长度
val:子节点最大个数或数据值的最大长度
path:节点路径

listquota path 列出指定节点的 quota

子节点个数为 2,数据长度-1 表示没限制
delquota [-n|-b] path 删除 quota

节点属性 :
dataVersion:数据版本号,每次对节点进行 set 操作,dataVersion 的值都
会增加 1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺
序问题。
cversion :子节点的版本号。当 znode 的子节点有变化时,cversion 的值
就会增加 1。
aclVersion :ACL 的版本号。
cZxid :Znode 创建的事务 id。
mZxid :Znode 被修改的事务 id,即每次对 znode 的修改都会更新 mZxid。

对于 zk 来说,每次的变化都会产生一个唯一的事务 id,zxid(ZooKeeper
Transaction Id)。通过 zxid,可以确定更新操作的先后顺序。例如,如果 zxid1
小于 zxid2,说明 zxid1 操作先于 zxid2 发生,zxid 对于整个 zk 都是唯一的,
即使操作的是不同的 znode。
ctime:节点创建时的时间戳.
mtime:节点最新一次更新发生时的时间戳.
ephemeralOwner:如果该节点为临时节点, ephemeralOwner 值表示与该节点
绑定的 session id. 如果不是, ephemeralOwner 值为 0.
在 client 和 server 通信之前,首先需要建立连接,该连接称为 session。连
接建立后,如果发生连接超时、授权失败,或者显式关闭连接,连接便处于 CLOSED
状态, 此时 session 结束

Zk监听机制入门和节点属性信息相关推荐

  1. Apache ZooKeeper - 事件监听机制详解

    文章目录 事件监听机制命令 Zookeeper事件类型 实操 -w get -w /path 监听节点数据的变化 ls -w /path 监听子节点的变化(增,删) [监听目录] ls -w /pat ...

  2. 【zookeeper】zookeeper 的监听机制

    文章目录 1.概述 2. shell案例 1.概述 视频:zookeeper znode 存储系统解密 上一篇文章:[zookeeper]zookeeper znode 存储系统解密 许多大数据组件都 ...

  3. Spring5源码 - 12 Spring事件监听机制_异步事件监听应用及源码解析

    文章目录 Pre 实现原理 应用 配置类 Event事件 事件监听 EventListener 发布事件 publishEvent 源码解析 (反推) Spring默认的事件广播器 SimpleApp ...

  4. Ⅵ:zookeeper的Watcher事件监听机制

    2021最新zookeeper系列 ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤️ ❤ ...

  5. [JS-DOM]事件监听机制

    事件监听机制 概念:某些组件被执行了某些操作后,触发某些代码的指行.*事件: 某些操作.如:单击,双击,键盘按下了,鼠标移动了.*事件源:组件.如:按钮,文本输入框...*监听器:代码.*注册监听:将 ...

  6. java监听机制_详解java的事件监听机制和观察者设计模式

    首先说说监听器: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执 行. java的事件监 ...

  7. springBoot启动事件监听机制

    springBoot启动之事件监听机制源码解析 1. Java的事件监听机制 在进行正式的分析之前,先介绍一下Java的事件监听机制.参考05–SpringBoot启动之事件监听机制 Java事件监听 ...

  8. 深入理解Spring的容器内事件发布监听机制

    前言 Spring 提供了 ApplicationContext 事件机制,可以发布和监听事件,这个特性非常有用. Spring 内置了一些事件和监听器,例如在 Spring 容器启动前,Spring ...

  9. Zookeeper监听机制

    1.1 监听器原理 首先要有一个main()线程 在main()线程中创建Zookeeper客户端,这时就会创建两个线程connect线程负责网络连接通信,listen线程负责监听 通过connect ...

最新文章

  1. Intellij IDEA 添加jar包
  2. grep查找时,去掉grep本身那一条
  3. 《系统集成项目管理工程师》必背100个知识点-63供应商选择
  4. Kafka2.5->Flink1.12->Mysql8(Jark实验改为DDL形式)
  5. 2021年,朋友圈都在传这8个视频
  6. 干得漂亮!法院在微信朋友圈精准投放“老赖”广告 网友:建议全国推广
  7. [转]:理解 Linux 配置文件
  8. 接口测试总结-值得一看哟
  9. Linq专题之提高编码效率—— 第三篇 你需要知道的枚举类
  10. 不用写代码也能学会采集海量企业电话及邮箱数据
  11. 旅游网站php源码,基于ThinkPHP框架开发的青春旅行旅游门户整站PHP源码
  12. 1041: 数列求和1
  13. 手把手教你使用stata制作临床决策曲线
  14. STM32之贪吃蛇游戏
  15. yy欢聚时代软件测试笔试题
  16. 宠物赛道的泡泡玛特|BarkBox 如何靠一流的订阅服务实现 95% 的用户留存
  17. 飞思卡尔XS128系列(三) PIT
  18. HTTP 请求方法(GET、POST 和 PUT)
  19. 电脑卡死、死机、黑屏怎么办?驱动人生教你如何解决
  20. TiDB 在 2021 易车 818 汽车狂欢节的应用

热门文章

  1. CSAPP 第2章 信息表示和处理课后作业
  2. python统计excel某一列中文字数
  3. 房产中介、房屋租赁、房屋买卖APP(H5)
  4. 上海计算机专业选小三门要求,改革后,上海小三门选科到底应该怎么选?
  5. 各个浏览器a标签href下载文件链接长度过长,导致下载失败解决方案
  6. pr剪辑打开多个项目_强大的PR版本转换神器来了,太厉害了!
  7. python学习04--django集成CAS客户端
  8. Basler相机和pylon viewer 的使用
  9. SSM项目初始化配置示例
  10. 学习笔记1--自动驾驶环境感知概述