zookeeper客户端框架Curator

本文介绍Netflix的Curator框架,它简化了Zookeeper客户端的开发,包括连接重连、Watcher注册等。展示了如何使用Curator创建不同类型的Zookeeper节点,如持久化和临时节点,以及节点数据的读写和监听机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。

 

Zookeeper的节点创建模式

  • PERSISTENT:持久化
  • PERSISTENT_SEQUENTIAL:持久化并且带序列号
  • EPHEMERAL:临时
  • EPHEMERAL_SEQUENTIAL:临时并且带序列号

POM依赖

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>com.google.collections</groupId>
    <artifactId>google-collections</artifactId>
    <version>1.0</version>
</dependency>
<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>6.14.3</version>
    <scope>compile</scope>
</dependency>

示例代码:

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.ChildData;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.testng.annotations.Test;

public class zkNew {

    /**
     * 创建永久节点
     * @throws Exception
     */
    @Test
    public void createNode() throws Exception {

        /**
         *  重试参数对象:
         *  第一个参数: 重试等待时间
         *  第二个参数: 重试的次数
         */
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);//通过工厂类, 获取客户端对象
        /**
         *  第一个参数: 链接的地址:
         *  第二个参数: session
         *  第三个参数:链接超时时间
         *  第四个参数: 重试参数对象
         */
        CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", 3000, 3000, retryPolicy);
//调用start开启客户端操作 !!!
        client.start();
        //通过create来进行创建节点,并且需要指定节点类型
       client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello3/world","my hello3/world".getBytes());
        client.close();
    }

    /**
     * 节点下面添加数据与修改是类似的,一个节点下面会有一个数据,新的数据会覆盖旧的数据
     * @throws Exception
     */
    @Test
    public void nodeData() throws Exception {
        RetryPolicy retryPolicy = new  ExponentialBackoffRetry(2000, 3);
        CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", 3000, 3000, retryPolicy);
        client.start();

        // 使用设置 setData() 设置数据
        client.setData().forPath("/hello3", "hello7".getBytes());
        client.close();
    }

    /**
     * 数据查询
     */
    @Test
    public void updateNode() throws Exception {
        RetryPolicy retryPolicy = new  ExponentialBackoffRetry(2000, 3);
        CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", 3000, 3000, retryPolicy);
        client.start();
        // 获取数据通过: getData()
        byte[] forPath = client.getData().forPath("/hello3");
        System.out.println(new String(forPath));
        client.close();
    }

    /**
     * zookeeper 的watch机制
     * @throws Exception
     */
    @Test
    public void watchNode() throws Exception {
        RetryPolicy policy = new ExponentialBackoffRetry(2000, 3);
        CuratorFramework client = CuratorFrameworkFactory.newClient("node1:2181,node2:2181,node3:2181", policy);
      ///调用start开启客户端操作
        client.start();
        // ExecutorService pool = Executors.newCachedThreadPool();

        //设置节点的cache
        TreeCache treeCache = new TreeCache(client, "/hello3");
        //设置监听器和处理过程

        treeCache.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                ChildData data = event.getData();

                if(data !=null){
                    // 通过 switch 进行判断, 并执行相关的对应的事件
                    switch (event.getType()) {
                        case NODE_ADDED:
                            System.out.println("NODE_ADDED : "+ data.getPath() +"  数据:"+ new String(data.getData()));
                            break;
                        case NODE_REMOVED:
                            System.out.println("NODE_REMOVED : "+ data.getPath() +"  数据:"+ new String(data.getData()));
                            break;
                        case NODE_UPDATED:
                            System.out.println("NODE_UPDATED : "+ data.getPath() +"  数据:"+ new String(data.getData()));
                            break;
                        default:
                            break;
                    }
                }else{
                    System.out.println( "data is null : "+ event.getType());
                }
            }
        });
        //开始监听
        treeCache.start();
        Thread.sleep(50000000);
    }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值