Zookeeper 原生客户端、可视化工具 ZooInspector 、Apache Curator
目录
Zookeeper 原生客户端
Apache Curator 开源客户端
可视化客户端工具 ZooInspector
Zookeeper 原生客户端
1、类似 Redis 有多种 Java 客户端操作可以操作 Reids 一样,Zookeeper 也有多种客户端可以操作 ZK 服务器,比如 zookeeper 原生客户端,以及第三方的 ZkClient 和 Curator,其中最受欢迎的是 Netfix 公司开源的 Curator。
这些客户端工具底层无非也是对 Zookeeper 客户端命令 的封装集成。
2、Apache ZooKeeper 官网 API 文档:Apache ZooKeeper - Server 3.6.1 API
一:导入 Apache ZooKeeper 依赖
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.1</version></dependency>
1、ZK 内部依赖如下:
Group / Artifact | Version | Updates |
---|---|---|
commons-lang » commons-lang | 2.6 | 3.11 |
io.netty » netty-handler | 4.1.48.Final | 4.1.51.Final |
io.netty » netty-transport-native-epoll | 4.1.48.Final | 4.1.51.Final |
log4j » log4j | 1.2.17 | 2.13.3 |
org.apache.yetus » audience-annotations | 0.5.0 | 0.12.0 |
org.apache.zookeeper » zookeeper-jute | 3.6.1 | ✔ |
org.slf4j » slf4j-api | 1.7.25 | 1.7.30 |
org.slf4j » slf4j-log4j12 | 1.7.25 | 1.7.30 |
在线演示源码:zookeeper-study/pom.xml at master · wangmaoxiong/zookeeper-study · GitHub
2、推荐直接引入下面 第三方户端 Curator 依赖,因为 Curator 客户端内部也是依赖 zookeeper ,引入 Curator 既能使用第三方的 Curator API 也能使用原生的 Zookeeper AIPI。
二:指定 Logback 日志配置文件,不记录日志时,可以忽略此步骤。
因为 spring-boot-starter-web 依赖中已经有了 slf4j + logback 日志依赖,所以将 zk 依赖的日志全部排除了,改用 logback 日志实现。
在线演示源码:zookeeper-study/logback.xml at master · wangmaoxiong/zookeeper-study · GitHub
三:Apache Zookeeper 客户端常用 API
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) |
创建 Zookeeper 实例对象 connectString:服务器连接地址,多个集群时,用逗号隔开,如:192.168.44.41:2181,192.168.44.42:2181,192.168.44.43:2181 |
synchronized void close() |
1、关闭此客户端对象,客户机关闭后,其会话将变为无效。 2、ZooKeeper 服务器中与会话关联的所有临时节点都将被删除,这些节点(以及它们的父节点)上的监视将被触发。 |
boolean close(int waitForShutdownTimeoutMs) |
1、此方法将等待内部资源释放。 2、waitForShutdownTimeoutMs:等待资源释放的超时(毫秒),使用零或负值跳过等待 3、如果 waitForShutdownTimeout 大于零并且所有资源都已释放,则返回 true |
States getState() | 获取客户端连接的状态,States 是一个枚举,有:CONNECTING,ASSOCIATING,CONNECTED,CONNECTEDREADONLY,CLOSED,AUTH_FAILED,NOT_CONNECTED; |
long getSessionId() | 此 ZooKeeper 客户端实例的会话 id, 返回的值在客户端连接到服务器之前无效,并且在重新连接后可能会更改。 |
List<String> getEphemerals() | 同步获取此会话创建的所有临时节点 |
String create(final String path,byte[] data,List<ACL> acl,CreateMode createMode) | 使用给定路径创建节点,创建成功时,返回创建的节点路径(path) |
Stat exists(String path, boolean watch) | 返回给定路径的节点的状态,如果不存在这样的节点,则返回 null。 |
byte[] getData(String path, boolean watch, Stat stat) |
1、返回给定路径的节点的数据和状态。 2、如果监视(watch)为 true 且调用成功(不引发异常),则将在具有给定路径的节点上保留一个监视, 3、监视将由在节点上修改数据操作触发,会自动触发 new ZooKeeper 时指定的监视器 4、不存在指定路径时,抛出异常 |
List<String> getChildren(String path, boolean watch) |
1、返回给定节点路径(path)的子节点列表。如果 path 节点不存在,则抛出异常 2、如果监视(watch)为 true 且调用成功(没引发异常),则将在具有给定路径的节点上保留一个监视。 3、成功删除给定路径的节点或在节点下创建/删除子节点的操作都将触发监视,会自动触发 new ZooKeeper 时指定的监视器 4、返回的子列表没有排序,也不保证其自然或词法顺序 5、还有很多重载的 getChildren 方法 |
Stat setData(final String path, byte[] data, int version) |
修改节点树 1、如果给定路径(path)的节点存在,且给定版本(version)与节点的版本匹配(如果给定版本为-1,则匹配任何节点的版本),则设置该节点的数据。 |
void delete(final String path, int version) 1、删除具有给定路径的节点,给定的版本必须与该节点的版本匹配(如果给定的版本是-1,则它匹配任何节点的版本) |
四:API 演示源码在线地址:https://github.com/wangmaoxiong/src/test/java/com/wmx/zookeeperstudy/ZookeeperTest.java
Java 客户端操作之前,需要先 启动Zookeeper 服务器。
Apache Curator 开源客户端
1、就像人们不怎么喜欢使用原生的 JDBC 代码一样,人们也不太喜欢使用原生的 zk 客户端,而是喜欢市面上流行的第三方客户端,其中最为流行的就是 Apache Curator,在它们的封装之后,功能更加完善,性能也更强。
连接时无超时重连机制 |
Watcher 注册一次,触发后会自动失效。 |
不支持递归创建树形节点 |
2、Curator 和 Zookeeper 一样,都是 Apache 下面的顶级项目,Curator 官网地址:Apache Curator –
3、使用 Curator 可以导入依赖如下:
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.1.0</version></dependency>
curator-recipes 内部会依赖 curator-framework,curator-framework 会依赖 curator-client,curator-client 会依赖 zookeeper、guava、slf4j-api。 | |
curator-recipes 5.1 内部依赖的是 zookeeper 3.6.0。 |
|
导入了 curator-recipes ,则既可以使用 curator 也可以使用 zookeeper 原生客户端。 |
zookeeper-study/pom.xml at master · wangmaoxiong/zookeeper-study · GitHub
4、Curator 常用 API 如下:
创建 CuratorFramework 实例方式1 |
CuratorFrameworkFactory.newClient(connectString, sessionTimeoutMs, connectionTimeoutMs, retryPolicy); connectString:要连接到的服务器列表 |
创建 CuratorFramework 实例方式2 |
CuratorFrameworkFactory.builder().defaultData("0".getBytes()).connectString(connectString) .sessionTimeoutMs(sessionTimeoutMs).connectionTimeoutMs(connectionTimeoutMs) .retryPolicy(retryPolicy).namespace(namespace).build(); |
RetryPolicy: 重试连接时要使用的策略,这是个超接口,其常用实现类如下: ExponentialBackoffRetry:在重试间隔增加睡眠时间的情况下重试一定次数 BoundedExponentialBackoffRetry:重试次数设置为最大重试次数 RetryForever:永远重试,可设置重试时间间隔 RetryNTimes:重试最多重试次数的策略 RetryOneTime:只重试一次的重试策略 RetryUntilElapsed:在给定的时间段内重试 SessionFailedRetryPolicy:Session 过期的重试策略 |
|
CuratorFramework 常用方法如下 | |
ExistsBuilder checkExists() | 用于检测某个节点是否存在,结果为 null 时表示节点不存在,否则返回节点详细信息 |
CreateBuilder create() | 创建节点 |
T forPath(String path) | 使用给定的路径和客户端的默认数据提交当前的构建操作 |
节点创建模式 {@link CreateMode} |
|
creatingParentContainersIfNeeded() |
1、如果父节点未创建,则使用{@link CreateMode#CONTAINER} -容器节点模式创建 2、容器创建是 ZooKeeper 最新版本中的一个新功能。 3、当容器中的最后一个子节点被删除时,容器将成为服务器在将来某个时候删除的候选节点。 4、比如级联创建的临时节点,当客户端失去连接后,则级联创建的容器父节点也会一并消失 |
creatingParentsIfNeeded() |
1、如果尚未创建任何父节点,则会一并创建这些节点 2、与上面不同,比如级联创建的临时节点,当客户端失去连接后,级联创建的父节点会留下,临时节点被删除 |
inBackground(BackgroundCallback callback) |
1、重载了几个 inBackground 方法,表示在后台执行操作,即异步创建节点 2、callback 是异步创建的回调函数 |
DeleteBuilder delete() |
创建节点删除生成器 注意被删除的节点下不能有子节点,否则异常:KeeperException$NotEmptyException |
deletingChildrenIfNeeded |
如果子节点存在则删除,比如 /summary/port1 1、如果 port1 存在,则会被删除,而 /summary 下即使没有其它节点,自己也不会被删除 2、如果 port1 不存在,则直接异常:KeeperException$NoNodeException |
withVersion(int version) | 根据版本号删除,version 默认为 -1,匹配任何版本,如果版本不匹配,则抛出异常:KeeperException$BadVersionException |
guaranteed() |
解决在服务器上操作可能成功,但在成功将响应返回到客户端之前发生连接失败的边缘情况。 级联删除。 |
GetDataBuilder getData() |
获取节点数据 如果节点不存在,则抛出异常:KeeperException$NoNodeException |
GetChildrenBuilder getChildren() | 获取节点下的子节点 |
SetDataBuilder setData() |
更新节点数据 如果节点不存在,则异常:KeeperException$NoNodeException |
API 在线演示地址:
zookeeper-study/CuratorUtils.java at master · wangmaoxiong/zookeeper-study · GitHub zookeeper-study/CuratorUtilsTest.java at master · wangmaoxiong/zookeeper-study · GitHub |
可视化客户端工具 ZooInspector
1、通过 Zookeeper 客户端命令,以及上面的 zk 客户端,其实自己封装一个可视化的客户端工具也不难,用于连接 zk 服务器,然后对节点的增删改查等操作。如果不想自己封装,也可以使用别人的,比如有一个叫 ZooInspector 。
2、ZooInspector 使用流程:
1)下载 ZooInspector 压缩包:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip 2)解压文件,然后双击 build 目录下的 zookeeper-dev-ZooInspector.jar 可执行文件运行程序 3)启动 ZooInspector 后,点击左上角的绿色按钮,输入 ZK Server 的连接地址即可发起连接。 4) 连接成功后就能看到 ZK 服务器的节点数据信息.。 |
3、ZooInspector 注意事项:
1)此工具能新增节点(默认为不带序列的永久节点,无法新增临时节点以及带序列节点)、删除节点、修改节点、查询节点 2)此工具对中文不友好,如果节点值是中文,则会乱码,同理如果用它创建节点,同时设置的值是中文,其它客户端读到的值就会乱码,显然就是编码不一致引起的。 3)节点值被其它客户端修改之后,此工具都能实时看到。 |
Zookeeper 原生客户端、可视化工具 ZooInspector 、Apache Curator相关推荐
- RedisDesktopManager客户端可视化工具下载安装与使用
场景 Centos中Redis的下载编译与安装(超详细): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Re ...
- Zookeeper原生客户端
1.1.1.1. 客户端基本操作 package cn.enjoy.javaapi; import org.apache.zookeeper.*; import java.io.IOException ...
- Git 客户端 - 可视化工具 Fork 使用
Fork 是什么 当我们在多人协同开发项目的过程中,Git 是必不可少的代码托管工具,但是繁琐的操作命令.抽象的文件状态,多个不同分支需要花费大量的时间进行分配管理与维护,至此 Fork 拥有更简约的 ...
- mongodb官方客户端可视化工具Compass,免费,官方值得信赖
之前一直用的客户端是nosqlbooster4mongo,基本操作还都是挺好用的,但是有一些命令在这个客户端上运行不了,以后要慢慢的替换到compass上. 下载compass 官方下载:https: ...
- Zookeeper Java 客户端 ——Apache Curator
Zookeeper Java 客户端 --Apache Curator 一.基本依赖 二.客户端相关操作 2.1 创建客户端实例 2.2 重试策略 ...
- Python之分享常用的五款动态数据可视化工具
一.Tableau 世界知名的 BI 工具,以超强的可视化能力著称.它已经成为商业 BI 界的 TOP 选手,很多大型公司像阿里.谷歌都在使用,能快速搭建数据系统. 可以通过设置页面动画,来制作动态可 ...
- 聊聊我常用的5款动态数据可视化工具
视频当道的时代,数据可视化自然也要动起来. 我常用的动态可视化工具主要有「Tableau.Echarts.Flourish.Python」这几个,另外加上地图可视化神器「kepler.gl」. 这五款 ...
- ZooKeeper 之Apache Curator 客户端使用
ZooKeeper 原生不足之处: 超时重连,不支持自动,需要手动操作 Watch注册一次后会失效 不支持递归创建节点 Apache Curator apache的开源项目,解决watcher注册一次 ...
- 三款Zookeeper可视化工具、ZooInspector、prettyZoo、ZooKeeperAssistant
三款Zookeeper可视化工具.ZooInspector.prettyZoo.ZooKeeperAssistant ①Zookeeper图形化工具:ZooInspector 1.下载完后,解压压缩包 ...
最新文章
- Android 源码编译相关
- Coredata — 入门使用
- containerd — 容器引擎
- 【Android 逆向】Android 逆向通用工具开发 ( 网络模块开发 | SOCKET 网络套接字初始化 | 读取远程端 “Android 模拟器“ 信息 | 向远程端写出数据 )
- 学习《FreeRTOS源码详解与应用开发》笔记
- 将html转换为pptx,javascript – 将html表导出到客户端的ppt?
- Java基础知识总结(一)
- C语言unit test单元测试类的实现(附完整源码)
- R语言 深圳 面授_「深圳侦探电话」用R语言实现深度学习情感分析
- (原创) 电源滤波为何要用几个不同量级的电容并联?
- JDBC与JNDI应用比较
- Exception处理
- Eclipse断点种类
- 2018年数学建模竞赛-高温作业专用服装设计
- 计算机基础cpu知识,CPU基础知识大全详解
- 理工科专业精品书系列
- java get请求中文_如何解决java中get请求中文乱码的问题
- zblog插件全自动采集伪原创发布插件免费
- 杭电ACM 2000-2099 100道题 详细解题报告出炉
- 读书笔记《学习之道》芭芭拉·奥克利 - 一 书中说了什么
热门文章
- 最大熵阈值python_【6】python-opencv3教程:阈值分割(全阈值分割,局部阈值分割,直方图技术法,熵算法,自适应算法,Otsu算法)...
- 电容相位滞后?电感超前
- 2010年,我发现了淘宝购物省钱的秘密
- 赛车游戏中求解最短路径和最小曲率路径
- 六足蜘蛛机器人+哈尔的移动城堡,一个神奇组合的设计制作!
- 网络安全及安全分析(1)
- python -m http.server 8000
- 企业直播该如何做?硬件设备、网络环境、设备连接和观看权限等整个直播流程教程
- 需求调研报告模板_中国脂肪醇市场需求调研与十四五投资战略规划分析报告2021-2026年...
- C# GDI+绘图(四)实现网格绘制,并填充相应的表格内容