Zookeeper的客户端Curator基本使用

本文来说下Zookeeper的客户端Curator基本使用


Curator概述

Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。

Curator官网:https://curator.apache.org/

在这里插入图片描述


Curator包结构

Curator包含了几个包:

在这里插入图片描述

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

常用的maven

在这里插入图片描述

 <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
 <dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.1.0</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
  <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>5.1.0</version>
  </dependency>

  <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-client -->
  <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-client</artifactId>
      <version>5.1.0</version>
  </dependency>

创建会话

使用静态工程方法创建客户端

首先应该打开zookeeper的服务端,我这里使用的是单机版

在这里插入图片描述

测试程序

package cn.wideth.buz.utils;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;

/***
 * curator创建连接session
 */
public class Main {

    public static void main(String[] args) {

        //设置重试策略,1000毫秒以内最大的重试次数为3
        RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);
//        CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181")
//                .sessionTimeoutMs(5000).retryPolicy(policy).build();

        // 这种方式和上面使用责任链的模式来创建连接session的效果是一样的
        CuratorFramework client =
                CuratorFrameworkFactory.newClient(
                        "127.0.0.1:2181",
                        5000,
                        3000,
                        policy);
        client.start();
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

newClient静态工厂方法包含四个主要参数:

参数名说明
connectionString服务器列表,格式host1:port1,host2:port2,…
retryPolicy重试策略,内建有四种重试策略,也可以自行实现RetryPolicy接口
sessionTimeoutMs会话超时时间,单位毫秒,默认60000ms
connectionTimeoutMs连接创建超时时间,单位毫秒,默认60000ms

测试结果

在这里插入图片描述


Fluent风格的Api创建会话

核心参数变为流式设置,一个列子如下:

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

CuratorFramework client =
         // 使用到了责任链的设计模式
         CuratorFrameworkFactory
        .builder()
        .connectString(connectionInfo)
        .sessionTimeoutMs(5000)
        .connectionTimeoutMs(5000)
        .retryPolicy(retryPolicy)
        .build();

创建包含隔离命名空间的会话

为了实现不同的Zookeeper业务之间的隔离,需要为每个业务分配一个独立的命名空间(NameSpace),在多个应用共用一个Zookeeper集群的场景下,这对于实现不同应用之间的相互隔离十分有意义。我们知道zookeeper的本质是一个分布式的文件系统,其实就是为不同的会话创建了不同的一个根目录而已。

测试程序

package cn.wideth.buz.utils;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;

/***
 * 创建包含隔离命
 * 名空间的会话
 */
public class Main {

    public static void main(String[] args) {

        //设置重试策略,1000毫秒以内最大的重试次数为3
        RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);

        CuratorFramework client =
                CuratorFrameworkFactory.builder()
                        .connectString("127.0.0.1:2181")
                        .sessionTimeoutMs(5000)
                        .connectionTimeoutMs(5000)
                        .retryPolicy(policy)
                        .namespace("base")
                        .build();
        client.start();
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

数据节点操作

有许多常见的命令来操作zookeeper,在zk的客户端中输入help即可

在这里插入图片描述

使用上面的命令,进行了数据节点的增删改查操作

在这里插入图片描述

测试程序

package cn.wideth.buz.utils;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;

/***
 *  数据节点操作,其实curator就是将zk自带的
 *  命令封装成了,可以让开发人员调用的API。
 */
public class Main {

    public static void main(String[] args) {

        //设置重试策略,1000毫秒以内最大的重试次数为3
        RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);

        CuratorFramework client =
                CuratorFrameworkFactory.builder()
                        .connectString("127.0.0.1:2181")
                        .sessionTimeoutMs(5000)
                        .connectionTimeoutMs(5000)
                        .retryPolicy(policy)
                        .build();
        client.start();

        try {

            //创建一个节点
            client.create()
                    // 能够自动递归创建所有所需的父节点
                    .creatingParentContainersIfNeeded()
                    .forPath("/zkTest","hello world".getBytes());

            System.out.println("<=================1================>");
            //获取某个节点的所有子节点路径
            System.out.println(client.getChildren().forPath("/"));

            System.out.println("<=================2================>");
            //获取一个节点的数据内容,将字节转化成字符转
            System.out.println(new String(client.getData().forPath("/zkTest")));
            System.out.println("<=================3================>");

            //更新一个数据节点的内容
            client.setData().forPath("/zkTest","666777888".getBytes());
            System.out.println("<=================4================>");
            System.out.println(new String(client.getData().forPath("/zkTest")));

            //删除一个节点
            client.delete().forPath("/zkTest");
            System.out.println("<=================5================>");
            //获取某个节点的所有子节点路径
            System.out.println(client.getChildren().forPath("/"));

            System.out.println("<=================6================>");
            //检查节点是否存在
            System.out.println("zookeeper ===> " + client.checkExists().forPath("/zookeeper"));
            System.out.println("zkTest ===>" + client.checkExists().forPath("/zkTest"));
            System.out.println("<=================7================>");

        } catch (Exception e) {
            e.printStackTrace();
        }
        client.close();

    }
}

程序结果

在这里插入图片描述


本文小结

本文介绍了curator的基本使用,后续会对curator更加高级的操作,比如说分布式锁等常见的功能进行详细的描述。curator是用来操作zookeeper的一个非常好用的工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值