maven配置
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
Curator框架是最好用,最流行的zookeeper的客户端。
它有以下三个优点
1.提供了一套非常友好的操作API;
2. 提供一些高级特性(包括但不仅限于前篇文章中提到的)的封装
3.易测试
第一种 创建client 。一路点到底,这就是所谓的Fluent风格。 可以设置更多的属性。
CuratorFramework client = builder.connectString("192.168.11.56:2180")
.sessionTimeoutMs(30000)
.connectionTimeoutMs(30000)
.canBeReadOnly(false)
.retryPolicy(new ExponentialBackoffRetry(1000, Integer.MAX_VALUE))
.namespace(namespace)
.defaultData(null)
.build();
client.start();
第二种
1. 使用CuratorFrameworkFactory工厂的两个静态方法创建客户端
a) static CuratorFramework newClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs,RetryPolicy retryPolicy)
b) static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy)
private static final String ZK_ADDRESS = "127.0.0.1:2181";
public void init(){
// 1.Connect to zk
CuratorFramework client = CuratorFrameworkFactory.newClient(
ZK_ADDRESS,
new RetryNTimes(10, 5000)
);
client.start();
}
分布式锁工具类
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.RetryNTimes;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;
@Component
public class ZookeeperLockUtil{
private CuratorFramework client = null;
private static final String ZK_ADDRESS = "127.0.0.1:2181";
private static final String ZK_LOCK_PATH = "/zktest";
@PostConstruct
public void init(){
// 1.Connect to zk
client = CuratorFrameworkFactory.newClient(
ZK_ADDRESS,
new RetryNTimes(10, 5000)
);
client.start();
}
public InterProcessMutex createPath(String number){
try {
InterProcessMutex lock = new InterProcessMutex(client, ZK_LOCK_PATH.concat("/").concat(number));
return lock;
} catch (Exception e) {
return null;
}
}
public boolean lockAcquired(InterProcessMutex lock){
try {
if(lock.acquire(10 * 1000, TimeUnit.SECONDS)){
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public void lockRelease(InterProcessMutex lock, String number){
try {
if(null != lock){
lock.release();
StringBuilder nodePath = new StringBuilder();
nodePath.append(ZK_LOCK_PATH).append("/").append(number);
if(null != client && null != client.checkExists().forPath(nodePath.toString())){
client.delete().forPath(nodePath.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}