Java使用Curator进行ZooKeeper操作的详细教程

 更新时间:2025年04月01日 15:25:31   作者:拾荒的小海螺  
Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作,在分布式系统中,ZooKeeper 通常被用来作为协调服务,而 Curator 则为我们提供了更简洁易用的接口,本文将介绍 Curator 的核心功能及实践样例,需要的朋友可以参考下

1、简述

Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API,封装了很多复杂的 ZooKeeper 操作,例如连接管理、分布式锁、Leader 选举等。

在分布式系统中,ZooKeeper 通常被用来作为协调服务,而 Curator 则为我们提供了更简洁易用的接口,减少了开发的复杂性。本文将介绍 Curator 的核心功能及实践样例。

2、核心功能

Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作。Curator主要解决了三类问题:

  • 封装ZooKeeper client与ZooKeeper server之间的连接处理
  • 提供了一套Fluent风格的操作API
  • 提供ZooKeeper各种应用场景(recipe, 比如:分布式锁服务、集群领导选举、共享计数器、缓存机制、分布式队列等)的抽象封装

Curator 提供了以下核心组件:

2.1 CuratorFramework

CuratorFramework 是 Curator 的核心类,用于与 ZooKeeper 服务交互。

2.2 Recipes

Curator 提供了多种常见分布式模式的实现,包括:

  • 分布式锁 (InterProcessMutex)
  • 分布式队列 (DistributedQueue)
  • Leader 选举 (LeaderSelector)
  • 节点缓存 (NodeCache)
  • 路径缓存 (PathChildrenCache)
  • 树缓存 (TreeCache)

3、示例实践

Curator中提供了Zookeeper各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计算器等)的抽象封装。

3.1 依赖引入

在使用 Curator 前,需要在项目中引入相关的依赖:

<!-- zookeeper支持 -->
<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.6.4</version>
</dependency>
<!-- curator-recipes -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>5.5.0</version>
</dependency>
<!-- curator-framework -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>5.5.0</version>
</dependency>

3.2 初始化 CuratorFramework

以下代码展示了如何初始化 CuratorFramework:

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

public class CuratorExample {
    public static void main(String[] args) {
        // 创建 CuratorFramework 实例
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181") // ZooKeeper 地址
                .sessionTimeoutMs(5000)
                .connectionTimeoutMs(3000)
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .build();

        // 启动客户端
        client.start();

        System.out.println("CuratorFramework 已启动");

        // 关闭客户端
        client.close();
    }
}

3.3 分布式锁

分布式锁是分布式系统中的一个重要功能,用于协调多进程/线程间的访问。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;

import java.util.concurrent.TimeUnit;

public class DistributedLockExample {
    public static void main(String[] args) throws Exception {
        // 初始化 CuratorFramework
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181")
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .build();
        client.start();

        // 创建分布式锁
        InterProcessMutex lock = new InterProcessMutex(client, "/distributed-lock");

        // 尝试获取锁
        if (lock.acquire(10, TimeUnit.SECONDS)) {
            try {
                System.out.println("成功获取锁,执行任务...");
                Thread.sleep(5000); // 模拟任务
            } finally {
                lock.release();
                System.out.println("锁已释放");
            }
        } else {
            System.out.println("未能获取锁");
        }

        client.close();
    }
}

3.4 Leader 选举

Curator 的 LeaderSelector 提供了简单易用的 Leader 选举功能。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;

public class LeaderElectionExample {
    public static void main(String[] args) throws InterruptedException {
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181")
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .build();
        client.start();

        // 创建 LeaderSelector
        LeaderSelector leaderSelector = new LeaderSelector(client, "/leader-election", new LeaderSelectorListenerAdapter() {
            @Override
            public void takeLeadership(CuratorFramework client) throws Exception {
                System.out.println("成为 Leader,执行任务...");
                Thread.sleep(3000); // 模拟任务
                System.out.println("任务完成,释放 Leader 权限");
            }
        });

        leaderSelector.autoRequeue(); // 自动重新排队参与选举
        leaderSelector.start();

        Thread.sleep(Integer.MAX_VALUE); // 保持主线程运行
        client.close();
    }
}

