zookeeper的Java客户端操作

客户端选择

zookeeper的Java客户端主要有zkclient和Curator,此篇文章介绍Curator,就冲他官网的简介,zookeeper书的作者Patrick Hunt给了这么高的评价:Guava is to Java what Curator is to Zookeeper。

实际操作下来,Curator确实比zkclient更全面,代码编写也更加优雅。

引入jar包

Curator主要提供了三个包

  • curator-framework:对zookeeper操作的封装
  • curator-client:提供了一些客户端的操作
  • curator-recipes:封装了一些高级特性

我们可以直接引用curator-recipes,它里面包含了其他两个jar包,但是要注意zookeeper的版本,官网中给出了下面提示:

基本操作

客户端实例的创建

第一种

ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", retry);

retry是重试策略,间隔时间是2的指数增长,比如第一次等待1s,第二次2s,第三次4s。。。

第一个参数是间隔基础单位,原始是毫秒;第二个参数是重试次数。

CuratorFrameworkFactory.newClient创建客户端,传入zookeeper的连接地址和重试策略。

第二种

ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.builder()
        .connectString("123.206.212.170:2181")
        .connectionTimeoutMs(10000)
        .sessionTimeoutMs(10000)
        .retryPolicy(retry).build();

重试策略和上面一样,客户端通过CuratorFrameworkFactory.builder()创建,connectionTimeoutMs表示连接超时时间,sessionTimeoutMs表示会话超时时间。

创建节点

CuratorFramework client = client();
client.start();

String path = "/demo/curd/node-2";
client.create()
        .creatingParentsIfNeeded()
        .withMode(CreateMode.PERSISTENT)
        .forPath(path, "world".getBytes("utf-8"));
client.close();

curator的操作方法,基本都是链式调用,比起zkclient要优雅很多;

creatingParentsIfNeeded()表示如果父节点没有,就一起创建;

withMode(CreateMode.PERSISTENT)是创建的节点类型,zookeeper的节点有四种类型:

  • PERSISTENT:持久化节点
  • PERSISTENT_SEQUENTIAL:持久化顺序节点
  • EPHEMERAL:临时节点
  • EPHEMERAL_SEQUENTIAL:临时顺序节点

最后.forPath设置创建的节点路径和节点携带的内容。创建结果可以通过IDEA的zookeeper插件可视化查看,插件安装方法自行百度。

删除节点

CuratorFramework client = client();
client.start();

String path = "/demo/curd/node-2";
client.delete().forPath(path);
client.close();

删除节点调用delete方法即可。

修改节点

CuratorFramework client = client();
client.start();

String path = "/demo/curd/node-1";
client.setData().forPath(path, "hello world".getBytes("utf-8"));
client.close();

修改节点调用setData()方法,后面forPath方法传入修改后的内容。

查询节点

CuratorFramework client = client();
client.start();

String path = "/demo/curd/node-1";
byte[] bytes = client.getData().forPath(path);
System.out.println(new String(bytes));

List<String> list = client.getChildren().forPath("/demo");
list.forEach(System.out::println);
client.close();

查询当前节点内容使用getData()方法,也可以用过getChildren()获取下面的所有子节点,返回各个节点路径集合。

异步创建节点

CuratorFramework client = client();
client.start();

String path = "/demo/curd/node-4";
client.create()
        .creatingParentsIfNeeded()
        .withMode(CreateMode.PERSISTENT)
        .inBackground((c,e) ->{
            System.out.println("================");
            System.out.println(e);
        }).forPath(path);
Thread.sleep(10000);

节点创建和修改可以异步操作,只要调用inBackground方法,当节点创建成功以后,会走此方法里面的回调函数。

节点监听

CuratorFramework client = client();
client.start();
CountDownLatch countDownLatch = new CountDownLatch(1);
Watcher w = new Watcher() {
    @Override
    public void process(WatchedEvent watchedEvent) {
        System.out.println("监听到的变化 watchedEvent = " + watchedEvent);
        countDownLatch.countDown();
    }
};
client.getData().usingWatcher(w).forPath("/demo/curd/node-1");
countDownLatch.await();
client.close();

实例化Watcher,并实现process方法,当节点发生变化,会执行process方法,使用usingWatcher方法添加监听方法。


扫一扫,关注我

猜你喜欢

转载自blog.csdn.net/weixin_43072970/article/details/106848786