Spring Boot中使用Zookeeper实现分布式锁的案例
以下是一个在 Spring Boot 中使用 Zookeeper 和 Curator 实现分布式锁的示例。分布式锁可以确保在分布式环境中,同一时间只有一个客户端能够访问共享资源。
1. 引入依赖
在 pom.xml
文件中添加必要的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.8.0</version>
</dependency>
</dependencies>
2. 配置 Zookeeper 连接
在 application.yml
文件中配置 Zookeeper 连接字符串:
zookeeper:
connect-string: localhost:2181
3. 创建 Zookeeper 配置类
创建一个配置类来初始化 Curator 客户端:
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ZookeeperConfig {
@Value("${zookeeper.connect-string}")
private String connectString;
@Bean(initMethod = "start", destroyMethod = "close")
public CuratorFramework curatorFramework() {
return CuratorFrameworkFactory.builder()
.connectString(connectString)
.sessionTimeoutMs(5000)
.retryPolicy(new RetryNTimes(3, 5000))
.build();
}
}
4. 创建分布式锁服务类
创建一个服务类来实现分布式锁的获取和释放:
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class DistributedLockService {
@Autowired
private CuratorFramework curatorFramework;
// 获取分布式锁
public boolean acquireLock(String lockPath, int timeout, TimeUnit timeUnit) {
InterProcessMutex lock = new InterProcessMutex(curatorFramework, lockPath);
try {
return lock.acquire(timeout, timeUnit);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// 释放分布式锁
public void releaseLock(String lockPath) {
InterProcessMutex lock = new InterProcessMutex(curatorFramework, lockPath);
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. 创建控制器类来测试分布式锁
创建一个控制器类来模拟获取和释放分布式锁的操作:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DistributedLockController {
@Autowired
private DistributedLockService distributedLockService;
@GetMapping("/lock")
public String acquireDistributedLock(@RequestParam String lockPath, @RequestParam int timeout, @RequestParam String timeUnit) {
TimeUnit unit = TimeUnit.valueOf(timeUnit);
boolean acquired = distributedLockService.acquireLock(lockPath, timeout, unit);
if (acquired) {
return "成功获取分布式锁";
} else {
return "获取分布式锁失败";
}
}
@GetMapping("/unlock")
public String releaseDistributedLock(@RequestParam String lockPath) {
distributedLockService.releaseLock(lockPath);
return "成功释放分布式锁";
}
}
6. 运行 Spring Boot 应用
启动 Spring Boot 应用后,你可以通过访问以下 URL 来测试分布式锁的功能:
- 获取锁:
http://localhost:8080/lock?lockPath=/my-lock&timeout=10&timeUnit=SECONDS
- 释放锁:
http://localhost:8080/unlock?lockPath=/my-lock
在这个示例中:
DistributedLockService
类使用InterProcessMutex
来实现分布式锁的获取和释放。InterProcessMutex
是 Curator 库提供的一个用于实现分布式互斥锁的类。DistributedLockController
类提供了两个 API 端点,一个用于获取分布式锁,另一个用于释放分布式锁。
通过这种方式,你可以在 Spring Boot 应用中利用 Zookeeper 实现分布式锁,确保在分布式环境中的资源访问控制。