zookeeper curator CRUD
发布日期:2021-05-06 17:50:30 浏览次数:41 分类:精选文章

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

Curator客户端的基本操作

Curator客户端的依赖包

在开始使用Curator客户端之前,我们需要先了解并添加相应的依赖包。Curator提供了多个包来满足不同的开发需求:

  • curator-framework:对Zookeeper底层API进行封装,便于开发者使用。
  • curator-client:提供了丰富的客户端操作,包括重试策略等功能。
  • curator-recipes:封装了一些高级特性,如Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等。

使用Maven进行项目管理时,可以通过以下依赖配置来引入Curator客户端:

org.apache.curator
curator-client
4.0.0
org.apache.zookeeper
zookeeper
org.apache.curator
curator-framework
4.0.0
org.apache.zookeeper
zookeeper
org.apache.curator
curator-recipes
4.0.0
org.apache.zookeeper
zookeeper

创建Curator会话

使用Curator框架创建会话的主要步骤如下:

  • 引入必要的类:在你的Java代码中引入CuratorFrameworkFactory和相关的重试策略类。

  • 创建客户端实例:使用CuratorFrameworkFactory.newClient方法创建Curator客户端。该方法接受Zookeeper的连接地址和重试策略。

  • 启动客户端:在创建客户端后,需要通过client.start()方法启动客户端实例,以便与Zookeeper集群建立连接。

  • 以下是一个简单的创建示例:

    import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.retry.ExponentialBackoffRetry;public class ClientFactory {    private static final String ZK_ADDRESS = "localhost:2181";        public static CuratorFramework createSimple() {        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);        return CuratorFrameworkFactory.newClient(ZK_ADDRESS, retryPolicy);    }        public static CuratorFramework createWithOptions(String connectionTimeoutMs, String sessionTimeoutMs) {        return CuratorFrameworkFactory.builder()                .connectString(ZK_ADDRESS)                .retryPolicy(new ExponentialBackoffRetry(1000, 3))                .connectionTimeoutMs(connectionTimeoutMs)                .sessionTimeoutMs(sessionTimeoutMs)                .build();    }}

    CRUD操作(Create, Read, Update, Delete)

    1. 创建节点

    使用Curator客户端的create()方法来创建节点。创建节点时,可以指定节点的类型(持久节点、持久顺序节点、临时节点、临时顺序节点)。

    @Testpublic void createNode() {    CuratorFramework client = ClientFactory.createSimple(ZK_ADDRESS);    try {        client.start();        String data = "hello";        byte[] payload = data.getBytes("UTF-8");        String zkPath = "/test/CRUD/node-1";                client.create()                .creatingParentsIfNeeded()                .withMode(CreateMode.PERSISTENT)                .forPath(zkPath, payload);    } catch (Exception e) {        e.printStackTrace();    } finally {        CloseableUtils.closeQuietly(client);    }}

    2. 读取节点

    读取节点的数据可以通过checkExists()getData()方法完成。同时,还可以获取节点的子节点列表。

    @Testpublic void readNode() {    CuratorFramework client = ClientFactory.createSimple(ZK_ADDRESS);    try {        client.start();        String zkPath = "/test/CRUD/node-1";        Stat stat = client.checkExists().forPath(zkPath);                if (stat != null) {            byte[] payload = client.getData().forPath(zkPath);            String data = new String(payload, "UTF-8");            log.info("read data: {}", data);                        String parentPath = "/test";            List
    children = client.getChildren().forPath(parentPath); for (String child : children) { log.info("child: {}", child); } } } catch (Exception e) { e.printStackTrace(); } finally { CloseableUtils.closeQuietly(client); }}

    3. 更新节点

    更新节点的数据可以通过setData()方法实现。支持同步和异步操作。

    @Testpublic void updateNode() {    CuratorFramework client = ClientFactory.createSimple(ZK_ADDRESS);    try {        client.start();        String data = "hello world";        byte[] payload = data.getBytes("UTF-8");        String zkPath = "/test/node-1";                client.setData().forPath(zkPath, payload);    } catch (Exception e) {        e.printStackTrace();    } finally {        CloseableUtils.closeQuietly(client);    }}

    4. 删除节点

    删除节点可以通过delete()方法实现,支持同步和异步操作。

    @Testpublic void deleteNode() {    CuratorFramework client = ClientFactory.createSimple(ZK_ADDRESS);    try {        client.start();        String zkPath = "/test/CRUD/node-1";        client.delete().forPath(zkPath);                String parentPath = "/test";        List
    children = client.getChildren().forPath(parentPath); for (String child : children) { log.info("child: {}", child); } } catch (Exception e) { e.printStackTrace(); } finally { CloseableUtils.closeQuietly(client); }}

    其他操作

    获取子节点列表

    使用.getChildren()方法可以获取指定路径下的所有子节点。

    @Testpublic void getChildren() {    CuratorFramework client = ClientFactory.createSimple(ZK_ADDRESS);    try {        client.start();        String parentPath = "/test";        List
    children = client.getChildren().forPath(parentPath); for (String child : children) { log.info("child: {}", child); } } catch (Exception e) { e.printStackTrace(); } finally { CloseableUtils.closeQuietly(client); }}

    节点类型

    Zookeeper支持四种类型的节点:

    • 持久节点(PERSISTENT):节点一旦创建,就永久存在。
    • 持久顺序节点(PERSISTENT_SEQUENTIAL):节点创建时,Zookeeper会自动为其添加唯一的顺序编号。
    • 临时节点(EPHEMERAL):节点的生命周期与客户端会话绑定,会话结束时节点会被删除。
    • 临时顺序节点(EPHEMERAL_SEQUENTIAL):结合了临时节点和顺序节点的特性。

    总结

    通过以上操作,我们可以对Zookeeper进行基本的 CRUD 操作。接下来,我们将深入探讨Zookeeper客户端的高级功能和实战应用。


    相关文章开启zk的客户端开发

    上一篇:10分钟看懂: zookeeper 分布式ID (一)
    下一篇:zookeeper (二):Curator vs zkClient

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年03月30日 09时45分43秒