分布式锁的框架Curator
作用:专门解决分布式锁的框架,简化代码开发
1.原生的通过Java编写的分布式锁在开发中存在一些问题
1.会话连接是异步的,需要自己去处理。比如使用 CountDownLatch
2.开发的步骤比较复杂
3.不支持多节点删除和创建。需要自己去递归
4.Watch 需要重复注册,不然就不能生效
2.Curator的案例实现
所需依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<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>
</dependencies>
案例代码
package com.atguigu.zk.case2;
import org.apache.curator.RetryPolicy;
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 CuratorDemo {
private String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
private int connectionTimeout = 2000;
private int sessionTimeout = 2000;
public static void main(String[] args) {
CuratorDemo curatorDemo = new CuratorDemo();
curatorDemo.test();
}
public void test(){
//创建分布式锁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("线程一获取锁");
Thread.sleep(5*1000);
lock1.release();
System.out.println("线程一释放锁");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
lock2.acquire();
System.out.println("线程二获取锁");
Thread.sleep(5*1000);
lock2.release();
System.out.println("线程二释放锁");
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
//分布式锁初始化
private CuratorFramework getCuratorFramework() {
//通过工厂创建Curator
//重试策略,参数一:多长时间后重连 参数二:重连次数
RetryPolicy policy = new ExponentialBackoffRetry(3000,3);
CuratorFramework client = CuratorFrameworkFactory.builder()
//连接到哪些集群
.connectString(connectString)
//设置连接超时时间
.connectionTimeoutMs(connectionTimeout)
.sessionTimeoutMs(sessionTimeout)
//设置连接失败后的重连策略
.retryPolicy(policy)
.build();
//启动客户端,就是相当于连接zookeeper的服务端
client.start();
System.out.println("zookeeper 启动成功...");
return client;
}
}