Zookeeper客户端介绍

  客户端是开发人员使用Zookeeper的主要的途径,以下内容将对Zookeeper的内部原理进行详细的学习和讲解。ZooKeeper的客户端主要有一下几个核心组件组成:

  • Zookeeper:提供客户端访问ZooKeeper服务器的API.
  • ClientWatchManager:负责管理客户端注册的Watcher.
  • HostProvider:客户端地址列表管理器。
  • ClientCnxn:客户端核心线程,其内部包含连个线程及SendThread和EvnentThread。SendThread是一个IO线程主要负责客户端和服务端之间的网络通信;后者是一个事件处理线程,主要负责对服务端时间进行处理。

  客户端的整体架构如下:

实例

  下面使用具体的实例结合源码来分析Zookeeper源码创建的过程:如下代码是一个单例的ZooKeeperSupport可以用来回去Zookeeper客户端对象:

 1 public class ZookeeperSupport {
 2     private static volatile ZooKeeper zooKeeper = null; // zookeeper连接,在初始化zk配置时设置
 3     public static final Integer zooKeeperLock = new Integer(1);
 4     public static boolean isUseZk = true; // 是否使用zk,默认使用,当zk连接发生异常时不再使用
 5     public static final long ZK_CONNECT_TIMEOUT = 1L; //zk连接的超时时间设置,单位为秒
 6
 7     public static ZooKeeper getZooKeeper() {
 8         // 如果zookeeper为null 或者连接不可用,则重新获取连接,一般情况下,不会触发
 9         if (zooKeeper == null || !zooKeeper.getState().isAlive()) {
10             synchronized (zooKeeperLock) {
11                 // 如果发现zk不再使用,则不再创建新的zk,直接返回
12                 if (isUseZk) {
13                     if (zooKeeper == null || !zooKeeper.getState().isAlive()) {
14                         try {
15                             zooKeeper = createNewZookeper();
16                         } catch (Exception e) {
17                             Constant.log_cron.error("[initZkConfig] error happen where new zookeeper", e);
18                         }
19                     }
20                 }
21             }
22         }
23         return zooKeeper;
24     }
25
26     public static void setZooKeeper(ZooKeeper zooKeeper) {
27         ZookeeperSupport.zooKeeper = zooKeeper;
28     }
29
30     /**
31      * zookeeper启动时,异步启动两个线程,所以new之后并不代表连接已经建立,此时如果调用zk的一些方法会抛ConnectionLoss的异常
32      * 为了避免这种情况,封装new方法,每次new的时候去等待连接已经建立才做后面的步骤
33      *
34      * @return
35      * @throws Exception
36      */
37     public static ZooKeeper createNewZookeper() throws Exception {
38         CountDownLatch connectedLatch = new CountDownLatch(1);
39         ZooKeeper zooKeeper = new ZooKeeper(ZKConfig.getInstance().getConnectUrl(), ZKConfig.getInstance().getTimeout(), new DefaultWatcher(connectedLatch));
40         if (States.CONNECTING == zooKeeper.getState()) {
41             boolean ret = connectedLatch.await(ZK_CONNECT_TIMEOUT, TimeUnit.SECONDS);
42             // 如果等待超时了,还没有收到连接成功的通知,则说明zk不可用,直接不用zk,并报警
43             if(!ret){
44                 isUseZk = false;
45             }
46         }
47         return zooKeeper;
48     }
49 }

  为了使用Zookeeper服务,必需创建一个Zookeeper类的对象。在创建Zookeeper类的对象时客户端Session的建立是一个异步的过程,构造方法可能会在回话完成建立完成前立即返回,构造方法中的Watcher就是处理连接状态通知的接口。下面给出了DefaultWatcher实现:

 1 public class DefaultWatcher implements Watcher {
 2     private CountDownLatch connectedLatch;
 3     public DefaultWatcher(CountDownLatch connectedLatch) {
 4         this.connectedLatch = connectedLatch;
 5     }
 6     // 监控所有被触发的事件
 7     @Override
 8     public void process(WatchedEvent event) {
 9         if (connectedLatch != null && event.getState() == KeeperState.SyncConnected) {
10             connectedLatch.countDown();
11         }
12     }
13 }

 源码分析

  Zookeeper类一共有9个构造函数,具体源码如下:


