ZkClient简介
ZkClient是一个开源客户端,在Zookeeper原生API接口的基础上进行了包装,更便于开发人员使用。内部实现了Session超时重连,Watcher反复注册等功能。像dubbo等框架对其也进行了集成使用。
虽然ZkClient对原生API进行了封装,但也有它自身的不足之处:
- 几乎没有参考文档;
- 异常处理简化(抛出RuntimeException);
- 重试机制比较难用;
- 没有提供各种使用场景的实现;
Curator简介
Curator是Netflix公司开源的一套Zookeeper客户端框架,和ZkClient一样,解决了非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等。目前已经成为Apache的顶级项目。另外还提供了一套易用性和可读性更强的Fluent风格的客户端API框架。
除此之外,Curator中还提供了Zookeeper各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计算器等)的抽象封装。
- zkClient
- ZkClient在ZooKeeper原生API接口之上进行了包装,是一个更易用的ZooKeeper客户端
- 与ZooKeeper客户端最大区别提供的API没有了Watcher注册的功能,而是引入了Listener的概念
- Curator
- Fluent风格的Java编码,流式
- Curator引入了Cache来替换Watcher实现对ZooKeeper服务端事件的监听
- 分布式锁/分布式计数器DistributedAtomicInteger/分布式栅栏Barrier
- 提供一些对数据路径节点操作的ZKPaths和EnsurePath
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
/**
* curator分布式锁实现
*/
public class Recipes_lock {
static String lock_path = "/curator_recipes_lock_path";
static CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
public static void main(String[] args) throws Exception {
client.start();
final InterProcessMutex lock = new InterProcessMutex(client, lock_path);
final CountDownLatch down = new CountDownLatch(1);
for (int i = 0; i < 30; i++) {
new Thread(new Runnable() {
public void run() {
try {
down.await();
lock.acquire();
} catch (Exception e) {
}
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss|SSS");
String orederNo = sdf.format(new Date());
System.out.println("生成的订单号为:" + orederNo);
try {
lock.release();
} catch (Exception e) {
}
}
}).start();
}
down.countDown();
}
}
输出结果:
生成的订单号为:15:32:33|728
生成的订单号为:15:32:33|781
生成的订单号为:15:32:33|849
生成的订单号为:15:32:33|879
生成的订单号为:15:32:33|897
生成的订单号为:15:32:33|972
生成的订单号为:15:32:34|013
生成的订单号为:15:32:34|057
生成的订单号为:15:32:34|130
生成的订单号为:15:32:34|197
生成的订单号为:15:32:34|232
生成的订单号为:15:32:34|282
生成的订单号为:15:32:34|367
生成的订单号为:15:32:34|404
生成的订单号为:15:32:34|425
生成的订单号为:15:32:34|461
生成的订单号为:15:32:34|482
生成的订单号为:15:32:34|515
生成的订单号为:15:32:34|550
生成的订单号为:15:32:34|573
生成的订单号为:15:32:34|600
生成的订单号为:15:32:34|624
生成的订单号为:15:32:34|647
生成的订单号为:15:32:34|670
生成的订单号为:15:32:34|715
生成的订单号为:15:32:34|752
生成的订单号为:15:32:34|774
生成的订单号为:15:32:34|793
生成的订单号为:15:32:34|811
生成的订单号为:15:32:34|836