
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"; Listchildren = 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"; Listchildren = 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"; Listchildren = 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的客户端开发
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月30日 09时45分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
2019-03-06
P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2019-03-06
算法学习笔记: 珂朵莉树
2019-03-06
Codeforces Round #664 题解(A ~ C)
2019-03-06
Problem A - Sequence with Digits (数学推导)
2019-03-06
Problem 330A - Cakeminator (思维)
2019-03-06
LeetCode75 颜色分类 (三路快排C++实现与应用)
2019-03-06
docker基础:容器生命周期管理命令
2019-03-06
Shell脚本学习指南
2019-03-06
C#开发BIMFACE系列35 服务端API之模型对比6:获取模型构建对比分类树
2019-03-06
C# 规范建议
2019-03-06
C语言+easyX图形库的推箱子实现
2019-03-06
反汇编-流程控制语句-2-循环控制语句分析
2019-03-06
调试vs2019代码的流程
2019-03-06
游戏外挂基础-概述
2019-03-06
脱壳与加壳-加壳-6-代码实现加密导入表
2019-03-06
Typora配置PicGo时,提示Failed to fetch
2019-03-06
ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
2019-03-06
bcolz的新操作
2019-03-06
Linux的s、t、i、a权限(转)
2019-03-06