本文介绍zk客户端curator的使用,本文主要介绍Curator recipes的使用
官方文档传送门
官方文档Curator recipes
参考:http://www.throwable.club/2018/12/16/zookeeper-curator-usage/
参考书籍:《从Paxos到ZooKeeper 分布式一致性原理与实践》
1. 分布式Barrier
JDK有CyclicBarrier来控制多线程之间同步,达到等待一定数量线程就绪后一起执行的效果。但是对于分布式系统来说不使用。ZK提供的DistributedDoubleBarrier解决了这个问题。
pom
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.13.0</version>
</dependency>
2. 第一种使用方式
该事例模拟了5个线程,通过setBarrier
完成barrier设置,通过waitOnBarrier
等待barrier释放,然后在主线程中通过removeBarrier
释放barrier,同时出发5个线程的业务逻辑处理。
关键方法
// 完成barrier设置
barrier.setBarrier();
// 等待barrier释放
barrier.waitOnBarrier();
// 释放barrier
barrier.removeBarrier();
事例
@Test
public void BarrierTest() throws Exception {
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
try {
CuratorFramework client = getZkClient();
barrier = new DistributedBarrier(client, barrier_path);
System.out.println(Thread.currentThread().getName() + "barrier设置");
// 完成barrier设置
barrier.setBarrier();
// 等待barrier释放
barrier.waitOnBarrier();
System.err.println("启动");
} catch (Exception e) {
}
}
}).start();
}
Thread.sleep(2000);
// 释放barrier
barrier.removeBarrier();
}
private CuratorFramework getZkClient() {
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
CuratorFramework zkClient = CuratorFrameworkFactory.builder()
.connectString("localhost:2181")
.sessionTimeoutMs(5000) // 会话超时时间,默认60000ms
.connectionTimeoutMs(10000) // 连接超时时间,默认15000ms
.retryPolicy(retryPolicy) // 重试策略
.build();
zkClient.start();
return zkClient;
}
控制台
3. 第二种使用方式
DistributedDoubleBarrier barrier = new DistributedDoubleBarrier(client, barrier_path, 5);
设置了数目5
,调用enter
进入准备进入状态,等待退出barrier成员达到5个,调用leave
进入准备退出状态,等待退出barrier成员达到5个。
关键方法
// 进入准备进入状态,等待退出barrier成员达到指定数目
barrier.enter();
// 进入准备退出状态,等待退出barrier成员达到指定数目
barrier.leave();
事例
@Test
public void BarrierTest1() throws Exception {
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
try {
CuratorFramework client = getZkClient();
DistributedDoubleBarrier barrier = new DistributedDoubleBarrier(client, barrier_path, 5);
Thread.sleep(Math.round(Math.random() * 3000));
System.out.println(Thread.currentThread().getName() + "进入barrier");
// 进入准备状态,等待进去barrier成员达到5个
barrier.enter();
System.out.println("启动");
Thread.sleep(Math.round(Math.random() * 3000));
// 进入准备退出状态,等待退出barrier成员达到5个
barrier.leave();
System.out.println("退出");
} catch (Exception e) {
}
}
}).start();
}
Thread.sleep(10000);
}
private CuratorFramework getZkClient() {
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
CuratorFramework zkClient = CuratorFrameworkFactory.builder()
.connectString("localhost:2181")
.sessionTimeoutMs(5000) // 会话超时时间,默认60000ms
.connectionTimeoutMs(10000) // 连接超时时间,默认15000ms
.retryPolicy(retryPolicy) // 重试策略
.build();
zkClient.start();
return zkClient;
}
控制台
源码地址
IT-CLOUD-ZOOKEEPER :zookeeper客户端Curator事例
项目推荐
IT-CLOUD :IT服务管理平台,集成基础服务,中间件服务,监控告警服务等。
IT-CLOUD-ACTIVITI6 :Activiti教程源码。博文在本CSDN Activiti系列中。
IT-CLOUD-ELASTICSEARCH :elasticsearch教程源码。博文在本CSDN elasticsearch系列中。
IT-CLOUD-KAFKA :spring整合kafka教程源码。博文在本CSDN kafka系列中。
IT-CLOUD-KAFKA-CLIENT :kafka client教程源码。博文在本CSDN kafka系列中。
IT-CLOUD-ZOOKEEPER :zookeeper客户端Curator事例。博文在本CSDN zookeeper系列中。开源项目,持续更新中,喜欢请 Star~