目录
- 一、Zookeeper原生的 Java API 存在的问题
- 二、Zookeeper原生的 Java API 存在问题的解决方式
- 三、Curator框架实现分布式锁示例代码
- 3.1、pom文件添加依赖
- 3.2、示例代码
- 3.3、Curator框架实现分布式锁测试
一、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) {// 创建分布式锁1InterProcessMutex lock1 = new InterProcessMutex(getCuratorFramework(), "/locks");// 创建分布式锁2InterProcessMutex lock2 = new InterProcessMutex(getCuratorFramework(), "/locks");new Thread(new Runnable() {@Overridepublic 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() {@Overridepublic 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);// 通过工厂创建 CuratorCuratorFramework 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控制台变化