目录
1、Zookeeper简介/快速入门
1.1、应用场景
1.1.1、维护配置信息
1.1.2、分布式锁服务
1.1.3、集群管理
1.1.4、生产分布式唯一ID
1.2、数据模型
1.2.1、结点类型
2、zookeeper单机安装
2.1、zookeeper依赖jdk的,所以必须先安装jdk。
2.2、下载zookeeper
2.3、配置
2.3.1、conf目录中zoo.cfg配置文件参数说明
2.4、启动zookeeper(确保你的机器上8080端口没被占用)
3、节点的操作和说明
3.1、基本命令列表
3.2、简单节点的增删
3.3、节点创建及类型
3.4、节点更新、更新、删除以及查看
3.4.1、节点更新
3.4.2、删除节点
3.5查看节点属性
3.5.1、节点属性说明
3.6、查看节点列表
3.7、节点的监听
3.5、acl权限设置
3.5.1、world权限示例
3.5.2、IP权限示例:
3.5.3、auth模式示例:
3.5.4、Digest授权模式
3.5.5、多种授权模式(仅需逗号隔开 )
3.6、acl 超级管理员
3.6.1、设置超管密码密文:
3.6.2、找到/bin/zkServer.sh服务器脚本文件
3.6.3、添加超管的配置项
3.6.4、修改如下图:(保存后退出)
3.6.5、重启
3.6.6、测试
4、zookeeper的javaAPI
4.1、导入Maven依赖
4.2、zookeeper的链接和节点的操作
4.2.1、zookeeper链接
4.2.2、创建节点
4.2.3、修改节点
4.2.4、删除节点
4.2.5、获取节点数据
4.2.6、查看子节点
4.2.7、判断节点是否存在
ZooKeeper
是一个集中的服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用 。zookeeper
即管理员,顾名思义就算管理大数据生态系统各组件的管理员 。
zookeepepr
是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调存储服务。
维护配置信息
分布式锁服务
集群管理
生成分布式唯一ID
java
编程经常会遇到配置项,比如数据库的url
、 schema
、user
和 password
等 ,但是随着分布式系统的兴起,由于许多服务都需要使用到该配置文件,因此有必须保证该配置服务的高可用性(highavailability
)和各台服务器上配置数据的一致性。 如果再一台台服务器逐个修改配置文件那将是非常繁琐且危险的的操作,zookeeper
提供这样一种服务 ,能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每台服务器上的数据一致性。
一个集群是一个分布式系统,由多台服务器组成。为了提高并发度和可靠性,多台服务器上运行着同一种服务。当多个服务在运行时就需要协调各服务的进度,有时候需要保证当某个服务在进行某个操作时,其他的服务都不能进行该操作,即对该操作进行加锁,如果当前机器挂掉后,释放锁并 fail over
到其他的机器继续执行该服务
一个集群有时会因为各种软硬件故障或者网络故障,出现棊些服务器挂掉而被移除集群,而某些服务器加入到集群中的情况,zookeeper
会将这些服务器加入/移出的情况通知给集群中的其他正常工作的服务器,以及时调整存储和计算等任务的分配和执行等。此外zookeeper
还会对故障的服务器做出诊断并尝试修复。
zookeeper
在分布式环境下生成全局唯一ID
,每次要生成一个新id
时,创建一个持久顺序节点,创建操作返回的节点序号,即为新id
,然后把比自己节点小的删除即可 。
zookeeper
的数据结点可以视为树状结构(或目录),树中的各个结点被称为znode
(即zookeeper node
),一个znode
可以由多个子结点。zookeeper
结点在结构上表现为树状;
zookeeper
中的结点有两种,分别为临时结点和永久结点。结点的类型在创建时被确定,并且不能改变
临时节点:
该节点的生命周期依赖于创建它们的会话。一旦会话( Session
)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的 Znode
都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,Zookeeper
的临时节点不允许拥有子节点
持久化结点:
该结点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,它们才能被删除
https://blog.csdn.net/yisuyanyu/article/details/104326601
#进入/usr/local下创建zookeeper目录
mkdir zookeeper
#进入zookeeper目录,下载zookeeper
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
#解压
tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz
#重命名
mv apache-zookeeper-3.6.1-bin.tar.gz zookeeper
# 进入conf目录
cd /usr/local/zookeeper/zookeeper/conf
# 复制配置文件
cp zoo_sampe.cfg zoo.cfg
# zookeeper 根目录下创建data目录
mkdir data
# vi 配置文件中的dataDir
# 此路径用于存储zookeeper中数据的内存快照、及事务日志文件,虽然zookeeper是使用内存的,但是需要持久化一些数据来保证数据的安全,和redis一样
dataDir=/usr/local/zookeeper/zookeeper/data
# zookeeper时间配置中的基本单位 (毫秒)
tickTime=2000
# 允许follower初始化连接到leader最大时长,它表示tickTime时间倍数 即:initLimit*tickTime
initLimit=10
# 允许follower与leader数据同步最大时长,它表示tickTime时间倍数
syncLimit=5
#zookeper 数据存储目录
dataDir=/usr/local/zookeeper/zookeeper/data
#对客户端提供的端口号
clientPort=2181
#单个客户端与zookeeper最大并发连接数
maxClientCnxns=60
# 保存的数据快照数量,之外的将会被清除
autopurge.snapRetainCount=3
#自动触发清除任务时间间隔,小时为单位。默认为0,表示不自动清除。
autopurge.purgeInterval=1
# 进入zookeeper的bin目录
cd /usr/local/zookeeper/zookeeper/bin
# 启动zookeeper
./zkServer.sh start
# 启动: zkServer.sh start
# 停止: zkServer.sh stop
# 查看状态:zkServer.sh status
# 进入zookeeper 内部
./zkCli.sh
1、关闭当前会话
close
2、重新连接指定Zookeeper服务
connect host:port
3、创建节点
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
4、删除节点,(不能存在子节点)
delete [-v version] path
5、删除路径及所有子节点
deleteall path
6、设置节点限额 -n 子节点数 -b 字节数
setquota -n|-b val path
7、查看节点限额
listquota path
8、删除节点限额
delquota [-n|-b] path
9、查看节点数据 -s 包含节点状态 -w 添加监听
get [-s] [-w] path
10、列出子节点 -s状态 -R 递归查看所有子节点 -w 添加监听
getAcl [-s] path
ls [-s] [-w] [-R] path
11、是否打印监听事件
printwatches on|off
12、退出客户端
quit
13、查看执行的历史记录
history
14、重复 执行命令,history 中命令编号确定
redo cmdno
15、删除指定监听
removewatches path [-c|-d|-a] [-l]
16、设置值
set [-s] [-v version] path data
17、为节点设置ACL权限
setAcl [-s] [-v version] [-R] path acl
18、查看节点状态 -w 添加监听
stat [-w] path
19、强制同步节点
sync path
node数据的增删改查
# 列出子节点
ls /
#创建节点
create /test "test001"
# 查看节点
get /test
# 创建子节点
create /test/testchil "testchild001"
#查看子节点信息
get /test/testchil
# 删除节点
delete /test/testchil
# 删除所有节点 包括子节点
deleteall /test
节点类型:
类型 |
描述 |
使用场景 | 创建方式 |
PERSISTENT |
持久节点 |
默认创建 |
create /test0 |
PERSISTENT_SEQUENTIAL |
持久序号节点 |
适合用于分布式锁、分布式选举等场景 |
create -s /test1 |
EPHEMERAL |
临时节点(不可在拥有子节点) |
临时节点会在客户端会话断开后自动删除。适用于心跳,服务发现等场景。 |
create -e /test2
|
EPHEMERAL_SEQUENTIAL |
临时序号节点(不可在拥有子节点) |
与持久序号节点类似,不同之处在于是临时的会在会话断开后删除。创建时添加 -e -s |
create -e -s /test3 |
如图,创建有序节点时,会返回创建的实际路径。也可以使用同一个创建方式,会递增增长。
#创建序号节点
create -s /test
#返回创建的实际路径
Created /test0000000001
create -s /test
#返回创建的实际路径2
Created /test0000000002
set path -v[version]
set /test0 "update test0" # 修改结点值
# 也可以基于版本号进行更改,类似于乐观锁,当传入版本号(dataVersion)
# 和当前结点的数据版本号不一致时,zookeeper会拒绝本次修改
set /test0 "up001" -v 1
delete path -v[version]
delete /test0 # 删除结点
delete /test0 -v 1 # 乐观锁机制,与set 方法一致
#查看节点属性
stat /test0
结点的各个属性如下。其中重要的概念是Zxid(Zookeeper Transaction ID)
,Zookeeper
结点的每一次更改都具有唯一的Zxid
,如果Zxid-1
小于Zxid-2
,则Zxid-1
的更改发生在 Zxid-2
更改之前
https://zookeeper.apache.org/doc/r3.4.14/zookeeperProgrammers.html#sc_zkDataModel_znodes
参数 | 参数说明 |
cZxid |
数据结点创建时的事务ID——针对于zookeeper 数据结点的管理:我们对结点数据的一些写操作都会导致zookeeper 自动地为我们去开启一个事务,并且自动地去为每一个事务维护一个事务ID |
ctime |
数据结点创建时的时间 |
mZxid |
数据结点最后一次更新时的事务ID |
mtime |
数据结点最后一次更新时的时间 |
pZxid |
数据节点最后一次修改此znode 子节点更改的zxid |
cversion |
子结点的更改次数 |
dataVersion |
结点数据的更改次数 |
aclVersion |
结点的ACL更改次数——类似linux 的权限列表,维护的是当前结点的权限列表被修改的次数 |
ephemeralOwner |
如果结点是临时结点,则表示创建该结点的会话的 如果是持久结点,该属性值为0;例如:ephemeralOwner = 0x0 |
dataLength |
数据内容的长度 |
numChildren |
数据结点当前的子结点个数 |
ls /test01 # 可以查看结点的列表
ls -s 2 /test01 # 可以查看结点的列表以及目标结点的信息
ls / # 根节点
客户添加 -w 参数可实时监听节点与子节点的变化,并且实时收到通知。非常适用保障分布式情况下的数据一至性。
命令 |
描述 |
ls -w path |
监听子节点的变化(增,删) |
get -w path |
监听节点数据的变化 |
stat -w path |
监听节点属性的变化 |
printwatches on|off |
触发监听后,是否打印监听事件(默认on) |
测试:
ACL全称为Access Control List(访问控制列表),用于控制资源的访问权限。基于scheme:id:permission的方式进行权限控制。scheme表示授权模式、id授权对象、permission即具体的增删改权限位。
例如:setAcl /test2 ip:192.168.133.133:crwda
// 将结点权限设置为Ip:192.168.133.133 的客户端可以对节点进行增删改查和管理权限
scheme:认证模型
方案 |
描述 |
world |
开放模式,world表示全世界都可以访问(这是默认设置) |
ip |
ip模式,限定客户端IP防问 |
auth |
用户密码认证模式,只有在会话中添加了认证才可以防问 |
digest |
与auth类似,区别在于auth用明文密码,而digest 用sha-1+base64加密后的密码。在实际使用中digest 更常见。 |
permission权限位
权限位 |
权限 |
描述 |
c |
CREATE |
可以创建子节点 |
d |
DELETE |
可以删除子节点(仅下一级节点) |
r |
READ |
可以读取节点数据及显示子节点列表 |
w |
WRITE |
可以设置节点数据 |
a |
ADMIN |
可以设置节点访问控制列表权限 |
acl 相关命令:
命令 |
使用方式 |
描述 |
getAcl |
getAcl |
读取ACL权限 |
setAcl |
setAcl |
设置ACL权限 |
addauth |
addauth |
添加认证用户 |
语法: setAcl
注:world模式中anyone是唯一的值,表示所有人
1、查看默认节点权限:
#创建一个节点
create -e /testAcl
#查看节点权限
getAcl /testAcl
#返回的默认权限表示 ,所有人拥有所有权限。
'world,'anyone: cdrwa
2、改默认权限为 读写
#设置为rw权限
setAcl /testAcl world:anyone:rw
# 可以正常读
get /testAcl
# 无法正常创建子节点
create -e /testAcl/t "hi"
# 返回没有权限的异常
Authentication is not valid : /testAcl/t
语法: setAcl
setAcl /node1 ip:192.168.1.6:cdrwa
IP为192.168.1.6的机器,对这个节点操作如下:
#链接IP为192.168.1.7的zookeeper。
./zkCli.sh -server 192.168.1.7
#对节点进行操作,测试将权限给1.7
./zkCli.sh -server 192.168.1.7
语法:
create /hadoop "hadoop" # 初始化测试用的结点
addauth digest itcast:123456 # 添加认证用户
setAcl /hadoop auth:itcast:cdrwa # 设置认证用户
quit # 退出后
./zkCli.sh -server 192.168.1.7 # 再进入
get /hadoop # 这个时候就没有权限了,需要再次认证
addauth digest itcast:123456 # 认证,密码错了的话 zookeeper 不会报错,但是不能认证
get /hadoop
语法:setAcl
密钥注册 通过sha1与base64组合加密码生成,可通过以下命令生成(新开一个窗口)
echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64
# 计算密码
echo -n itcast:12345 | openssl dgst -binary -sha1 | openssl base64
# 获取密码,设置权限列表
setAcl /hadoop digest:itcast:qUFSHxJjItUW/93UHFXFVGlvryY=:cdrwa
#此时获取get /hadoop信息就无法获取到
# 现在想要get /hadoop 需要登录授权
addauth digest itcast:12345
get /hadoop
setAcl /hadoop ip:192.168.1.6:cdrwa,auth:hadoop:cdrwa,digest:itcast:673OfZhUE8JEFMcu0l64qI8e5ek=:cdrwa
zookeeper
的权限管理模式有一种叫做super
,该模式提供一个超管,可以方便的访问任何权限的节点
假设这个超管是supper:admin
,需要为超管生产密码的密文
echo -n super:admin | openssl dgst -binary -sha1 | openssl base64
/bin/zkServer.sh
服务器脚本文件#进入zkServer运行文件
vim zkServer.sh
# 快速查找,可以看到如下
/nohup
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="
./zkServer.sh restart
setAcl /ceshi ip:192.168.1.1:cdrwa # 这个ip并非本机
# 现在当前用户没有权限了
getAcl /ceshi
# 登录超管
addauth digest super:admin
# 强行操作节点
get /ceshi
org.springframework.boot
spring-boot-starter-freemarker
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-starter-test
test
org.apache.zookeeper
zookeeper
3.6.1
com.101tec
zkclient
zookeeper
org.apache.zookeeper
log4j
log4j
slf4j-log4j12
org.slf4j
slf4j-api
org.slf4j
0.11
junit
junit
4.12
org.springframework.boot
spring-boot-maven-plugin
/**
* 参数说明:
* connectionString:zookeeper `主机
* sessionTimeout:会话超时
* watcher:实现"监听器" 对象。`zookeeper`集合通过监视器对象返回连接状态
*/
@Test
public void getZookeeper()throws Exception{
//计数器对象
CountDownLatch cou=new CountDownLatch(1);
ZooKeeper zooKeeper = new ZooKeeper("192.168.1.7", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState()==Event.KeeperState.SyncConnected){
System.out.println("链接创建成功!");
//释放阻塞
cou.countDown();
}
}
});
//阻塞主线程,等待链接对象创建成功
cou.await();
//会话编号
long id = zooKeeper.getSessionId();
System.out.println(id);
zooKeeper.close();
}
// 同步
create(String path, byte[] data, List acl, CreateMode createMode)
// 异步
create(String path, byte[] data, List acl, CreateMode createMode,
AsynCallback.StringCallback callBack, Object ctx)
4.2.2.1、参数说明
参数 | 解释 |
---|---|
path |
znode 路径 |
data |
数据 |
acl |
要创建的节点的访问控制列表。zookeeper API 提供了一个静态接口 ZooDefs.Ids 来获取一些基本的acl 列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE 返回打开znode 的acl 列表 |
createMode |
节点的类型,这是一个枚举 |
callBack |
异步回调接口 |
ctx |
传递上下文参数 |
4.2.2.2、测试前准备
//引入juit,运用@Before和@After注解
private static ZooKeeper zooKeeper ;
@Before
public void before()throws Exception{
CountDownLatch cou=new CountDownLatch(1);
zooKeeper = new ZooKeeper("192.168.1.7", 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState()==Event.KeeperState.SyncConnected){
System.out.println("链接创建成功!");
//释放阻塞
cou.countDown();
}
}
});
cou.await();
}
@After
public void after() throws Exception {
zooKeeper.close();
}
4.2.2.4、节点创建
类型 | 说明 |
|
持久化节点 |
|
持久化有序节点,创建后,会有一个string返回值。 |
|
临时节点 |
|
临时有序节点 |
// 枚举的方式
@Test
public static void createTest1() throws Exception{
String str = "node";
// CreateMode.PERSISTENT代表持久化节点
String s = zookeeper.create("/node", str.getBytes(),
ZooDefs.Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);
}
//自定义方式
@Test
public void test03()throws Exception{
//world授权模式
//权限列表
List list=new ArrayList<>();
//授权模式和授权对象
Id id=new Id("world","anyone");
//权限设置
list.add(new ACL(ZooDefs.Perms.READ,id));
list.add(new ACL(ZooDefs.Perms.WRITE,id));
zooKeeper.create("/node3","333".getBytes(),list,CreateMode.PERSISTENT);
}
/**
* auth 添加用户授权限制
*/
@Test
public static void test04() throws Exception{
zooKeeper.addAuthInfo("digest","itcast:12345".getBytes());
zooKeeper.create("/node5","node5".getBytes(),
ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);
}
/**
* auth授权模式,并对这个用户设置成只读权限
*/
@Test
public static void test05() throws Exception{
//添加授权用户
zooKeeper.addAuthInfo("digest","itcast:12345".getBytes());
List acls = new ArrayList<>();
Id id = new Id("auth","itcast");
//设置成只读权限
acls.add(new ACL(ZooDefs.Perms.READ,id));
zooKeeper.create("/node6","node6".getBytes(),acls,CreateMode.PERSISTENT);
}
/**
* digest模式设置加密密码方式
* @throws Exception
*/
@Test
public static void test06() throws Exception{
List acls = new ArrayList<>();
Id id = new Id("digest","usertest:qUFSHxJjItUW/93UHFXFVGlvryY=");
acls.add(new ACL(ZooDefs.Perms.READ,id));
zooKeeper.create("/node7","node7".getBytes(),acls,CreateMode.PERSISTENT);
}
/**
* CreateMode.PERSISTENT_SEQUENTIAL 创建一个有序的持久化节点
* @throws Exception
*/
@Test
public void test06() throws Exception{
//权限列表
List list=new ArrayList<>();
//授权模式和授权对象
Id id=new Id("world","anyone");
//权限设置
list.add(new ACL(ZooDefs.Perms.READ,id));
list.add(new ACL(ZooDefs.Perms.WRITE,id));
String s = zooKeeper.create("/node8", "node8".getBytes(), list, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(s);
//打印结果/node80000000018
}
/**
* 通过异步的方式创建节点。
* 通过new AsyncCallback.StringCallback()监听节点是否创建成功。
* 通过监听判断节点创建是否成功,然后做后续逻辑
*/
@Test
public void test07() throws Exception{
zooKeeper.create("/node12", "node12".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback(){
/**
* @param rc 状态,0 则为成功,以下的所有示例都是如此
* @param path 节点路径
* @param ctx 上下文参数
* @param name 路径
*/
public void processResult(int rc, String path, Object ctx, String name){
System.out.println(rc + " " + path + " " + name + " " + ctx);
}
}, "I am context");
TimeUnit.SECONDS.sleep(1);
System.out.println("结束");
}
// 同步
setData(String path, byte[] data, int version)
// 异步
setData(String path, byte[] data, int version, StatCallback callBack, Object ctx)
参数说明:
参数 | 解释 |
---|---|
path |
节点路径 |
data |
数据 |
version |
数据的版本号, -1 代表不使用版本号,乐观锁机制 |
callBack |
异步回调 AsyncCallback.StatCallback ,和之前的回调方法参数不同,这个可以获取节点状态 |
ctx |
传递上下文参数 |
/**
* 同步更新节点
*/
@Test
public void test08() throws Exception{
// arg1:节点的路径
// arg2:修改的数据
// arg3:数据的版本号 -1 代表版本号不参与更新
//返回值stat,可以返回当前节点的属性信息(例如命令的stat path)
Stat stat = zooKeeper.setData("/hadoop","2222".getBytes(),-1);
System.out.println("获取当前节点的版本信息--->"+stat.getVersion());
}
/**
* 异步更新节点
*/
@Test
public void test09() throws Exception{
//当前节点的版本号是2,如果给3的话,就会报错,成功与否调用下面callback方法
zooKeeper.setData("/hadoop", "33333".getBytes(), 2 ,new AsyncCallback.StatCallback(){
@Override
public void processResult(int rc, String path, Object ctx, Stat stat) {
if(rc==0){//表示成功
System.out.println(rc + " " + path + " " + stat.getVersion() + " " + ctx);
}else{//表示失败,stat为null
System.out.println(rc + " " + path + " "+ " " + ctx);
}
}
}, "I am context");
}
// 同步
delete(String path, int version)
// 异步
delete(String path, int version, AsyncCallback.VoidCallback callBack, Object ctx)
参数说明
参数 | 解释 |
---|---|
path |
节点路径 |
version |
版本 |
callBack |
数据的版本号, -1 代表不使用版本号,乐观锁机制 |
ctx |
传递上下文参数 |
//同步删除
public void test10() throws Exception {
zookeeper.delete("/hadoop", 1);
}
//异步删除
public void test11() throws Exception {
zookeeper.delete("/hadoop", 1, new AsyncCallback.VoidCallback() {
@Override
public void processResult(int rc, String path, Object ctx) {
System.out.println(rc + " " + path + " " + ctx);
}
}, "I am context");
TimeUnit.SECONDS.sleep(1);
}
// 同步
getData(String path, boolean watch, Stat stat)
getData(String path, Watcher watcher, Stat stat)
// 异步
getData(String path, boolean watch, DataCallback callBack, Object ctx)
getData(String path, Watcher watcher, DataCallback callBack, Object ctx)
参数说明:
参数 | 解释 |
---|---|
path |
节点路径 |
boolean |
是否使用连接对象中注册的监听器 |
stat |
元数据 |
callBack |
异步回调接口,可以获得状态和数据 |
ctx |
传递上下文参数 |
/**
* 获取节点数据,及属性(同步获取)
*/
@Test
public void test02()throws Exception{
Stat stat = new Stat();
byte[] data = zookeeper.getData("/hadoop", false, stat);
System.out.println(new String(data));
// 判空
System.out.println(stat.getCtime());
}
/**
*获取节点数据,及属性(异步获取)
*/
@Test
public void test03() throws Exception {
zookeeper.getData("/hadoop", false, new AsyncCallback.DataCallback() {
@Override
public void processResult(int rc, String path, Object ctx, byte[] bytes, Stat stat) {
// 判空
System.out.println(rc + " " + path+ " " + ctx + " " + new String(bytes) + " " +stat.getCzxid());
}
}, "I am context");
TimeUnit.SECONDS.sleep(3);
}
// 同步
getChildren(String path, boolean watch)
getChildren(String path, Watcher watcher)
getChildren(String path, boolean watch, Stat stat)
getChildren(String path, Watcher watcher, Stat stat)
// 异步
getChildren(String path, boolean watch, ChildrenCallback callBack, Object ctx)
getChildren(String path, Watcher watcher, ChildrenCallback callBack, Object ctx)
getChildren(String path, Watcher watcher, Children2Callback callBack, Object ctx)
getChildren(String path, boolean watch, Children2Callback callBack, Object ctx)
参数说明:
参数 | 解释 |
---|---|
path |
节点路径 |
boolean |
添加监听 |
callBack |
异步回调,可以获取节点列表 |
ctx |
传递上下文参数 |
/**
* 获取当前节点下的所有子节点(同步)
*/
@Test
public void test04() throws Exception{
List hadoop = zookeeper.getChildren("/hadoop", false);
hadoop.forEach(System.out::println);
}
/**
* 获取当前节点下的所有子节点(异步)
*/
@Test
public void test05() throws Exception {
zookeeper.getChildren("/hadoop", false, new AsyncCallback.ChildrenCallback() {
@Override
public void processResult(int rc, String path, Object ctx, List list) {
list.forEach(System.out::println);
System.out.println(rc + " " + path + " " + ctx);
}
}, "I am children");
TimeUnit.SECONDS.sleep(3);
}
// 同步
exists(String path, boolean watch)
exists(String path, Watcher watcher)
// 异步
exists(String path, boolean watch, StatCallback cb, Object ctx)
exists(String path, Watcher watcher, StatCallback cb, Object ctx)
参数说明:
参数 | 解释 |
---|---|
path |
节点路径 |
boolean |
|
callBack |
异步回调,可以获取节点列表 |
ctx |
传递上下文参数 |
/**
* 判断节点是否存在(同步)
*/
@Test
public void test06() throws Exception{
Stat exists = zookeeper.exists("/hadoop", false);
// 判空
if(exists!=null){
System.out.println(exists.getVersion() + "成功");
}else{
System.out.println("失败");
}
}
/**
* 判断节点是否存在(异步)
*/
@Test
public void test07() throws Exception{
zookeeper.exists("/hadoopx", false, new AsyncCallback.StatCallback() {
@Override
public void processResult(int rc, String path, Object ctx, Stat stat) {
// 判空
System.out.println(rc + " " + path + " " + ctx +" " + stat.getVersion());
}
}, "I am children");
TimeUnit.SECONDS.sleep(1);
}