博客
关于我
Zookeeper开源客户端Curator的使用
阅读量:453 次
发布时间:2019-03-06

本文共 2952 字,大约阅读时间需要 9 分钟。

Curator 开源 zk 客户端 使用说明

Curator 简介

Curator 是 Apache 开源项目,专为 zk(ZooKeeper) 提供一套简化的客户端 API,简化了分布式系统中与 zk 交互的复杂性。通过 Curator,开发人员可以更高效地实现诸如分布式锁、Master 选举、分布式计数器等功能,而无需深入掌握 zk 的底层协议。

创建会话

使用 Curator 创建会话的第一步是配置重试策略。Curator 提供了多种重试策略,ExponentialBackoffRetry 是常用的选择,支持指数级别的重试。

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.131.128:2181", retryPolicy);client.start();

配置重试策略

ExponentialBackoffRetry 的实现基于以下公式计算当前 sleep 时间:

currentSleepTime = baseSleepTimeMs * Math.max(1, random.nextInt(1 << (retryCount - 1)));

随着重试次数的增加,sleep 时间会指数级增长,直到达到 maxSleepMs。

创建节点

使用 Curator 创建节点,支持两种模式:持久节点和临时节点。创建临时节点时,Curator 会自动递归创建父节点。

CreateBuilder builder = client.create();builder.withMode(CreateMode.EPHEMERAL).forPath("/test");

递归创建父节点时,可以使用 creatingParentsIfNeeded 方法:

builder.creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/test", "ceshi".getBytes());

删除节点

删除节点时,Curator 提供了多种选项:

  • 删除叶子节点:
  • client.delete().forPath("/test/test1");
    1. 删除节点及其所有子节点:
    2. client.delete().deletingChildrenIfNeeded().forPath("/test/test1");
      1. 强制删除指定版本的节点:
      2. client.delete().withVersion(1).forPath("/test/test1");
        1. 确保删除操作成功:
        2. client.delete().guaranteed().forPath("/test/test1");

          异步操作

          Curator 支持异步接口,通过 BackgroundCallback 处理回调。可以使用 inBackground 方法提交任务到指定线程池:

          builder.withMode(CreateMode.PERSISTENT).inBackground(new BackgroundCallback() {    @Override    public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {        System.out.println("当前线程:" + Thread.currentThread().getName());    }}, Executors.newFixedThreadPool(10)).forPath("/test");

          事件监听

          Curator 提供了两种事件监听方式:

        3. NodeCache 用于监听节点数据的变更和节点的存在状态。

        4. PathChildrenCache 用于监听指定路径的子节点变化,包括新增、更新和删除事件。

        5. Master 选举

          实现 Master 选举的逻辑基于 Curator 的 LeaderSelector 和 LeaderSelectorListener 接口。开发人员只需配置路径和监听器,Curator 会自动选举出 Master 节点。

          LeaderSelector selector = new LeaderSelector(client, "/master/lock", new LeaderSelectorListener() {    @Override    public void takeLeadership(CuratorFramework client) throws Exception {        System.out.println("当前线程:" + Thread.currentThread().getName());    }});selector.autoRequeue();selector.start();

          分布式锁

          Curator 提供了 InterProcessMutex 类来实现分布式锁。通过 acquire 和 release 方法可以实现锁的获取与释放。

          final InterProcessMutex lock = new InterProcessMutex(client, "/test/test1");for (int i = 0; i < 30; i++) {    new Thread(new Runnable() {        @Override        public void run() {            try {                lock.acquire();                // 业务逻辑...                lock.release();            } catch (Exception e) {                e.printStackTrace();            }        }    }).start();}

          分布式计数器

          通过 DistributedAtomicLong 类,可以轻松实现分布式计数器。只需配置策略并调用 increment 方法即可。

          DistributedAtomicLong atomicLong = new DistributedAtomicLong(client, "/test", policy);try {    atomicLong.increment();} catch (Exception e) {    e.printStackTrace();}

          总结

          Curator 提供了 zk 的高级封装,简化了分布式系统中的复杂操作。通过合理使用 Curator 的 API,开发人员可以快速构建高效的分布式系统解决方案。

    转载地址:http://gadfz.baihongyu.com/

    你可能感兴趣的文章
    opencv常用函数
    查看>>
    OpenCV探索
    查看>>
    OpenCV添加中文(五)
    查看>>
    OpenCV点目标检测未找到所有目标,并且找到的圆圈偏移
    查看>>
    opencv特征提取1-Harris角点检测
    查看>>
    OpenCV环境搭建(一)
    查看>>
    OpenCV的视频读取
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>
    OpenCV读写avi、mpeg文件
    查看>>
    opencv面向对象设计初探
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    OpenDaylight融合OpenStack架构分析
    查看>>
    OpenERP ORM 对象方法列表
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>