分布式锁本来就是cp的场景,由于像redis分布式锁在主从架构中异步同步的问题,虽然有红锁的解决方案,但是稍显复杂,可是通过zookeeper来实现的分布式锁,就不会有这个问题。
引入maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.13.0</version>
</dependency>
添加CuratorConfig的配置文件
@Configuration
public class CuratorConfig {
@Value("${spring.curator.retryCount}")
private int retryCount;
@Value("${spring.curator.elapsedTimeMs}")
private int elapsedTimeMs;
@Value("${spring.curator.connectString}")
private String connectString;
@Value("${spring.curator.sessionTimeoutMs}")
private int sessionTimeoutMs;
@Value("${spring.curator.connectionTimeoutMs}")
private int connectionTimeoutMs;
@Bean
public CuratorFramework curatorFramework(){
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(elapsedTimeMs, retryCount);
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, sessionTimeoutMs, connectionTimeoutMs, retryPolicy);
client.start();
return client;
}
}
加锁逻辑
@RestController
public class TestZKLockController {
@Autowired
private CuratorFramework curatorFramework;
@GetMapping("getLock")
public void lock() throws Exception {
InterProcessMutex lock = new InterProcessMutex(curatorFramework, "/test/lock");
try {
lock.acquire();
System.out.println("执行业务逻辑");
TimeUnit.SECONDS.sleep(30);
}finally {
lock.release();
}
}
}