1、zookeeper安装和基础

目录

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、判断节点是否存在



1、Zookeeper简介/快速入门

ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用 。zookeeper即管理员,顾名思义就算管理大数据生态系统各组件的管理员 。

1.1、应用场景

zookeepepr是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具有严格顺序访问控制能力的分布式协调存储服务。

  • 维护配置信息

  • 分布式锁服务

  • 集群管理

  • 生成分布式唯一ID

1.1.1、维护配置信息

java编程经常会遇到配置项,比如数据库的urlschemauserpassword等 ,但是随着分布式系统的兴起,由于许多服务都需要使用到该配置文件,因此有必须保证该配置服务的高可用性(highavailability)和各台服务器上配置数据的一致性。 如果再一台台服务器逐个修改配置文件那将是非常繁琐且危险的的操作,zookeeper提供这样一种服务能够高效快速且可靠地完成配置项的更改等操作,并能够保证各配置项在每台服务器上的数据一致性。

1.1.2、分布式锁服务

一个集群是一个分布式系统,由多台服务器组成。为了提高并发度和可靠性,多台服务器上运行着同一种服务。当多个服务在运行时就需要协调各服务的进度,有时候需要保证当某个服务在进行某个操作时,其他的服务都不能进行该操作,即对该操作进行加锁,如果当前机器挂掉后,释放锁并 fail over到其他的机器继续执行该服务

1.1.3、集群管理

一个集群有时会因为各种软硬件故障或者网络故障,出现棊些服务器挂掉而被移除集群,而某些服务器加入到集群中的情况,zookeeper会将这些服务器加入/移出的情况通知给集群中的其他正常工作的服务器,以及时调整存储和计算等任务的分配和执行等。此外zookeeper还会对故障的服务器做出诊断并尝试修复。

1.1.4、生产分布式唯一ID

zookeeper在分布式环境下生成全局唯一ID ,每次要生成一个新id时,创建一个持久顺序节点,创建操作返回的节点序号,即为新id,然后把比自己节点小的删除即可 。

1.2、数据模型

zookeeper的数据结点可以视为树状结构(或目录),树中的各个结点被称为znode(即zookeeper node),一个znode可以由多个子结点。zookeeper结点在结构上表现为树状;

1、zookeeper安装和基础_第1张图片

1.2.1、结点类型

zookeeper中的结点有两种,分别为临时结点永久结点。结点的类型在创建时被确定,并且不能改变

  • 临时节点:

    • 该节点的生命周期依赖于创建它们的会话。一旦会话( Session)结束,临时节点将被自动删除,当然可以也可以手动删除。虽然每个临时的 Znode都会绑定到一个客户端会话,但他们对所有的客户端还是可见的。另外,Zookeeper的临时节点不允许拥有子节点

  • 持久化结点:

    • 该结点的生命周期不依赖于会话,并且只有在客户端显示执行删除操作的时候,它们才能被删除

2、zookeeper单机安装

2.1、zookeeper依赖jdk的,所以必须先安装jdk。

https://blog.csdn.net/yisuyanyu/article/details/104326601

2.2、下载zookeeper

#进入/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

2.3、配置

# 进入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

1、zookeeper安装和基础_第2张图片

2.3.1、conf目录中zoo.cfg配置文件参数说明

# 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

2.4、启动zookeeper(确保你的机器上8080端口没被占用)

# 进入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、zookeeper安装和基础_第3张图片

3、节点的操作和说明

3.1、基本命令列表

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

3.2、简单节点的增删

node数据的增删改查
# 列出子节点 
ls /
#创建节点
create /test "test001"
# 查看节点
get /test
# 创建子节点 
create /test/testchil "testchild001"
#查看子节点信息
get /test/testchil
# 删除节点
delete /test/testchil
# 删除所有节点 包括子节点
deleteall /test

1、zookeeper安装和基础_第4张图片

3.3、节点创建及类型

节点类型:

类型

描述

使用场景 创建方式

PERSISTENT

持久节点

默认创建

create /test0

PERSISTENT_SEQUENTIAL

持久序号节点

适合用于分布式锁、分布式选举等场景

create -s /test1

EPHEMERAL

临时节点(不可在拥有子节点)

临时节点会在客户端会话断开后自动删除。适用于心跳,服务发现等场景。

 

create -e /test2

 

EPHEMERAL_SEQUENTIAL

临时序号节点(不可在拥有子节点)

与持久序号节点类似,不同之处在于是临时的会在会话断开后删除。创建时添加 -e -s

create -e -s /test3

1、zookeeper安装和基础_第5张图片

如图,创建有序节点时,会返回创建的实际路径。也可以使用同一个创建方式,会递增增长。

#创建序号节点

create -s /test

#返回创建的实际路径

Created /test0000000001

create -s /test

#返回创建的实际路径2

Created /test0000000002

3.4、节点更新、更新、删除以及查看

3.4.1、节点更新

set path -v[version]

set /test0 "update test0"        # 修改结点值

