如何利用consul在spring boot中实现分布式锁场景
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇内容介绍了"如何利用consul在spring boot中实现分布式锁场景"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家
千家信息网最后更新 2025年11月15日如何利用consul在spring boot中实现分布式锁场景
本篇内容介绍了"如何利用consul在spring boot中实现分布式锁场景"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
以下是锁实现代码:
package com.lyb.consullock;import com.ecwid.consul.v1.ConsulClient;import com.ecwid.consul.v1.agent.model.NewCheck;import com.ecwid.consul.v1.kv.model.PutParams;import com.ecwid.consul.v1.session.model.NewSession;import com.ecwid.consul.v1.session.model.Session;import lombok.Data;import java.time.LocalDateTime;import java.util.ArrayList;import java.util.List;public class DistributedLock{ private ConsulClient consulClient; /** * 构造函数 * @param consulHost 注册consul的client或服务端的Ip或主机名,或域名 * @param consulPort 端口号 */ public DistributedLock(String consulHost,int consulPort){ consulClient = new ConsulClient(consulHost,consulPort); } /** * 获得锁的方法 * @param lockName 竞争的资源名 * @param ttlSeconds 锁的超时时间,超过该时间自动释放 * @return */ public LockContext getLock(String lockName,int ttlSeconds){ LockContext lockContext = new LockContext(); if(ttlSeconds<10 || ttlSeconds > 86400) ttlSeconds = 60; String sessionId = createSession(lockName,ttlSeconds); boolean success = lock(lockName,sessionId); if(success == false){ consulClient.sessionDestroy(sessionId,null); lockContext.setGetLock(false); return lockContext; } lockContext.setSession(sessionId); lockContext.setGetLock(true); return lockContext; } /** * 释放锁 * @param sessionID */ public void releaseLock(String sessionID){ consulClient.sessionDestroy(sessionID,null); } private String createSession(String lockName,int ttlSeconds){ NewCheck check = new NewCheck(); check.setId("check "+lockName); check.setName(check.getId()); check.setTtl(ttlSeconds+"s"); //该值和session ttl共同决定决定锁定时长 check.setTimeout("10s"); consulClient.agentCheckRegister(check); consulClient.agentCheckPass(check.getId()); NewSession session = new NewSession(); session.setBehavior(Session.Behavior.RELEASE); session.setName("session "+lockName); session.setLockDelay(1); session.setTtl(ttlSeconds + "s"); //和check ttl共同决定锁时长 List checks = new ArrayList<>(); checks.add(check.getId()); session.setChecks(checks); String sessionId = consulClient.sessionCreate(session,null).getValue(); return sessionId; } private boolean lock(String lockName,String sessionId){ PutParams putParams = new PutParams(); putParams.setAcquireSession(sessionId); boolean isSuccess = consulClient.setKVValue(lockName,"lock:"+ LocalDateTime.now(),putParams).getValue(); return isSuccess; } /** * 竞争锁时返回的对象 */ @Data public class LockContext{ /** * 获得锁成功返回该值,比便后面用该值来释放锁 */ private String session; /** * 是否获得到锁 */ private boolean isGetLock; }} pom文件
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.6.RELEASE com.lyb consul-lock 0.0.1-SNAPSHOT consul-lock Demo project for Spring Boot 1.8 Greenwich.SR2 org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-consul-discovery org.springframework.boot spring-boot-starter-actuator org.projectlombok lombok 1.18.8 true org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin
测试代码:
package com.lyb.consullock;import org.junit.Assert;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;@RunWith(SpringRunner.class)@SpringBootTestpublic class ConsulLockApplicationTests { @Autowired private ServiceConfig serviceConfig; @Test public void lockSameResourer() { //针对相同资源在同一时刻只有一个线程会获得锁 ExecutorService threadPool = Executors.newFixedThreadPool(10); for (int a=0;a<20;a++){ threadPool.submit( () -> { for (int i = 0;i < 100; i++) { DistributedLock lock = new DistributedLock( serviceConfig.getConsulRegisterHost(), serviceConfig.getConsulRegisterPort()); DistributedLock.LockContext lockContext = lock.getLock("test lock", 10); if (lockContext.isGetLock()) { System.out.println(Thread.currentThread().getName() + "获得了锁"); try { TimeUnit.SECONDS.sleep(1); lock.releaseLock(lockContext.getSession()); } catch (InterruptedException e) { e.printStackTrace(); } }else { //System.out.println(Thread.currentThread().getName() + "没有获得锁"); } } }); } try { TimeUnit.MINUTES.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } @Test public void lockDiffResource(){ //针对不通的资源所有线程都应该能获得锁 ExecutorService threadPool = Executors.newFixedThreadPool(10); for (int a=0;a<20;a++){ threadPool.submit( () -> { for (int i = 0;i < 100; i++) { DistributedLock lock = new DistributedLock( serviceConfig.getConsulRegisterHost(), serviceConfig.getConsulRegisterPort()); DistributedLock.LockContext lockContext = lock.getLock("test lock"+Thread.currentThread().getName(), 10); if (lockContext.isGetLock()) { System.out.println(Thread.currentThread().getName() + "获得了锁"); try { TimeUnit.SECONDS.sleep(1); lock.releaseLock(lockContext.getSession()); } catch (InterruptedException e) { e.printStackTrace(); } }else { //System.out.println(Thread.currentThread().getName() + "没有获得锁"); Assert.assertTrue(lockContext.isGetLock()); } } }); } try { TimeUnit.MINUTES.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } }}"如何利用consul在spring boot中实现分布式锁场景"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
资源
分布式
场景
中实
代码
内容
得了
时长
时间
更多
知识
线程
竞争
实用
相同
成功
学有所成
接下来
主机
函数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
北京游戏软件开发
2003服务器远程桌面
隐藏的网络安全和开放
数据库设计与优化
易语言edb数据库操作
网站关联数据库
为什么光遇服务器总是连接失败
可以在线编辑的共享服务器
数据库中创建表怎么创建
牛逼网络技术网盘分享
实时数据库项目融资
闵行区媒体数据库收费标准
网络安全方针政策
数据库高级技术面试
思科云服务器管理员密码
c dll 数据库连接
网络安全概论提问
中宣部网络技术中心
网络安全 问卷
厦门市安杰森网络技术有限公司
服务器文件夹 安全选项
系统镜像服务器在哪
古风网络安全手抄报五年级
数据库字段截取存储
软件开发收入增值税税率
杭州晨胜网络技术有限公司电话
电子软件开发属于什么专业
管理服务器i5配置价格
ei是线索型数据库吗
长沙溜克网络技术有限责任公司