Zookeeper java客户端API常规应用

2022年9月1日13:15:36

Zookeeper

zookeeper 提供了java与C两种语言的客户端。在此学习的就是java客户端。

引入最新的maven依赖:

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

知识点:

  1. 初始连接
  2. 创建、查看节点
  3. 监听节点
  4. 设置节点权限
  5. 第三方客户端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 类表示,类结构如下:

  1. ACL
  2. Id
    1. scheme // 对应权限模式scheme
      1. id // 对应模式中的id值
  3. 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是域名(可任意填写)

相关学习

JAVA资深架构师成长路线->性能直线提升架构技术>Zookeeper

  • 作者:若依不弃
  • 原文链接:https://blog.csdn.net/weixin_42213903/article/details/102239540
    更新时间:2022年9月1日13:15:36 ,共 4653 字。