您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何进行Zookeeper开源客户端框架Curator的简单使用
## 一、前言
Apache ZooKeeper作为分布式系统的协调服务,被广泛应用于服务发现、配置管理、分布式锁等场景。而Curator是Netflix开源的一套ZooKeeper客户端框架,它简化了ZooKeeper的复杂操作,提供了更友好的API和高阶功能。本文将详细介绍Curator的基本使用方法。
## 二、环境准备
### 1. 依赖引入
在Maven项目中添加Curator依赖:
```xml
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.4.0</version>
</dependency>
确保已安装ZooKeeper服务(3.4.x+版本),默认端口2181。
// 重试策略(指数退避)
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
// 创建客户端
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("localhost:2181")
.retryPolicy(retryPolicy)
.build();
// 启动连接
client.start();
client.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)
.forPath("/example/path", "data".getBytes());
byte[] data = client.getData().forPath("/example/path");
System.out.println(new String(data));
client.setData().forPath("/example/path", "newData".getBytes());
client.delete()
.deletingChildrenIfNeeded()
.forPath("/example/path");
NodeCache nodeCache = new NodeCache(client, "/example/path");
nodeCache.getListenable().addListener(() -> {
ChildData data = nodeCache.getCurrentData();
System.out.println("节点变更:" + new String(data.getData()));
});
nodeCache.start();
InterProcessMutex lock = new InterProcessMutex(client, "/locks/mylock");
// 获取锁
if (lock.acquire(10, TimeUnit.SECONDS)) {
try {
// 业务代码
} finally {
lock.release();
}
}
DistributedAtomicLong counter = new DistributedAtomicLong(
client,
"/counters/counter1",
new RetryNTimes(10, 100)
);
// 递增操作
AtomicValue<Long> value = counter.increment();
if (value.succeeded()) {
System.out.println("新值:" + value.postValue());
}
// 服务注册
ServiceInstance<String> instance = ServiceInstance.<String>builder()
.name("serviceA")
.address("192.168.1.100")
.port(8080)
.build();
ServiceDiscovery<String> discovery = ServiceDiscoveryBuilder.builder(String.class)
.basePath("/services")
.client(client)
.build();
discovery.registerService(instance);
discovery.start();
// 服务发现
Collection<ServiceInstance<String>> instances =
discovery.queryForInstances("serviceA");
// 配置写入
client.create().orSetData()
.forPath("/config/app1", "timeout=3000".getBytes());
// 配置监听
PathChildrenCache configCache = new PathChildrenCache(client, "/config", true);
configCache.getListenable().addListener((client, event) -> {
if (event.getType() == PathChildrenCacheEvent.Type.CHILD_UPDATED) {
System.out.println("配置变更:" + new String(event.getData().getData()));
}
});
configCache.start();
连接管理:
connectionStateListener
处理连接状态变化异常处理:
try {
client.setData().forPath("/path", data);
} catch (Exception e) {
if (e instanceof ConnectionLossException) {
// 连接丢失处理
} else if (e instanceof NodeExistsException) {
// 节点已存在
}
}
CuratorTransaction
连接问题:
echo stat | nc localhost 2181
节点操作异常:
creatingParentsIfNeeded
)资源释放:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
CloseableUtils.closeQuietly(client);
}));
Curator通过提供高层抽象API,显著降低了ZooKeeper的使用门槛。本文介绍了: - 基础连接与节点操作 - 监听机制与分布式工具 - 实际应用场景实现 - 生产环境最佳实践
完整示例代码可参考:Curator官方示例库
注意:生产环境建议使用最新稳定版本,并充分测试异常场景下的系统行为。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。