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

相关推荐
两点王爷3 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
leoZ2314 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
孫治AllenSun6 小时前
【LangChain4J-09】开发学习知识点
spring boot·后端·学习
林石工作室7 小时前
体育直播APP从0到1搭建指南:技术选型、核心模块与部署实战
spring boot·流媒体·app搭建·体育直播app·星逐赛事
LXMXHJ9 小时前
springboot中的线程操作
java·spring boot·后端·线程
行百里er11 小时前
BlockingQueue:异步批量上报
spring boot·spring cloud·监控
武哥聊编程13 小时前
【AI实战项目】AI Agent数据分析平台,基于SpringAI+Springboot+Vue+Agent的电商数据分析平台
人工智能·spring boot·数据分析·springai
计算机毕设定制辅导-无忧学长13 小时前
《基于SpringBoot的庭院玫瑰栽培养护知识交互式科普平台设计与实现》
java·spring boot·后端·毕业设计·个性化推荐·协同过滤算法·庭院玫瑰栽培养护知识科普平台
骇客野人13 小时前
SpringBoot数十Jar包批量生产部署落地实施方案(Shell+Systemd完整版)
spring boot·后端·jar
江畔柳前堤13 小时前
云原生 × AI 全景图谱:从 Kubernetes 到 Agent 基础设施的一次认知跃迁
人工智能·分布式·gpt·云原生·kubernetes·原型模式·agi