3.5 节点缓存

NodeCache 用于监听特定节点的数据变更。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class NodeCacheExample {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181")
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .build();
        client.start();

        // 创建 NodeCache
        NodeCache nodeCache = new NodeCache(client, "/test-node");
        nodeCache.getListenable().addListener(() -> {
            System.out.println("节点数据变更,新的数据为:" + new String(nodeCache.getCurrentData().getData()));
        });

        nodeCache.start();

        // 创建节点并修改数据
        client.create().orSetData().forPath("/test-node", "initial-data".getBytes());
        Thread.sleep(1000);
        client.setData().forPath("/test-node", "updated-data".getBytes());

        Thread.sleep(5000); // 保持运行观察结果
        client.close();
    }
}

4、总结

Curator 提供了强大的 ZooKeeper 封装功能,极大地简化了开发流程。在分布式系统中,通过 Curator 可以实现诸如分布式锁、Leader 选举和节点监听等功能,帮助开发者快速构建稳定的分布式服务。

以上就是Java使用Curator进行ZooKeeper操作的详细教程的详细内容,更多关于Java Curator进行ZooKeeper操作的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot如何监听redis Key变化事件案例详解

    SpringBoot如何监听redis Key变化事件案例详解

    项目中需要监听redis的一些事件比如键删除,修改,过期等,下面这篇文章主要给大家介绍了关于SpringBoot如何监听redis Key变化事件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Spring Boot 使用 Hutool-jwt 实现 token 验证功能

    Spring Boot 使用 Hutool-jwt 实现 token 验证功能

    JWT 就是一种网络身份认证和信息交换格式,这篇文章主要介绍了Spring Boot使用Hutool-jwt实现token验证,需要的朋友可以参考下
    2023-07-07
  • 详解Spring Boot Security工作流程

    详解Spring Boot Security工作流程

    Spring Security,这是一种基于 Spring AOP 和 Servlet 。这篇文章主要介绍了Spring Boot Security的相关知识,需要的朋友可以参考下
    2019-04-04
  • java web服务器实现跨域访问

    java web服务器实现跨域访问

    这篇文章主要为大家详细介绍了java web服务器实现跨域访问,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • sprintboot使用spring-security包,缓存内存与redis共存方式

    sprintboot使用spring-security包,缓存内存与redis共存方式

    这篇文章主要介绍了sprintboot使用spring-security包,缓存内存与redis共存方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot基于Shiro处理ajax请求代码实例

    SpringBoot基于Shiro处理ajax请求代码实例

    这篇文章主要介绍了SpringBoot基于Shiro处理ajax请求代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot中的Future接口详解

    SpringBoot中的Future接口详解

    这篇文章主要介绍了SpringBoot中的Future接口详解,在异步编程中,我们通常需要处理一些耗时的操作,一种常见的做法是使用 Future 接口来代表一个异步操作的结果,需要的朋友可以参考下
    2023-07-07
  • 详解JDK9特性之JPMS模块化

    详解JDK9特性之JPMS模块化

    JDK9引入了一个特性叫做JPMS(Java Platform Module System),也可以叫做Project Jigsaw。模块化的本质就是将一个大型的项目拆分成为一个一个的模块,每个模块都是独立的单元,并且不同的模块之间可以互相引用和调用。本文将详细介绍JDK9特性之JPMS模块化。
    2021-06-06
  • SpringBoot与Postman实现REST模拟请求的操作

    SpringBoot与Postman实现REST模拟请求的操作

    这篇文章主要介绍了SpringBoot与Postman实现REST模拟请求的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java 实现读取txt文本数据并以数组形式一行一行取值

    java 实现读取txt文本数据并以数组形式一行一行取值

    今天小编就为大家分享一篇java 实现读取txt文本数据并以数组形式一行一行取值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07

最新评论