当前位置: 首页 > news >正文

12. ZooKeeper之Java客户端API使用—创建会话。

转自:https://blog.csdn.net/en_joker/article/details/78686649

    客户端可以通过创建一个ZooKeeper(org.apache.zookeeper.ZooKeeper)实例来连接ZooKeeper服务器。ZooKeeper的4种构造方法如下。

  • ZooKeeper(String connectString , int sessionTimeout , Watcher watcher);
  • ZooKeeper(String connectString , int sessionTimeout , Watcher watcher , boolean canBeReadOnly);
  • ZooKeeper(String connectString , int sessionTimeout , Watcher watcher , long sessionId , byte[] sessionPasswd);
  • ZooKeeper(String connectString , int sessionTimeout , Watcher watcher , long sessionId , byte[] sessionPasswd , boolean canBeReadOnly);

 

参数名说明
connectString指ZooKeeper服务器列表,由英文状态逗号分开的host:post字符串组成,每一个都代表一台ZooKeeper机器,例如,192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181,这样就为客户端指定了三台服务器地址。另外,也可以在connectString中设置客户端连接上ZooKeeper后的根目录,方法是在host:host字符串之后添加上这个根目录,例如,192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181/zk-book,这样就指定了该客户端连接上ZooKeeper服务器之后,所有对ZooKeeper的操作,都会基于这个根目录。例如,客户端对/foo/bar的操作,都会指向节点的操作,都会基于这个根目录,例如,客户端对/foo/bar的操作,都会指向节点/zk-book/foo/bar——这个目录也叫Chroot,即客户端隔离命名空间。
sessionTimeout指会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有会话的概念,在一个会话周期内,ZooKeeper客户端和服务器之间会通过心跳检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效地心跳检测,会话就会失效。
watcherZooKeeper允许客户端在构造方法中传入一个接口Watcher(org.apache.zookeeper.Watcher)的实现类对象来作为默认的Watcher事件通知处理器。当然,该参数可以设置为null以表明不需要设置默认的Watcher处理器。
canBeReadOnly这是一个boolean类型的参数,用于标识当前会话是否支持“read-only(只读)”模式。默认情况下,在ZooKeeper集群中,一个机器如果和集群中过半及以上机器失去了网络连接,那么这个机器将不再处理客户端请求(包括读写请求)。但是在某些使用场景下,当ZooKeeper服务器发生此类故障的时候,我们还是希望ZooKeeper服务器能够提供读服务(当然写服务肯定无法提供)——这就是ZooKeeper的“read-only”模式。
sessionId和sessionPaswd分别代表会话ID和会话秘钥。这两个参数能够唯一确定一个会话,同时客户端使用这两个参数可以实现客户端会话复用,从而达到恢复会话的效果。具体使用方法是,第一次连接上ZooKeeper服务器时,通过调用ZooKeeper对象实例的以下两个接口,即可获得当前会话的ID和密钥:
long getSessionId();
byte[] getSessionPasswd();
获取到这两个参数值之后,就可以在下次创建ZooKeeper对象实例的时候传入构造方法了。

 

        注意,ZooKeeper客户端和服务端会话的建立是一个异步的过程,也就是说在程序中,构造方法会在处理完客户端初始化工作后立即返回,在大多数情况下,此时并没有真正建立好一个可用的会话,在会话的生命周期中处于“CONNECTING”的状态。

        当该会话真正创建完毕后,ZooKeeper服务端会向会话对应的客户端发送一个事件通知,以告知客户端,客户端只有在获取这个通知之后,才算真正建立了会话。

        该构造方法内部实现了与ZooKeeper服务器之间的TCP连接创建,负责维护客户端会话的生命周期。

创建一个最基本的ZooKeeper会话实例

public class ZooKeeper_Constructor_Usage_Simple implements Watcher {

private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181" , 5000 , new ZooKeeper_Constructor_Usage_Simple());

System.out.println(zookeeper.getState());

try {

connectedSemaphore.await();

} catch (InterruptedException e) {}

System.out.println("ZooKeeper session established.");

}

