Zookeeper框架Curator使用

简介

Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基础上进行封装、实现一些开发细节,包括接连重连、反复注册Watcher和NodeExistsException等。目前已经作为Apache的顶级项目出现,是最流行的Zookeeper客户端之一。从编码风格上来讲,它提供了基于Fluent的编程风格支持。

除此之外,Curator还提供了Zookeeper的各种应用场景:Recipe、共享锁服务、Master选举机制和分布式计数器等。 

maven 依赖

 <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>4.0.0</version>
        </dependency>

Curator 客户端实例的创建

  1. 使用工厂类CuratorFrameworkFactory 的静态newClient()方法
  2. 使用工厂类CuratorFrameworkFactory 的静态builder构造者方
package com.gpdi.operatingunit.test.curator;

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

/**
 * @description:客户端实例创建工厂
 * @author: Lxq
 * @date: 2020/1/12 22:19
 */
public class ClientFactory {

    /**
     * @param connectionString zk的连接地址
     * @return CuratorFramework 实例
     */
    public static CuratorFramework createSimeple(String connectionString) {

        /**
         * 重试策略:第一次重试等待1s,第二次重试等待2s,第三次重试等待4s
         * 第一个参数:等待时间的基础单位,单位为毫秒
         * 第二个参数:最大的重试次数
         */
        ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);

        /**
         *获取CuratorFrameworkFactory 实例最简单的方式
         * 第一个参数:zk的连接地址
         * 第二个参数: 重试策略
         */
        return CuratorFrameworkFactory.newClient(connectionString, retry);
    }

    public static CuratorFramework createWithOptions(
            String connectionString, RetryPolicy retryPolicy,
            int connectionTimeoutMs, int sessionTimeoutMs) {

        // 使用builder 方法创建 CuratorFramework 实例
        return CuratorFrameworkFactory.builder()
                .connectString(connectionString)
                .retryPolicy(retryPolicy)
                .connectionTimeoutMs(connectionTimeoutMs)
                .sessionTimeoutMs(sessionTimeoutMs)
                .build();
    }

}

通过Curator 创建ZNode 节点

package com.gpdi.operatingunit.test.curator;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.utils.CloseableUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;

import java.util.List;

/**
 * @description: 节点CRUD
 * @author: Lxq
 * @date: 2020/1/12 23:39
 */
public class OperatingNode {

    private static final String Zk_ADDRESS = "localhost:2181";
    private static String zkPath = "/test/CRUD/node-1";

    /**
     * 创建一个永久性节点信息
     */
    public static void createPersistentnode() {
        CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
        client.start();
        //
        try {
            String data = "hello";
            byte[] payload = data.getBytes("UTF-8");
            client.create()
                    .creatingParentsIfNeeded()
                    .withMode(CreateMode.PERSISTENT)
                    .forPath(zkPath, payload);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseableUtils.closeQuietly(client);
        }
    }

    /**
     * 读取节点信息
     */
    public static void readNode() {
        CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
        try {
            // 启动客户端实例,连接服务器
            client.start();
            Stat stat = client.checkExists().forPath(zkPath);
            if (stat != null) {
                // 读取节点信息
                byte[] payload = client.getData().forPath(zkPath);
                String data = new String(payload, "UTF-8");
                System.out.println(data);
                String parentPath = "/test";
                List<String> children = client.getChildren().forPath(parentPath);
                children.forEach(r -> System.out.println(r));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseableUtils.closeQuietly(client);
        }

    }

    /**
     * 修改节点信息
     */
    public static void updateNode() {
        CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
        try {
            client.start();
            String data = "HelloWork";
            byte[] payload = data.getBytes("UTF-8");
            client.setData().forPath(zkPath, payload);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseableUtils.closeQuietly(client);
        }
    }


    /**
     * 删除节点信息
     */
    public static void deleteNode() {
        CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
        try {
            client.start();
            client.delete().forPath(zkPath);
            // 删除后查看结果
            String parentPath = "/test";
            List<String> children = client.getChildren().forPath(parentPath);
            children.forEach(c -> System.out.println(c));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            CloseableUtils.closeQuietly(client);
        }

    }

}
发布了35 篇原创文章 · 获赞 22 · 访问量 964

猜你喜欢

转载自blog.csdn.net/weixin_38982591/article/details/103957696