版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c5113620/article/details/88912155
Apache Curator包是对zookeeper的java API的包装,使我们更方便使用分布式锁,分布式锁是使用zookeeper的【临时】【有序】节点特效来完成的
Curator分布式锁过程:
1.先设置分布式锁在zookeeper中的路径/curator/lock
2.mutex.acquire() 获取锁,失败抛异常,
先看当前线程是否已经获取过锁(可重入),若有锁了,就增加获取计数
否则尝试去加锁 (create),因为有序,所以判断是否为最小序号
看看自己创建的节点序号是否最小 最小则获得分布式锁 否则继续监听
3.mutex.release()释放锁,因为acquire会计数,所以acquire与release必须成对
Curator包依赖于zookeeper包,注意版本兼容问题
Apache Curator–ZooKeeper Version Compatibility
下面使用两个类来验证分布式锁
test.java 先使用分布式锁,睡眠
test2.java 使用同一锁会等待,直到test.java完成
注意test.java与test2.java的ip地址不同,验证zookeeper的集群连接
//pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dddd</groupId>
<artifactId>maventest</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<!-- same version with the zookeeper-->
<version>3.4.13</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
//test.java
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 Test {
public static void main(String[] args) throws Exception{
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.11.131:2181", retryPolicy);
client.start();
//create distro lock on node "/curator/lock" in zookeeper
InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock");
mutex.acquire();
System.out.println("Enter mutex");
Thread.sleep(10000);
mutex.release();
client.close();
}
}
//test2.java
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 Test2 {
public static void main(String[] args) throws Exception{
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.11.132:2181", retryPolicy);
client.start();
//create distro lock on node "/curator/lock" in zookeeper
InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock");
mutex.acquire();
System.out.println("Enter mutex");
mutex.release();
client.close();
}
}