转自: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时间内没有进行有效地心跳检测,会话就会失效。
watcher ZooKeeper允许客户端在构造方法中传入一个接口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来创建客户端的实例,结果连接成功。

12. ZooKeeper之Java客户端API使用—创建会话。的更多相关文章

  1. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  2. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  3. [转载] ZooKeeper的Java客户端API

    转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...

  4. 六:ZooKeeper的java客户端api的使用

    一:客户端链接测试 package com.yeepay.sxf.createConnection; import java.io.IOException; import org.apache.zoo ...

  5. 13.Zookeeper的java客户端API使用方法

    转自:https://blog.csdn.net/jiuqiyuliang/article/details/56012027

  6. 读《分布式一致性原理》JAVA客户端API操作2

    创建节点 通过客户端API来创建一个数据节点,有一下两个接口: public String create(final String path, byte data[], List<ACL> ...

  7. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

  8. 02.ZooKeeper的Java客户端使用

    1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端     zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...

  9. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

随机推荐

  1. BZOJ 1578 DP

    思路:裸的完全背包 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> ...

  2. CentOS 源设置

    安装完CentOS后,系统默认的源可能有限满,这时我们需要添加国内比较好的源. 一.国内比较好的源https://opsx.alibaba.com/mirror                  #阿 ...

  3. 笔记本E450机械硬盘数据迁移到固态硬盘

    背景: E450机械硬盘使用速度过慢,但E450只有一个SATA位,无法直接使用 “分区助手”迁移. 处理: 1.将固态硬盘通过USB口外接在笔记本上 2.正常打开E450,进入桌面 3.对固态硬盘进 ...

  4. Linux发行版centos, ubuntu等

    公司装的是centos,centos其实就是无支持版的redhat. redhat是一个服务器的操作系统它的稳定性是比较高的,同时提供在线管理服务,服务器故障预警等,当然前提是要购买昂贵的服务. Su ...

  5. [Python] Execute a Python Script

    Python scripts can be executed by passing the script name to the python command or created as execut ...

  6. CF 439C(251C题)Devu and Partitioning of the Array

    Devu and Partitioning of the Array time limit per test 1 second memory limit per test 256 megabytes ...

  7. DSP开发中遇到的问题 - 类指针未初始化后果

    收到RECEIVE_REQ_MSG消息时会运行以下的代码,这里由于某种原因m_receiverSlaverController的值仍为NULL,并没有指向详细的CReceiverSlaverContr ...

  8. modSecurity规则学习(三)——SecRule

    通用格式 SecRule VARIABLES OPERATOR [TRANSFORMATION_FUNCTIONS, ACTIONS]   阶段phase (1)request headers (2) ...

  9. 57.C++处理转义字符

    #include <iostream> #include <string> #include <cstdlib> using namespace std; void ...

  10. Impala数据处理(加载和存储)

    不多说,直接上干货! Hive与Impala都是构建在Hadoop之上的数据查询工具,那么在实际的应用中,它们是如何加载和存储数据的呢? Hive和Impala存储和加载表,和所有的关系型数据库一样, ...