public void process(WatchedEvent event) {

System.out.println("Receive watched event: " + event);

if (KeeperState.SyncConnected == event.getState()) {

connectedSemaphore.countDown();

}

}

}

        运行程序,输出结果如下:

        在上面这个程序片段中,我们使用第一种构造方法ZooKeeper(String connectString , int sessionTimeout , Watcher watcher) 来实例化一个ZooKeeper对象,从而建立了会话。

        另外,ZooKeeper_Constructor_Usage类实现了Watcher接口,重写了process方法,该方法负责处理来自ZooKeeper服务器的Watcher通知,在收到服务端发来的SyncConnected事件之后,解除主程序在CountDownLatch上的等待阻塞。至此,客户端会话创建完毕。

创建一个复用sessionId和sessionPasswd的ZooKeeper对象实例

        在上面列出的ZooKeeper客户端构造方法中,我们看到ZooKeeper构造方法允许传入sessionId和sessionPasswd——客户端传入sessionId和sessionPasswd的目的是为了复用会话,以维持之前会话的有效性。下面是一个复用sessionId和sessionPasswd来创建ZooKeeper对象实例的示例。

public class ZooKeeper_Constructor_Usage_With_SID_PASSWD implements Watcher {

private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception {

ZooKeeper zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 5000, new ZooKeeper_Constructor_Usage_With_SID_PASSWD());

connectedSemaphore.await();

long sessionId = zookeeper.getSessionId();

byte[] passwd = zookeeper.getSessionPasswd();

// Use illegal sessionId and sessionPasswd

zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 5000 , new ZooKeeper_Constructor_Usage_With_SID_PASSWD(), 1l, "test".getBytes());

// Use correct sessionId and sessionPasswd

 

zookeeper = new ZooKeeper("domain1.book.zookeeper:2181", 5000 , new ZooKeeper_Constructor_Usage_With_SID_PASSWD(), sessionId, passwd);

Thread.sleep(Integer.MAX_VALUE);

}

 

public void process(WatchedEvent event) {

System.out.println("Receive watched event: " + event);

if (KeeperState.SyncConnected == event.getState()) {

connectedSemaphore.countDown();

}

}

}

        运行程序,输出结果如下:

        从上面这个示例程序和结果输出中,我们可以看出,第一次使用了错误的sessionId和sessionPasswd来创建ZooKeeper客户端的实例,结果客户端接收到了服务端的Expired事件通知;而第二次则使用正确的sessionId和sessionPasswd来创建客户端的实例,结果连接成功。

转载于:https://www.cnblogs.com/sharpest/p/8005663.html

相关文章:

  • 安装office2007 1706错误
  • 36.Linux驱动调试-根据oops定位错误代码行
  • 自我激励的20种方法
  • 数据结构C++(1)线性表——数组实现(arrayList)
  • C++拷贝构造函数(深拷贝与浅拷贝)
  • 支付系统接口性能压力测试TPS优化之路
  • 数据挖掘十大经典算法——k-means
  • crontab中执行多条命令
  • 25 JavaScript的幻灯片用于在Web布局的精彩案例
  • 手把手教你webpack3(2)简单指令(npm脚本)
  • 使用路由器实现不同VLAN间通信_路由交换
  • iOS开发教你如何删除Xcode中无用的配置文件Provisioning Profiles
  • 会计的思考(15):华而不实的应收账款周转率
  • 银行卡合法性校验
  • hostapd作为radius服务器
  • python3.6+scrapy+mysql 爬虫实战
  • axios 和 cookie 的那些事
  • Object.assign方法不能实现深复制
  • PHP 7 修改了什么呢 -- 2
  • Spring声明式事务管理之一:五大属性分析
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 测试开发系类之接口自动化测试
  • 程序员最讨厌的9句话,你可有补充?
  • 前端知识点整理(待续)
  • 深度学习在携程攻略社区的应用
  • 通信类
  • 学习笔记TF060:图像语音结合,看图说话
  • 译自由幺半群
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • Java总结 - String - 这篇请使劲喷我
  • $.ajax()参数及用法
  • $.ajax中的eval及dataType
  • (1)STL算法之遍历容器
  • (C)一些题4
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET基础篇——反射的奥妙
  • .net实现客户区延伸至至非客户区
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • []T 还是 []*T, 这是一个问题
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [dts]Device Tree机制
  • [ffmpeg] av_opt_set 解析
  • [LeetCode 127] - 单词梯(Word Ladder)
  • [LeetCode]-225. 用队列实现栈
  • [LeetCode刷题笔记]1 - 两数之和(哈希表)
  • [Linux] 常用命令--版本信息/关机重启/目录/文件操作
  • [mysql]游标和触发器