目录
一、Zookeeper原生的 Java API 存在的问题
- 会话连接是异步的,需要自己去处理。比如使用 CountDownLatch。
- Watch 需要重复注册,不然就不能生效。
- 开发的复杂性还是比较高的。
- 不支持多节点删除和创建,需要自己去递归。
二、Zookeeper原生的 Java API 存在问题的解决方式
- Curator 是一个专门解决分布式锁的框架,解决了原生Java API开发分布式遇到的问题。
三、Curator框架实现分布式锁示例代码
3.1、pom文件添加依赖
-
pom文件依赖
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.3.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <version>4.3.0</version> </dependency>
3.2、示例代码
-
代码
package com.xz.case3; 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; public class CuratorLockTest { public static void main(String[] args) { // 创建分布式锁1 InterProcessMutex lock1 = new InterProcessMutex(getCuratorFramework(), "/locks"); // 创建分布式锁2 InterProcessMutex lock2 = new InterProcessMutex(getCuratorFramework(), "/locks"); new Thread(new Runnable() { @Override public void run() { try { // 获取锁对象 lock1.acquire(); System.out.println("线程1 获取到锁"); // 测试锁重入 lock1.acquire(); System.out.println("线程1 再次获取到锁"); Thread.sleep(5 * 1000); // 释放锁对象 lock1.release(); System.out.println("线程1 释放锁"); // 再次释放锁对象 lock1.release(); System.out.println("线程1 再次释放锁"); } catch (Exception e) { e.printStackTrace(); } } }).start(); new Thread(new Runnable() { @Override public void run() { try { lock2.acquire(); System.out.println("线程2 获取到锁"); lock2.acquire(); System.out.println("线程2 再次获取到锁"); Thread.sleep(5 * 1000); lock2.release(); System.out.println("线程2 释放锁"); lock2.release(); System.out.println("线程2 再次释放锁"); } catch (Exception e) { e.printStackTrace(); } } }).start(); } /** * 分布式锁初始化 */ private static CuratorFramework getCuratorFramework() { //重试策略,初试时间 3 秒,重试 3 次 ExponentialBackoffRetry policy = new ExponentialBackoffRetry(3000, 3); // 通过工厂创建 Curator CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.136.26:2181") .connectionTimeoutMs(200000) .sessionTimeoutMs(20000) .retryPolicy(policy).build(); // 启动客户端 client.start(); System.out.println("zookeeper初始化完成"); return client; } }
3.3、Curator框架实现分布式锁测试
- 启动CuratorLockTest,查看idea控制台变化