`
zhangwei_david
  • 浏览: 476101 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ZooKeeper JAVA API 之环境准备和创建会话

 
阅读更多

    Zookeeper是一个开放源代码的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的元语集,并以一系列简单易用的接口提供给用户使用。

单机模式部署与运行(Windows)

  1. 确保已经安装了JAVA 1.6及其以上版本的JDK
  2. 下载Zookeeper    http://zookeeper.apache.org/releases.html  目前稳定版本即stable版本为3.4.6。将下载完成的压缩包解压到%ZK_HOME%下,其中ZK_HOME 目录可以随意设定,如:D://programes 等
  3. 配置文件 zoo.cfg ,单机模式下,只需要将%ZK_HOME%/conf/zoo_sample.cfg文件重命名即可
  4. 启动服务,在%ZK_HOME%bin目录下执行zkServer.cmd即可启动zookeeper服务器

Zookeeper 可执行脚本说明

  1. zkCleanup  清理ZooKeeper历史数据,包括事务日志和快照文件
  2. zkCli  ZooKeeper的一个建议客户端
  3. zkEnv  设置ZooKeeper的环境变量
  4. zkServer  ZooKeeper服务器的启动、停止和重启脚本

创建会话

       客户端可以通过创建一个ZooKeeper实例来连接ZooKeeper服务器。该类中的注释这样写道:

ZooKeeper类是ZooKeeper客户端库的主类。要使用ZooKeeper服务,应用程序首先必须要实现一个ZooKeeper的实例。所有的迭代都将通过调用ZooKeeper类的方法来完成。这个类的方法都是线程安全的除非另有说明。
 一旦一个与服务器的连接被建立,会分配给客户端一个Session ID. 客户端会周期性地发送心跳到服务器端,以保持会话有效。
 只要Session ID 有效,应用程序都可以通过客户端调用ZooKeeper的 API
  如果因为某些原因,导致客户端未能在指定的时间段内(超过SessionTimeout的值)发送心跳到服务器端,则该会话将过期,Session ID 将失效。
  如果客户端对象不可用,为了调用ZooKeeper API,应用程序必须创建一个新的客户端

 

ZooKeeper的构造方法有:

 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,boolean canBeReadOnly)

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

   connectString 是指ZooKeeper服务器的列表,host:prot,host:port 这样的格式构成,即主机:端口号通过英文逗号分隔。当然如果是单击模式下只需要一个;

    sessionTimeout 值会话的超时时间,单位是毫秒

  watcher Watcher事件的处理器,如果设置为null,表示不需要默认的Watcher事件处理器

   canBeReadOnly 用于表示当前会话是否支持 read-only

    sessionId,sessionPasswd 分别代表 会话的Id和密钥。这两个参数可以唯一确定一个会话。可以通过ZooKeeper 实例调用 getSesssionId()和getSessionPasswd()方法获取。

 

/**
 *创建一个最基本的ZooKeeper会话示例
 * @author zhangwei_david
 * @version $Id: ZKConstructorDemo.java, v 0.1 2015年5月1日 下午5:55:21 zhangwei_david Exp $
 */
public class ZKConstructorDemo implements Watcher {

    private static CountDownLatch connectedSemphore = new CountDownLatch(1);

    public static void main(String[] args) throws Exception {
        //创建Zookeeper会话实例
        ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181", 5000, new ZKConstructorDemo());
        // 输出当前会话的状态
        System.out.println("zk客户端的状态是:" + zookeeper.getState());
        System.out.println("zk 客户端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"
                           + new String(zookeeper.getSessionPasswd()));
        try {
            // 当前闭锁在为0之前一直等待,除非线程中断
            connectedSemphore.await();
        } catch (Exception e) {
            System.out.println("Zookeeper session established");
        }
    }

    /**
     * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent)
     */
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event:" + event);
        //如果客户端已经处于连接状态闭锁减去1
        if (KeeperState.SyncConnected == event.getState()) {
            connectedSemphore.countDown();
        }
    }
}

 结果:

2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:host.name=David
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.version=1.8.0
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.io.tmpdir=C:\Users\Lenovo\AppData\Local\Temp\
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.compiler=<NA>
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.name=Windows 8.1
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.arch=x86
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.version=6.3
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.name=Lenovo
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.home=C:\Users\Lenovo
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.dir=H:\Alipay.com\workspace4alipay\demo
2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorDemo@1e717c2
zk客户端的状态是:CONNECTING
zk 客户端的sessionId=0,  sessionPasswd是:

 

**
 *使用SessionId和Sessionpwd创建的ZooKeeper会话示例
 * @author zhangwei_david
 * @version $Id: ZKConstructorWithIdAndPasswdDemo.java, v 0.1 2015年5月1日 下午5:55:21 zhangwei_david Exp $
 */
public class ZKConstructorWithIdAndPasswdDemo implements Watcher {

    private static CountDownLatch connectedSemphore = new CountDownLatch(1);

    public static void main(String[] args) throws Exception {
        //创建Zookeeper会话实例
        ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181", 5000,
            new ZKConstructorWithIdAndPasswdDemo());
        // 输出当前会话的状态
        System.out.println("未使用id和密钥创建zk客户端的状态是:" + zookeeper.getState());
        long sessionId = zookeeper.getSessionId();
        byte[] sessionPasswd = zookeeper.getSessionPasswd();
        System.out.println("zk 客户端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"
                + new String(zookeeper.getSessionPasswd()));
        zookeeper = new ZooKeeper("127.0.0.1:2181", 5000, new ZKConstructorWithIdAndPasswdDemo(),
            sessionId, sessionPasswd);
        System.out.println("使用id和密钥创建zk客户端的状态是:" + zookeeper.getState());

        zookeeper = new ZooKeeper("127.0.0.1:2181", 5000, new ZKConstructorWithIdAndPasswdDemo(),
            1L, "test".getBytes());
        System.out.println("使用错误id和密钥创建zk客户端的状态是:" + zookeeper.getState());
        try {
            // 当前闭锁在为0之前一直等待,除非线程中断
            connectedSemphore.await();
        } catch (Exception e) {
            System.out.println("Zookeeper session established");
        }
    }

    /**
     * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent)
     */
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event:" + event);
        //如果客户端已经处于连接状态闭锁减去1
        if (KeeperState.SyncConnected == event.getState()) {
            connectedSemphore.countDown();
        }
    }
}

 

结果:

2015-05-01 19:14:34  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@1e717c2
未使用id和密钥创建zk客户端的状态是:CONNECTING
zk 客户端的sessionId=0,  sessionPasswd是:
2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@aa7bc2 sessionId=0 sessionPasswd=<hidden>
使用id和密钥创建zk客户端的状态是:CONNECTING
2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@ccd017 sessionId=1 sessionPasswd=<hidden>
使用错误id和密钥创建zk客户端的状态是:CONNECTING
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70006, negotiated timeout = 5000
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Unable to reconnect to ZooKeeper service, session 0x1 has expired, closing socket connection
Receive watched event:WatchedEvent state:SyncConnected type:None path:null
Receive watched event:WatchedEvent state:Expired type:None path:null
2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70007, negotiated timeout = 5000
2015-05-01 19:14:34  [ main-EventThread:47 ] - [ INFO ]  EventThread shut down

 

 

0
0
分享到:
评论

相关推荐

    ZooKeeper Java API

    **ZooKeeper Java API**是Apache ZooKeeper项目的一部分,它为Java开发者提供了便捷的方式来与ZooKeeper集群进行交互。ZooKeeper是一个分布式的、开放源码的服务,主要用于维护配置信息、命名服务、分布式同步和组...

    zookeeper JAVA API.docx

    Zookeeper Java API 使用指南 Zookeeper 是一个广泛使用的分布式协调服务,提供了高效、可靠、可扩展的解决方案。Java API 是 Zookeeper 的一个重要组件,提供了丰富的接口让开发者可以轻松地使用 Zookeeper。下面...

    zookeeper Java api - curator 5.6.0

    Apache Curator 是一个高度封装的 ZooKeeper Java 客户端库,它简化了与 ZooKeeper 交互的复杂性,提供了更高级别的抽象和实用工具。ZooKeeper 是一个分布式的,开放源码的协调服务,用于分布式应用程序,提供命名...

    Zookeeper Api(java)入门详解与应用场景

    在实际项目中,结合Zookeeper的Java API和这些工具,可以更好地管理和协调分布式系统,提升系统的稳定性和可扩展性。通过不断的实践和学习,可以掌握Zookeeper的精髓,解决分布式环境下的诸多挑战。

    zookeeper_javaAPI-main.zip

    在IT行业中,Zookeeper和Java API的结合使用是分布式系统管理的重要组成部分。Zookeeper是由Apache软件基金会开发的一个开源项目,它提供了一种高效且可靠的分布式协调服务,常用于配置管理、命名服务、集群管理和...

    java中的zookeeper

    分布式锁是ZooKeeper的一个常见应用场景,通过创建和删除ZNode来实现锁机制。主要有两种方式: 1. **顺序节点**:客户端创建临时顺序节点,根据节点名称的顺序判断锁的获取。通常,最小序号的节点持有锁。 2. **监视...

    Zookeeper 原生api zkClient Curator操作

    在Java开发中,我们通常使用三种方式来操作Zookeeper:原生API、zkClient和Curator。接下来,我们将详细探讨这三种方式。 **一、Zookeeper原生API** Zookeeper提供了Java API,可以直接与Zookeeper服务器进行交互...

    Zookeeper的java原生API

    Zookeeper的Java原生API是开发人员在Java环境中与Zookeeper进行交互的主要工具。Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行...

    java客户端使用api访问zookeeper,增删改查Znode

    本文将深入探讨如何使用Java客户端API来对Zookeeper的Znode进行增删改查操作,并讨论同步与异步两种方式的使用。 首先,要使用Java客户端API访问Zookeeper,你需要引入相关的依赖。在Maven项目中,可以在pom.xml...

    zookeeper-API开发lib

    ZooKeeper API是开发者与ZooKeeper交互的主要方式,它提供了丰富的Java客户端接口,使得开发者能够方便地进行数据的读写、监控节点变化、创建和删除节点等操作。以下是一些关键的ZooKeeper API知识点: 1. **连接与...

    java连接zookeeper的jar包

    Java连接Zookeeper主要依赖于Apache ZooKeeper项目提供的Java客户端库,这个库包含了处理Zookeeper会话、操作数据节点以及监听事件的关键组件。在给定的压缩包文件中,可能包含了以下核心的jar包: 1. **zookeeper....

    zookeeper节点类型和java客户端创建zk节点

    通过深入学习Zookeeper的节点类型和Java客户端的使用,我们可以更好地利用其特性来解决分布式环境下的诸多问题,比如服务发现、配置管理、分布式锁等。结合源码分析,可以进一步理解其实现原理,从而提高问题排查和...

    zookeeper客户端api使用

    本文将深入探讨ZooKeeper客户端API的使用方法和核心概念。 ### 1. 连接ZooKeeper 在使用ZooKeeper客户端API之前,首先需要建立与ZooKeeper服务器的连接。这通常通过`ZooKeeper`类的构造函数完成,传入服务器地址...

    java handler zookeeper for zk's api

    标题中的“java handler zookeeper for zk's api”指的是在Java中使用Zookeeper的API来处理相关的操作。Zookeeper是一个分布式协调服务,常用于管理分布式应用的配置信息、命名服务、集群状态、选举等功能。在Java中...

    zookeeper-api基础.docx

    下面是一个完整的 Java 示例,演示了如何使用 Zookeeper API 创建节点、设置数据、获取数据等: ```java import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache....

    zookeeper的java-Demo

    然后,你可以通过`ZooKeeper`类的构造函数创建一个ZooKeeper实例,提供服务器地址列表、会话超时时间和Watcher。例如: ```java ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181", 3000, new Watcher() { @...

    JAVA实现zookeeper节点批量删除工具类.rar

    1. **Zookeeper连接与会话**:在使用Java API连接Zookeeper时,需要创建`ZooKeeper`对象,通常提供服务器地址列表、会话超时时间和Watcher对象。会话是Zookeeper中客户端和服务端之间的一个状态保持连接,会话期间...

    Java操作Zookeeper

    通过理解和掌握这些核心概念,你可以使用Java有效地操作Zookeeper,实现分布式环境中的服务发现、配置管理、锁服务等高级功能。在实际应用中,还需要考虑Zookeeper的高可用性、数据一致性以及错误处理等问题。

    zookeeper 系列整理总结

    在系列之八和九中,介绍了ZooKeeper的基本操作和API使用,开发者可以使用这些API在程序中实现与ZooKeeper的交互,创建、读取、更新和删除Znodes,以及监听节点变化。 最后,ZooKeeper的一致性保证和Leader选举...

Global site tag (gtag.js) - Google Analytics