Zookeeper
zookeeper 提供了java与C两种语言的客户端。在此学习的就是java客户端。
引入最新的maven依赖:
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.5.5</version></dependency>
知识点:
- 初始连接
- 创建、查看节点
- 监听节点
- 设置节点权限
- 第三方客户端ZkClient
1.初始连接
常规的客户端类是 org.apache.zookeeper.ZooKeeper,实例化该类之后将会自动与集群建立连接。构造参数说明如下:
参数名称 | 类型 | 说明 |
---|---|---|
connectString | String | 连接串,包括ip+端口 ,集群模式下用逗号隔开 192.168.0.149:2181,192.168.0.150:2181 |
sessionTimeout | **int ** | 会话超时时间,该值不能超过服务端所设置的minSessionTimeout 和maxSessionTimeout |
watcher | Watcher | 会话监听器,服务端事件将会触该监听 |
sessionId | **long ** | 自定义会话ID |
sessionPasswd | byte[] | 会话密码 |
canBeReadOnly | **boolean ** | 该连接是否为只读的 |
hostProvider | HostProvider | 服务端地址提供者,指示客户端如何选择某个服务来调用,默认采用StaticHostProvider实现 |
2.创建、查看节点
创建节点
通过org.apache.zookeeper.ZooKeeper#create()即可创建节点,其参数说明如下:
参数名称 | 类型 | 说明 |
---|---|---|
path | String | |
data | byte[] | |
acl | List | |
createMode | CreateMode | |
cb | StringCallback | |
ctx | Object |
查看节点:
通过org.apache.zookeeper.ZooKeeper#getData()即可创建节点,其参数说明如下:
参数名称 | 类型 | 说明 |
---|---|---|
path | String | |
watch | **boolean ** | |
watcher | Watcher | |
cb | DataCallback | |
ctx | Object |
查看子节点:
通过org.apache.zookeeper.ZooKeeper#getChildren()即可获取子节点,其参数说明如下:
参数名称 | 类型 | 说明 |
---|---|---|
path | String | |
watch | **boolean ** | |
watcher | Watcher | |
cb | Children2Callback | |
ctx | Object |
3.监听节点
在getData() 与getChildren()两个方法中可分别设置监听数据变化和子节点变化。通过设置watch为true,当前事件触发时会调用zookeeper()构建函数中Watcher.process()方法。也可以添加watcher参数来实现自定义监听。一般采用后者。
注:所有的监听都是一次性的,如果要持续监听需要触发后在添加一次监听。
4.设置节点ACL权限
ACL包括结构为scheme?permission(有关ACL的介绍参照第一节课关于ACL的讲解)
客户端中由org.apache.zookeeper.data.ACL 类表示,类结构如下:
- ACL
- Id
- scheme // 对应权限模式scheme
- id // 对应模式中的id值
- scheme // 对应权限模式scheme
- perms // 对应权限位permission
关于权限位的表示方式:
每个权限位都是一个唯一数字,将其合时通过或运行生成一个全新的数字即可
@InterfaceAudience.Public public interface Perms { int READ = 1 << 0; int WRITE = 1 << 1; int CREATE = 1 << 2; int DELETE = 1 << 3; int ADMIN = 1 << 4; int ALL = READ | WRITE | CREATE | DELETE | ADMIN; }
5.第三方客户端ZkClient
zkClient 是在zookeeper客户端基础之上封装的,使用上更加友好。主要变化如下:
- 可以设置持久监听,或删除某个监听
- 可以插入JAVA对象,自动进行序列化和反序列化
- 简化了基本的增删改查操作。
实践
配置日志文件
添加log4j.properties配置文件
### set log levels ### log4j.rootLogger = info,stdout### 输出到控制台 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c:%L- %m%n
测试代码
import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;import org.junit.Before;import org.junit.Test;import java.io.IOException;publicclassZooKeeperTest{ ZooKeeper zooKeeper;@Beforepublicvoidinit()throws IOException{ String conn="1.1.1.12:2181"; zooKeeper=newZooKeeper(conn,4000,newWatcher(){publicvoidprocess(WatchedEvent watchedEvent){ System.out.println("默认监听器!"); System.out.println(watchedEvent.getPath());}});}@TestpublicvoidtestGetData()throws KeeperException, InterruptedException{byte[] data= zooKeeper.getData("/test",false, null); System.out.println(newString(data));}/** * 使用监听器 */@TestpublicvoidtestGetData2()throws KeeperException, InterruptedException{byte[] data= zooKeeper.getData("/test",true, null); System.out.println(newString(data)); Thread.sleep(Long.MAX_VALUE);}}
问题
出现“Will not attempt to authenticate using SASL (unknown error)”这个错误
22:13:50,599 INFO org.apache.zookeeper.ZooKeeper:868- Initiating client connection, connectString=192.168.220.130:2181 sessionTimeout=4000 watcher=com.tuling.zookeeper.DataTest2$$Lambda$1/1973336893@58d25a4022:13:50,817 INFO org.apache.zookeeper.common.X509Util:79- Setting-D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation22:13:51,633 INFO org.apache.zookeeper.ClientCnxnSocket:237- jute.maxbuffer value is4194304 Bytes22:13:51,810 INFO org.apache.zookeeper.ClientCnxn:1653- zookeeper.request.timeout value is0. feature enabled=22:14:10,209 INFO org.apache.zookeeper.ClientCnxn:1112- Opening socket connection to server192.168.220.130/192.168.220.130:2181. Will not attempt to authenticate using SASL(unknown error)22:14:10,212 WARN org.apache.zookeeper.ClientCnxn:1190- Client session timed out, have not heard from server in18399msfor sessionid0x022:14:10,213 INFO org.apache.zookeeper.ClientCnxn:1238- Client session timed out, have not heard from server in18399msfor sessionid0x0, closing socket connection and attempting reconnect Exception in thread"main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode= ConnectionLossfor/silas at org.apache.zookeeper.KeeperException.create(KeeperException.java:102) at org.apache.zookeeper.KeeperException.create(KeeperException.java:54) at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:2131) at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:2160) at com.tuling.zookeeper.DataTest2.main(DataTest2.java:13)
解决
在C:\Windows\System32\drivers\etc\hosts 文件中添加:
192.168.220.130 myzk.com 即可解决
192.168.220.130 是zookeeper服务器的ip,myzk.com是域名(可任意填写)
相关学习
热门文章
- 给宠物医院的好评怎么写(给宠物医院的好评怎么写简短)
- 动物诊疗许可证去哪里办手续(动物诊疗许可证在哪里办理)
- 什么平台可以寄宠物(哪里可以寄宠物快递)
- 宠物医院需要几个医生(宠物医院需要几个医生的资质)
- MySQL数据库之数据data 基本操作_Mysql
- 1月27日→19.9M/S|2025年最新免费节点Fast Socks订阅链接地址
- 2月18日→18.1M/S|2025年最新免费节点Fast Socks订阅链接地址
- 1月9日→21.2M/S|2025年最新免费节点Fast Socks订阅链接地址
- 动物疫苗管理法律法规最新文件是什么内容(动物疫苗管理法律法规最新文件是什么内容啊)
- 3月17日→22.1M/S|2025年最新免费节点Fast Socks订阅链接地址