Spring Boot中使用Zookeeper实现分布式锁的案例

以下是一个在 Spring Boot 中使用 Zookeeper 和 Curator 实现分布式锁的示例。分布式锁可以确保在分布式环境中,同一时间只有一个客户端能够访问共享资源。

1. 引入依赖

在 pom.xml 文件中添加必要的依赖:

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 连接字符串:

yaml 复制代码
zookeeper:
  connect-string: localhost:2181

3. 创建 Zookeeper 配置类

创建一个配置类来初始化 Curator 客户端:

java 复制代码
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. 创建分布式锁服务类

创建一个服务类来实现分布式锁的获取和释放:

java 复制代码
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. 创建控制器类来测试分布式锁

创建一个控制器类来模拟获取和释放分布式锁的操作:

java 复制代码
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 实现分布式锁,确保在分布式环境中的资源访问控制。

相关推荐
秋天的怀念_David19 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
余槐i21 小时前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
方方洛21 小时前
ray教程-25-附录E-端到端实战案例
人工智能·分布式·机器学习
nice_lcj5201 天前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
AI源码2 天前
旅游推荐管理系统
spring boot
aiks_yuan2 天前
Spring Boot SSE 流式输出变成一次性返回怎么办:大模型打字机效果失效的 5 个原因(Spring Boot 4.1.2 实测)
spring boot
Thomas.Sir2 天前
第15课:SpringBoot连接池详解:HikariCP配置、调优、监控,4.x连接池新特性
java·spring boot
VimorphTech2 天前
每批开 4 个线程,为什么限制不住 TTS 的总并发?
java·spring boot·spring
杨凯凡2 天前
Spring Boot 缓存一致性怎么保证?@Cacheable、@CacheEvict 与事务提交时机实战
java·spring boot·spring cache·后端开发·缓存一致性
软件技术NINI2 天前
基于SpringBoot和Vue的项目评审系统
javascript·vue.js·spring boot·后端·spring·毕业设计·毕设