ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)

简介: 【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)

what

Curator(监护人;管理者) 是 Netflix 公司开源的一个 Zookeeper 客户端,目前由 Apache 进行维护。与 Zookeeper 原生客户端相比,Curator 的抽象层次更高,功能也更加丰富,是目前 Zookeeper 使用范围最广的 Java客户端。

use

  1. 依赖
    <dependencies>
    <!--Curator 相关依赖-->
    <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-framework</artifactId>
     <version>4.0.0</version>
    </dependency>
    <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-recipes</artifactId>
     <version>4.0.0</version>
    </dependency>
    <dependency>
     <groupId>org.apache.zookeeper</groupId>
     <artifactId>zookeeper</artifactId>
     <version>3.4.13</version>
    </dependency>
    <!--单元测试相关依赖-->
    <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.12</version>
    </dependency>
    </dependencies>
    
  2. 基础API测试类 BasicOperationTest.java
public class BasicOperationTest {
   
    private CuratorFramework client = null;
    /**
     * zookeeper服务器地址
     */
    private static final String ZK_SERVER_PATH = "xxx.xx.xxx.xxx:2181";
    private static final String NODE_PATH = "/hadoop/yarn";

    @Before
    public void prepare() {
   
        // 重试策略
        RetryPolicy retryPolicy = new RetryNTimes(3, 5000);
        client = CuratorFrameworkFactory.builder()
                .connectString(ZK_SERVER_PATH)
                .sessionTimeoutMs(10000).retryPolicy(retryPolicy)
                .namespace("workspace").build();
        //指定命名空间后,client 的所有路径操作都会以 / workspace 开头
        client.start();
    }

    /**
     * 判断服务状态
     */
    @Test
    public void getStatus() {
   
        CuratorFrameworkState state = client.getState();
        System.out.println("服务是否已经启动:" + (state == CuratorFrameworkState.STARTED));
    }

    /**
     * 创建节点
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void createNodes() throws Exception {
   
        byte[] data = "abc".getBytes();
        client.create().creatingParentsIfNeeded()
                //节点类型
                .withMode(CreateMode.PERSISTENT)
                .withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)
                .forPath(NODE_PATH, data);
    }

    /**
     * 获取节点信息
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void getNode() throws Exception {
   
        Stat stat = new Stat();
        byte[] data = client.getData().storingStatIn(stat).forPath(NODE_PATH);
        System.out.println("节点数据:" + new String(data));
        System.out.println("节点信息:" + stat.toString());
    }

    /**
     * 获取子节点列表
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void getChildrenNodes() throws Exception {
   
        List<String> childNodes = client.getChildren().forPath("/hadoop");
        for (String s : childNodes) {
   
            System.out.println(s);
        }
    }

    /**
     * 更新节点
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void updateNode() throws Exception {
   
        byte[] newData = "defg".getBytes();
        // 传入版本号,如果版本号错误则拒绝更新操作,并抛出 BadVersion 异常
        client.setData().withVersion(0)
                .forPath(NODE_PATH, newData);
    }

    /**
     * 删除节点
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void deleteNodes() throws Exception {
   
        client.delete()
                // 如果删除失败,那么在会继续执行,直到成功
                .guaranteed()
                // 如果有子节点,则递归删除
                .deletingChildrenIfNeeded()
                // 传入版本号,如果版本号错误则拒绝删除操作,并抛出 BadVersion 异常
                .withVersion(0)
                .forPath(NODE_PATH);
    }

    /**
     * 判断节点是否存在
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void existNode() throws Exception {
   
        // 如果节点存在则返回其状态信息如果不存在则为 null
        Stat stat = client.checkExists().forPath(NODE_PATH + "aa/bb/cc");
        System.out.println("节点是否存在:" + (stat != null));
    }

    /**
     * 创建一次监听
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void DisposableWatch() throws Exception {
   
        client.getData().usingWatcher(new CuratorWatcher() {
   
            @Override
            public void process(WatchedEvent event) {
   
                System.out.println("节点" + event.getPath() + "发生了事件:" + event.getType());
            }
        }).forPath(NODE_PATH);
        //休眠以观察测试效果
        Thread.sleep(1000 * 1000);
    }

    /**
     * 创建永久监听
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void permanentWatch() throws Exception {
   
        // 使用 NodeCache 包装节点,对其注册的监听作用于节点,且是永久性的
        final NodeCache nodeCache = new NodeCache(client, NODE_PATH);
        // 通常设置为 true, 代表创建 nodeCache 时,就去获取对应节点的值并缓存
        nodeCache.start(true);
        nodeCache.getListenable().addListener(new NodeCacheListener() {
   
            @Override
            public void nodeChanged() {
   
                ChildData currentData = nodeCache.getCurrentData();
                if (currentData != null) {
   
                    System.out.println("节点路径:" + currentData.getPath() +
                            "数据:" + new String(currentData.getData()));
                }
            }
        });
        // 休眠以观察测试效果
        Thread.sleep(1000 * 1000);
    }

    /**
     * 监听字节点
     *
     * @throws Exception 可能出现异常
     */
    @Test
    public void permanentChildrenNodesWatch() throws Exception {
   
        // 第三个参数代表除了节点状态外,是否还缓存节点内容
        PathChildrenCache childrenCache = new PathChildrenCache(client, "/hadoop",
                true);
        /*
         * StartMode 代表初始化方式:
         * NORMAL: 异步初始化
         * BUILD_INITIAL_CACHE: 同步初始化
         * POST_INITIALIZED_EVENT: 异步并通知,初始化之后会触发 INITIALIZED 事件
         */
        childrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
        List<ChildData> childDataList = childrenCache.getCurrentData();
        System.out.println("当前数据节点的子节点列表:");
        childDataList.forEach(x -> System.out.println(x.getPath()));
        childrenCache.getListenable().addListener(new PathChildrenCacheListener() {
   
            @Override
            public void childEvent(CuratorFramework client, PathChildrenCacheEvent
                    event) {
   
                switch (event.getType()) {
   
                    case INITIALIZED:
                        System.out.println("childrenCache 初始化完成");
                        break;
                    case CHILD_ADDED:
                        // 需要注意的是: 即使是之前已经存在的子节点,也会触发该监听,因为会把该子节点加入 childrenCache 缓存中
                        System.out.println("增加子节点:" + event.getData().getPath());
                        break;
                    case CHILD_REMOVED:
                        System.out.println("删除子节点:" + event.getData().getPath());
                        break;
                    case CHILD_UPDATED:
                        System.out.println("被修改的子节点的路径:" +
                                event.getData().getPath());
                        System.out.println("修改后的数据:" + new
                                String(event.getData().getData()));
                        break;
                    default:
                        System.out.println("无匹配!");
                }
            }
        });
        //休眠以观察测试效果
        Thread.sleep(1000 * 1000);
    }

