本教程使用的 IDE 为 IntelliJ IDEA,创建一个 maven 工程,命名为 zookeeper-demo,并且引入如下依赖,可以自行在maven中央仓库选择合适的版本,介绍原生 API 和 Curator 两种方式。

  1. <dependency>
  2. <groupId>junit</groupId>
  3. <artifactId>junit</artifactId>
  4. <version>4.11</version>
  5. <scope>test</scope>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.zookeeper</groupId>
  9. <artifactId>zookeeper</artifactId>
  10. <version>3.4.8</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.curator</groupId>
  14. <artifactId>curator-framework</artifactId>
  15. <version>4.0.0</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.curator</groupId>
  19. <artifactId>curator-recipes</artifactId>
  20. <version>4.0.0</version>
  21. </dependency>

一、客户端的 zookeeper 原生 API

使用 zookeeper 原生 API,连接上一教程搭建的三台服务组成的集群,因为连接需要时间,用 countDownLatch 阻塞,等待连接成功,控制台输出连接状态!

public static void main(String[] args) {
    try {
        final CountDownLatch countDownLatch=new CountDownLatch(1);
        ZooKeeper zooKeeper=
            new ZooKeeper("192.168.3.33:2181," +
                    "192.168.3.35:2181,192.168.3.37:2181",
                    4000, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    if(Event.KeeperState.SyncConnected==event.getState()){
                        //如果收到了服务端的响应事件,连接成功
                        countDownLatch.countDown();
                    }
                }
            });
        countDownLatch.await();
        //CONNECTED
        System.out.println(zooKeeper.getState());

    }
}

控制台输出 connected 显示连接成功!

log4j:WARN No appenders could be found for logger (org.apache.zookeeper.ZooKeeper).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
CONNECTED

Process finished with exit code 0

简单示例添加节点 API:

zooKeeper.create("/root","1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

二、客户端的curator连接

Curator 是 Netflix 公司开源的一套 zookeeper 客户端框架,解决了很多 Zookeeper 客户端非常底层的细节开发工作,包括连接重连、反复注册 Watcher 和 NodeExistsException 异常等。
Curator 包含了几个包:

  • curator-framework:对 zookeeper 的底层 api 的一些封装。
  • curator-client:提供一些客户端的操作,例如重试策略等。
  • curator-recipes:封装了一些高级特性,如:Cache 事件监听、选举、分布式锁、分布式计数器、分布式 Barrier 等。 ```java public class CuratorDemo {

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

      CuratorFramework curatorFramework=CuratorFrameworkFactory.
              builder().connectString("192.168.3.33:2181," +
              "192.168.3.35:2181,192.168.3.37:2181").
              sessionTimeoutMs(4000).retryPolicy(new
              ExponentialBackoffRetry(1000,3)).
              namespace("").build();
      curatorFramework.start();
      Stat stat=new Stat();
      //查询节点数据
      byte[] bytes = curatorFramework.getData().storingStatIn(stat).forPath("/root");
      System.out.println(new String(bytes));
      curatorFramework.close();
    

    } }

上一步设置了 **/root** 节点值,所以控制台输出。
```java
log4j:WARN No appenders could be found for logger (org.apache.curator.utils.Compatibility).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
1

Process finished with exit code 0

查看源码

三、连接失败情况

  1. 关闭Linux防火墙

    systemctl stop firewalld
    
  2. 超时时间设置过短