参数名


说明


connectString


Zookeeper服务器列表,格式host1:port1,host2:port2/Zookeeper-demo


sessionTImeout


回话超时时间,以毫秒为单位,在回话周期内客户端和服务器端通过心跳检测来维持回话的有效性,一旦在sessionTImeout周期内没有有效的心跳的检测,回话就会失效。


Watch


事件处理器


canBeReadOnly


表示是否支持只读模式。默认情况下,在ZK集群中,一个机器如果和集群中半数的的机器失去网络连接,那个这台机器将不再出来客户端请求(读/写)。但在某些情况下,当Zookeeper发生此类故障时允许Zookeeper服务器提供只读服务。


sessionID和sessionPasswd


回话ID和回话秘钥,唯一确定一个回话。

时间: 2024-10-24 09:22:09

Zookeeper客户端介绍的相关文章

Zookeeper简单介绍

转自:ZooKeeper学习第一期---Zookeeper简单介绍 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误解.如果这些进程全部是跑在一台机上的

ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用

这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s/1jI3b8n8 ZkClient第三方API的使用 ZkClient是Github上一个开源的ZooKeeper客户端.ZkClient在ZooKeeper原生API之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZkClient在内部实现了诸如Session超时重连.Watche

ZooKeeper全面介绍

ZooKeeper简介 ZooKeeper是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. ZooKeeper是Apache的子项目,之前是Hadoop项目的一部分,使用Java实现,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取. ZooKeeper基本概念 角色 ZooKeeper中的角色主要有以下三类,如下表所示: 系统模型如图所示: 设计目的

ZooKeeper 基本介绍

Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储, Zookeeper 作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理. 1  Zookeeper基本框架 Zookeeper集群主要角色有Leader,Learner(Follower,Observer(当服务器增加到一定程度,由于投票的压力增大从而使得吞吐量降低,所以增加了Observer.)以及

zookeeper原理介绍

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt354 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其发展历程无需赘述.在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的.可扩展的.分布式的.可配置的协调机制

zookeeper客户端 zkCli使用及常用命令

上篇(http://www.cnblogs.com/yangzhenlong/p/8270835.html)zk伪集群搭建好后,使用zkCli连接zk服务 切换到zk1/bin 目录,执行zkCli.cmd -server localhost:2181 查看zk客户端帮助 命令 h example: 查看根目录节点: ls / 查看根节点状态:stat / 查看根节点数据和详情:get / get和stat的区别是:get比stat(第一行)多返回节点的数据信息 在根目录下创建 永久node_1

Zookeeper客户端对比选择_4

Zookeeper客户端对比选择 本文思维导图 使用框架的好处是自带一套实用的API,但是Zookeeper虽然非常强大,但是社区却安静的可怕,版本更新较慢,下面会先从zookeeper原生API的不足说起,然后引出现在流行的开源客户端工具. 1.原生API 1.创建连接的时候是异步的,所以我们在开发的时候需要人工的写代码等待创建节点的状态,如果需要的话. 2.连接时无超时重连机制.本人觉得这个非常重要,因为在现实使用中,网络是不可信的,在创建节点的时候要考虑到网络的不稳定性.因此,超时重连机制

第三章 zookeeper客户端-curator详解

一.简介 Curator是Netflix公司开源的一套zookeeper客户端框架. Curator包含了几个包: curator-framework:对zookeeper的底层api的一些封装 curator-client:提供一些客户端的操作,例如重试策略等 curator-recipes:封装了一些高级特性,如:Cache事件监听.选举.分布式锁.分布式计数器.分布式Barrier等. 我们需要根据ZK的版本来选择对应的curator版本,否则会出现兼容性问题 二.环境 jdk 1.8 z

ZooKeeper系列之二:Zookeeper应用介绍与安装部署大神必学

前言最近有很多粉丝反映怎么学好java?Zookeepr是什么? java开发技术不是一两天就能学好的,Zookeepr也是一样的道理,关键还得看你怎么去学,跟谁去学,俗话说的好师傅领进门,修行靠个人,这个不是短时间类所能完成的任务,有想法的上方关注,下方留言"学习"我教你!1 Zookeeper概述#ZooKeeper是一个为分布式应用所设计的分布的.开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务.Zo