# 也可以基于版本号进行更改,类似于乐观锁,当传入版本号(dataVersion)
# 和当前结点的数据版本号不一致时,zookeeper会拒绝本次修改
set /test0 "up001" -v 1 

3.4.2、删除节点

delete path -v[version]

delete /test0           # 删除结点
delete /test0 -v 1         # 乐观锁机制,与set 方法一致

1、zookeeper安装和基础_第6张图片

3.5查看节点属性

#查看节点属性
stat /test0

3.5.1、节点属性说明

1、zookeeper安装和基础_第7张图片

结点的各个属性如下。其中重要的概念是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

如果结点是临时结点,则表示创建该结点的会话的SessionID;例如:ephemeralOwner = 0x10008f209510003

如果是持久结点,该属性值为0;例如:ephemeralOwner = 0x0

dataLength 数据内容的长度
numChildren 数据结点当前的子结点个数

3.6、查看节点列表

ls /test01               # 可以查看结点的列表
ls -s 2 /test01          # 可以查看结点的列表以及目标结点的信息
ls /                     # 根节点

1、zookeeper安装和基础_第8张图片

3.7、节点的监听

客户添加 -w 参数可实时监听节点与子节点的变化,并且实时收到通知。非常适用保障分布式情况下的数据一至性。

命令

描述

ls -w path  

监听子节点的变化(增,删)

get -w path

监听节点数据的变化

stat -w path

监听节点属性的变化

printwatches on|off

触发监听后,是否打印监听事件(默认on)

测试:

1、zookeeper安装和基础_第9张图片

3.5、acl权限设置

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

添加认证用户

3.5.1、world权限示例

语法: setAcl world:anyone:<权限位>

注: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

1、zookeeper安装和基础_第10张图片

3.5.2、IP权限示例:

语法: setAcl ip::<权限位>

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

1、zookeeper安装和基础_第11张图片

3.5.3、auth模式示例:

语法: 

  1. 添加认证用户:addauth digest <用户名>:<密码>
  2. 设置用户对这个节点的操作权限:setAcl auth:<用户名>:<密码>:<权限位>
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

1、zookeeper安装和基础_第12张图片

3.5.4、Digest授权模式

语法:setAcl digest::<加密过的password>:

密钥注册 通过sha1与base64组合加密码生成,可通过以下命令生成(新开一个窗口)

echo -n <用户名>:<密码> | openssl dgst -binary -sha1 | openssl base64

1、zookeeper安装和基础_第13张图片

# 计算密码
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

3.5.5、多种授权模式(仅需逗号隔开

setAcl /hadoop ip:192.168.1.6:cdrwa,auth:hadoop:cdrwa,digest:itcast:673OfZhUE8JEFMcu0l64qI8e5ek=:cdrwa

3.6、acl 超级管理员

zookeeper的权限管理模式有一种叫做super,该模式提供一个超管,可以方便的访问任何权限的节点

假设这个超管是supper:admin,需要为超管生产密码的密文

3.6.1、设置超管密码密文:

echo -n super:admin | openssl dgst -binary -sha1 | openssl base64

3.6.2、找到/bin/zkServer.sh服务器脚本文件

#进入zkServer运行文件
vim zkServer.sh
# 快速查找,可以看到如下
/nohup 
nohup "$JAVA" "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"

3.6.3、添加超管的配置项

"-Dzookeeper.DigestAuthenticationProvider.superDigest=super:xQJmxLMiHGwaqBvst5y6rkB6HQs="

3.6.4、修改如下图:(保存后退出)

1、zookeeper安装和基础_第14张图片

3.6.5、重启

./zkServer.sh restart

3.6.6、测试

setAcl /ceshi ip:192.168.1.1:cdrwa # 这个ip并非本机
# 现在当前用户没有权限了
getAcl /ceshi
# 登录超管
addauth digest super:admin
# 强行操作节点
get /ceshi

1、zookeeper安装和基础_第15张图片

 

4、zookeeper的javaAPI

4.1、导入Maven依赖


		
			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
			
		
	

4.2、zookeeper的链接和节点的操作

4.2.1、zookeeper链接

    /**
	 * 参数说明:
	 * 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(); 
	}

4.2.2、创建节点

// 同步
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返回打开znodeacl列表
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、节点创建

类型 说明
CreateMode.PERSISTENT
持久化节点
CreateMode.PERSISTENT_SEQUENTIAL
持久化有序节点,创建后,会有一个string返回值。
CreateMode.EPHEMERAL
临时节点
CreateMode.EPHEMERAL_SEQUENTIAL
临时有序节点
// 枚举的方式
    @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("结束");
    }

4.2.3、修改节点

// 同步
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");
    }

4.2.4、删除节点

// 同步
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);
    }

4.2.5、获取节点数据

// 同步
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);
    }

4.2.6、查看子节点

// 同步
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);
    }

4.2.7、判断节点是否存在

// 同步
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);
    }

 

 

 

 

 

 

 

你可能感兴趣的:(zookeeper)