    @After
    public void destroy() {
   
        if (client != null) {
   
            client.close();
        }
    }
}
目录
相关文章
|
Linux 网络安全 Docker
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
尼恩提供了一系列文章,旨在帮助开发者轻松搭建一键开发环境,涵盖Java分布式、高并发场景下的多种技术组件安装与配置。内容包括但不限于Windows和CentOS虚拟机的安装与排坑指南、MySQL、Kafka、Redis、Zookeeper等关键组件在Linux环境下的部署教程,并附带详细的视频指导。此外,还特别介绍了Vagrant这一虚拟环境部署工具,
尼恩一键开发环境: vagrant+java+springcloud+redis+zookeeper镜像下载(&制作详解)
|
IDE Java 分布式数据库
Apache HBase 落地JAVA 实战
Apache HBase 落地 Java 实战主要涉及使用 Java API 来操作 HBase 数据库,包括表的创建、删除、数据的插入、查询等操作。以下是一个基于 Java 的 HBase 实战指南,包括关键步骤和示例代码。
952 23
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
267 2
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
224 1
|
分布式计算 Java Hadoop
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
310 1
|
消息中间件 Java Kafka
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
【Azure 事件中心】在微软云中国区 (Mooncake) 上实验以Apache Kafka协议方式发送/接受Event Hubs消息 (Java版)
491 1
|
Java 持续交付 项目管理
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。
Maven是一款基于Apache许可的项目管理和构建自动化工具,在Java开发中极为流行。它采用项目对象模型(POM)来描述项目,简化构建流程。Maven提供依赖管理、标准构建生命周期、插件扩展等功能,支持多模块项目及版本控制。在Java Web开发中,Maven能够自动生成项目结构、管理依赖、自动化构建流程并运行多种插件任务,如代码质量检查和单元测试。遵循Maven的最佳实践,结合持续集成工具,可以显著提升开发效率和项目质量。
316 1
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
2152 0
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
314 0
|
7月前
|
消息中间件 分布式计算 资源调度
《聊聊分布式》ZooKeeper与ZAB协议:分布式协调的核心引擎
ZooKeeper是一个开源的分布式协调服务,基于ZAB协议实现数据一致性,提供分布式锁、配置管理、领导者选举等核心功能,具有高可用、强一致和简单易用的特点,广泛应用于Kafka、Hadoop等大型分布式系统中。

推荐镜像

更多