目录
1.添加pom依赖
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.10</lombok.version>
<zookeeper.version>3.4.5</zookeeper.version>
<dubbo.version>2.7.8</dubbo.version>
<curator.version>2.13.0</curator.version>
<redis.version>3.1.0</redis.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除自带的logback依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<!--redis start-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 排除lettuce包,使用jedis代替-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${redis.version}</version>
</dependency>
<!--redis end-->
</dependencies>
2.yaml属性配置
curator:
#重试次数
maxRetries: 3
#重试间隔时间
baseSleepTimeMs: 1000
# zookeeper 地址 多个可用逗号分隔127.0.0.1:2181,127.0.0.1:2182
connectString: 127.0.0.1:2181
# session超时时间
sessionTimeoutMs: 60000
# 连接超时时间
connectionTimeoutMs: 5000
path: /distributed-lock
3.实现共享锁
加载配置
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class CuratorConfig {
@Value("${curator.maxRetries}")
private int maxRetries;
@Value("${curator.baseSleepTimeMs}")
private int baseSleepTimeMs;
@Value("${curator.connectString}")
private String connectString;
@Value("${curator.sessionTimeoutMs}")
private int sessionTimeoutMs;
@Value("${curator.connectionTimeoutMs}")
private int connectionTimeoutMs;
@Value("${curator.path}")
private String path;
}
分布式锁工具
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/**
* 分布式锁工具
* @since 20210726
*/
@Component
public class DistributedLockUtils {
@Autowired
private CuratorConfig curatorConfig;
@Bean
public CuratorFramework curatorFramework(){
//初始休眠时间为 1000ms, 最大重试次数为 3
RetryPolicy retry = new ExponentialBackoffRetry(curatorConfig.getBaseSleepTimeMs(), curatorConfig.getMaxRetries());
//Curator 客户端对象
CuratorFramework client = CuratorFrameworkFactory.newClient(
curatorConfig.getConnectString(),
curatorConfig.getSessionTimeoutMs(),
curatorConfig.getConnectionTimeoutMs(),
retry);
client.start();
return client;
}
}
应用
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessLock;
import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class DistributedLockServiceImpl {
@Value("${curator.path}")
private String basePath;
@Autowired
@Qualifier("curatorFramework")
private CuratorFramework client;
public void demo(){
//创建共享锁
InterProcessLock lock = new InterProcessSemaphoreMutex(client, basePath );
try {
lock.acquire();
// boolean flag = lock.acquire(10000, TimeUnit.MILLISECONDS);
//TODO
//添加业务代码
//dowork();
} catch (Exception e) {
log.error("" + e.getMessage(), e);
} finally {
try {
//释放锁
lock.release();
} catch (Exception e) {
log.error("释放分布式锁失败." + e.getMessage(), e);
}
}
}
}