[框架系列]-[通用lock框架]

news2025/1/16 21:09:20

通用lock框架

  • 项目特点
  • 一:框架集成
    • 1.引入核心依赖
    • 2.使用redis厂商lock默认实现Redisson
    • 3.使用zookeeper厂商lock
  • 二:api调用示例
  • 三:注解支持
    • 1.注解介绍
    • 2.注解使用示例
  • 四:lock增强
  • 五:全局锁降级
  • 六:配置
    • 1.配置清单
    • 2.具体配置介绍
    • 3.配置demo
  • 七:CUSTOMER的SPI扩展示例
    • 1.SPI扩展点
    • 2.使用示例

项目特点

项目已在github开源,开源地址
如有问题或对此模块感兴趣,欢迎博客评论及github issue

  1. 集成分布式锁能力,starter依赖即可使用分布式锁能力
  2. 抽象分布式锁的集成,方便快速切换分布式锁方案(目前支持jvm,redis,zookeeper)
  3. 锁的调用基于spring lockRegistry以及java lock顶层接口,调用统一,支持多厂商实现(可同时使用),支持切换,支持扩展,
  4. 支持多种锁类型,可重入锁,读锁,写锁等
  5. 提供注解方式支持,并提供更强大方便的能力
  6. lock能力增强,支持本地预锁,事务感知,死锁检测
  7. 提供方法级定制以及全局定制能力

一:框架集成

1.引入核心依赖


<dependency>
    <groupId>com.ty</groupId>
    <artifactId>ty-framework-lock-starter</artifactId>
    <version>${最新版本}</version>
</dependency>

2.使用redis厂商lock默认实现Redisson


<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.18.0</version>
</dependency>

3.使用zookeeper厂商lock


<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>3.18.0</version>
</dependency>

以上2,3配置可选一种,如有需要可同时使用,注意

  • 使用redis方式需要按照spring-boot配置好redis的配置
  • 使用zookeeper方式,框架提供zookeeper快速集成配置,配置demo如下
framework:
  zookeeper:
    address: 127.0.0.1:2181 #zookeeper连接地址
    connection-time-out: 10000 #连接超时时间 毫秒
    session-time-out: 10000 #session超时时间 毫秒
    sleep-time-out: 3000 #重试初试时间 毫秒
    max-retries: 3 #重试次数
    name-space: curator #命名空间

二:api调用示例


@Service
public class TestService {
    @Autowired
    private LockRegistry lockRegistry;

    public void testLock(Long id) {
        Lock lock = lockRegistry.obtain(id.toString());
        try {
            boolean result = lock.tryLock();
            if (result) {
                //do your business code
            }
        } finally {
            //一定要放到finally中执行
            lock.unlock();
        }
    }
}

锁的获取使用Spring定义的lockRegistry,锁对象使用java定义的Lock接口

三:注解支持

1.注解介绍

注解简介
@FailFastLock快速失败的lock
@LocalLockJVM实现的lock
@AntiReLock防重锁,用于业务防止重复访问
@Lock顶层lock注解,支持所有策略及配置参数
  • @FailFastLock,@LocalLock,@AntiReLock 都是基于@Lock实现的,扩展注解主要是为了更好的语义以及使用体验,而无需指定多余的配置。比如@FailFastLock不用配置等待时间,等待时间是0
  • @AntiReLock 用于业务防止重复访问默认情况下与@FailFastLock能力一致,特别的:支持设置等待时间和异常message,并支持全局的AntiReLockMsg

2.注解使用示例


import com.ty.mid.framework.lock.annotation.LockKey;

@Service
public class TestService {
    @Autowired
    private LockRegistry lockRegistry;

    @FailFastLock(keys = "#id")
    public void testLock1(Long id) {
        //do your business code
    }

    //以下代码和上方代码等同
    @FailFastLock
    public void testLock2(@LockKey Long id) {
        //do your business code
    }
}

四:lock增强

  • 本地预锁
    在分布式锁使用前增加jvm lock逻辑,适用于锁竞争较大场景

  • 事务感知
    当lock存在于事务上下文中的策略,此情况发生时,会导致lock释放时,事务还未释放,从而导致锁不住的问题

  • 死锁检测
    可检测代码中可能出现的死锁场景,只是检测,并不一定会出现,仅做参考使用,建议勿在生产开启

五:全局锁降级

全局的implementer配置可实现全局锁降级策略,可选择平移至其他分布式锁实现,也可降级为jvm实现,保证业务可用

六:配置

1.配置清单

配置名配置简介默认值作用域说明
enable是否开启Boolean.TRUE全局全局开关
implementerock厂商实现类型LockImplementer.REDIS全局及注解可选:REDIS,ZOOKEEPER,JVM
typelock 的类型LockType.Reentrant全局及注解可选:Reentrant,Fair,Read,Write
keys自定义业务key仅注解支持SpingEL
name锁的名称全局见具体解释
waitTime获取锁等待时间2s全局及注解锁获取不到时最大等待时间
leaseTime最大持有时间60s全局及注解java Lock Api并没有定义,但像Redisson方言实现中有对应的定义,如想要使用此参数,开启dialect配置生效
lockFailStrategy加锁失败的处理策略FailOnLockStrategy.FAIL_FAST全局及注解可选:NO_OPERATION,THROWING,KEEP_ACQUIRE,CUSTOMER
exceptionOnLockStrategy加锁异常的处理策略ExceptionOnLockStrategy.THROW_EXCEPTION全局及注解可选:THROWING,CUSTOMER
releaseExceptionStrategy释放锁时异常的处理策略ReleaseTimeoutStrategy.FAIL_FAST全局及注解可选:THROWING,KEEP_ACQUIRE,CUSTOMER
exceptionClass获取锁失败时,报错的异常类型LockException全局及注解见具体解释
exceptionMsg获取锁失败时,报错的错误信息Failed to acquire Lock(%s) with timeout(%d ms)全局及注解见具体解释
customLockFailStrategy定制的加锁失败的处理策略全局及注解与lockFailStrategy中的CUSTOM不同点:此方式可对方法具体参数做定制化的处理策略,后者更适合做全局的默认处理
customReleaseTimeoutStrategy定制的释放锁时异常的处理策略全局及注解与releaseTimeoutStrategy中的CUSTOM不同点在于:此方式可对方法具体参数做定制化的处理策略,后者更适合做全局的默认处理
withLocalCache是否支持本地预锁Boolean.FALSE全局及注解增强能力:本地预锁
transactionStrategy是否支持事务感知LockTransactionStrategy.DISABLED全局增强能力:事务感知,可选值:WARMING,THROWING,THREAD_SAFE,DISABLED
cycleLockStrategy死锁探测LockTransactionStrategy.DISABLED全局增强能力:死锁探测,可选值: WARMING,THROWING,DISABLED
dialect方言开关Boolean.False全局api及注解支持方言,如redisson的最大持有锁时间
antiReLockMsg获取锁失败时,报错的错误信息(仅针对@AntiReLockMsg)Boolean.False全局及注解优先级:注解exceptionMsg>全局antiReLockMsg>全局exceptionMsg>系统默认
lockNamePrefix锁name的前缀lock全局生成的锁的name的前缀
lockNameSeparator锁key的连接符:全局key组合name时,多个key及前缀之间的连接符

2.具体配置介绍

前言:
所有的配置项,当作用域为全局及注解时,注解的优先级大于全局配置

  • keys及name
    框架会按照 l o c k N a m e P r e f i x : {lockNamePrefix}: lockNamePrefix:{name}: k e y 1 : . . . : {key1}:...: key1:...:{keyN}: @ L o c k K e y 1 : . . . : {@LockKey1}:...: @LockKey1:...:{@LockKeyN}的方式拼接,作为lock的LockId

特殊的:
当lockNamePrefix为空时, n a m e : {name}: name:{key1}:…: k e y N : {keyN}: keyN:{@LockKey1}:…😒{@LockKeyN}
当name,keys以及注解@LockKey都为空时,系统默认使用方法的全限定类名作为key(不推荐使用此方式)

  • transactionStrategy
    当lock存在于事务上下文中的策略,此情况发生时,会导致lock释放时,事务还未释放,从而导致锁不住的问题,可选策略
WAARMING  打warming日志
FORBIDDEN 禁止,会抛出异常阻断业务逻辑
THREAD_SAFE 保证多线程访问安全,unlock会在事务完成后再提交。缺点:会使lock的作用域膨胀。直至上下文事务完成
  • leaseTime
    java Lock Api并没有定义,但像Redisson方言实现中有对应的定义,框架兼容了方言特殊的api,如需使用参数,开启dialect配置.开启后api及注解全部生效

  • exceptionClass及exceptionMsg
    获取锁失败时,报错的异常类型
    a.仅当LockFailStrategy.FAIL_FAST或者ReleaseTimeoutStrategy.FAIL_FAST 生效 此处设置二者都会生效
    b.优先级:注解exceptionClass>全局exceptionClass>系统默认
    c.注意:必须是RuntimeException的子类

  • lockFailStrategy
    加锁失败的处理策略:

NO_OPERATION:继续执行业务逻辑,不做任何处理
FAIL_FAST:快速失败
KEEP_ACQUIRE:一直阻塞,直到获得锁,在太多的尝试后,仍会报错
CUSTOMER: 自定义,用于全局默认处理

其他锁过程处理Strategy类似,不再赘述

3.配置demo

framework:
  lock:
    enable: true
    exception-class: ty.framework.lock.test.customer.exception.Customer2Exception
    exception-msg: "我是全局默认的快速失败信息"
    implementer: zookeeper
    transaction-strategy: throwing
    with-local-cache: true
    cycle-lock-strategy: disabled
    lock-name-prefix: "prefix"
    lock-name-separator: "-"
    anti-re-lock-msg:  "业务防重加锁特定异常"

七:CUSTOMER的SPI扩展示例

1.SPI扩展点

以上的策略中,lockFailStrategy,lockExceptionStrategy,releaseTimeoutStrategy
都提供了CUSTOMER的的策略,框架通过java的SPI机制,将对应的用户自实现的策略加载

策略点策略名具体配置名扩展定义接口
加锁失败的处理策略lockFailStrategyCUSTOMERcom.ty.mid.framework.lock.handler.lockExceptionOnLockCustomerHandler
加锁异常的处理策略lockExceptionStrategyCUSTOMERcom.ty.mid.framework.lock.handler.lock.ExceptionOnLockCustomerHandler
释放锁异常的处理策略releaseTimeoutStrategyCUSTOMERcom.ty.mid.framework.lock.handler.lock.ReleaseTimeoutCustomerHandler

2.使用示例

这里以ExceptionOnLockCustomerHandler 作为示例
(1)在resources文件夹下创建文件夹META-INF/services

在这里插入图片描述

(2)在META-INF/services中添加file,名称为扩展的Handler的全限定类名

(3)文件中填写自己基于定义的接口的实现类的全限定类名

在这里插入图片描述

自定义处理策略加载后,如果需要指定为全局,需要在全局配置中指定定位的策略名的配置为CUSTOMER即可开启,方法级(或者注解)同理
注意:无论是全局还是注解的方法级,一旦指定以上策略的配置为CUSTOMER,则系统运行时必须存在对应的实现类,否则报错。不同的是,全局级配置报错将导致项目无法启动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1458750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能实训室解决方案2024

人工智能实训室解决方案 一、专业背景 人工智能是一门新兴的技术科学&#xff0c;旨在模拟、延伸和扩展人的智能。它涉及多个领域&#xff0c;如机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能的实际应用广泛&#xff0c;包括机器视觉、指纹识别、人脸识别…

谈谈:你在工作中用到的设计模式!

谈谈:你在工作中用到的设计模式! Hello大家龙年好! 春节的假期转眼间过去,我们也要回归往日的节奏 因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起设计模式在工作中的应用,既有点熟悉,又有点陌生, 在网上看吧,又感觉鸡肋(为啥?不能解燃煤之急啊!哈哈),所以,为了打破这…

【STC8A8K64D4开发板】第2-12讲:数码管显示

第2-12讲&#xff1a;数码管显示 学习目的了解数码管分类、工作原理及驱动电路的设计。掌握STC8A8K64D4系列单片机驱动8位共阴数码管的动态显示的软件设计。 数码管概述 数码管是一种常用的显示设备&#xff0c;他有着价格便宜、使用简单的特点&#xff0c;在各个领域被广泛的…

学生用台灯多少瓦比较合适呢?五大优质护眼台灯无广实测推荐

护眼台灯的出现成为众多宝妈人群青睐的对象&#xff0c;都希望能借助它的力量来保护孩子的视力健康。这类台灯不仅拥有柔和而舒适的光线&#xff0c;而且能有效防蓝光和眩光&#xff0c;提供恰到好处的色温&#xff0c;为孩子们创造一个理想的学习环境。然而&#xff0c;市面上…

【ArcGIS微课1000例】0105:三维模型转体模型(导入sketchup转多面体为例)

文章目录 一、实验概述二、三维模型转多面体三、加载多面体数据四、注意事项一、实验概述 ArcGIS可以借助【导入3D文件】工具支持主流的三维模型导入。支持 3D Studio Max (.3ds)、VRML and GeoVRML 2.0 (.wrl)、SketchUp 6.0 (.skp)、OpenFlight 15.8 (.flt)、Collaborative …

【知识整理】简述 Code Review - 代码审查

一、Code Review 简述 为保证上线代码质量&#xff0c;经研究决定0412版本起实行Code Review 。具体操作方式为组织 review 会。提出的优化点需立即执行更改&#xff0c;Review会要求给出调整方式方法。同时为了确保项目或迭代版本的时间&#xff0c;请各开发同学提前做好时间…

Unity2023.1.19_ShaderGraph节点说明以及使用技巧

Unity2023.1.19_ShaderGraph节点说明以及使用技巧 目录 Unity2023.1.19_ShaderGraph节点说明以及使用技巧 1. 快捷键CtrlG完成和UE蓝图使用快捷键C一样的蓝图分组注释效果&#xff1a; 2. Tiling And Offset&#xff1a; 3. 以下是两组URP材质渲染的效果对比&#xff1a; 4…

大学生考试搜题用什么软件?学生党都在用的八款搜题工具来了 #经验分享#经验分享#经验分享

人工智能技术的发展正逐渐改变着我们的生活&#xff0c;学习如何运用这些技术将成为大学生的必备素养。 1.颐博查题 这是一个网站 在线搜题、题目答案分享网站。是我用过最好用的搜题类网站,还有小程序、公众号,用起来十分方便,想用哪个就用哪个。而且每天都可以免费使用。 …

【力扣 - 二叉树的中序遍历】

题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 提示&#xff1a; 树中节点数目在范围 [0, 100] 内 -100 < Node.val < 100方法一&#xff1a;递归 思路与算法 首先我们需要了解什么是二叉树的中序遍历&#xff1a;按照访问左子树——…

适用于预算少企业的网络组网方案

在中小企业的日常运营中&#xff0c;建立稳定高效的网络连接至关重要。无论是进行内部协作、访问云应用、处理大量数据还是与客户进行沟通&#xff0c;都需要一个可靠的网络基础设施。然而&#xff0c;由于预算有限和资源限制&#xff0c;中小企业在构建适合自身需求的网络环境…

java面试题之redis篇

1.redis 中的数据类型有哪些 随着 Redis 版本的更新&#xff0c;后面又支持了四种数据类型&#xff1a; BitMap&#xff08;2.2 版新增&#xff09;、HyperLogLog&#xff08;2.8 版新增&#xff09;、GEO&#xff08;3.2 版新增&#xff09;、Stream&#xff08;5.0 版新增&am…

php实现讯飞星火大模型3.5

前期准备 vscode下载安装好 composer下载安装好 php环境安装好 &#xff08;以上可以自行网上查阅资料&#xff09; 开始实现 1.注册讯飞星火用户&#xff0c;获取token使用 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 2.修改对应php文件中的key等 可以参考…

Vue3自定义全局指令批量注册

指令封装代码&#xff1a; import type { App } from "vue";const content {mounted(el : any, binding : any) {console.dir(binding.value);el.remove();} };const operate {mounted(el : any, binding : any) {console.dir(binding.value);el.remove();} };cons…

第十篇:node处理404和服务器错误

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录</

PostgreSQL教程(四):高级特性

一、简介 在之前的章节里我们已经涉及了使用SQL在PostgreSQL中存储和访问数据的基础知识。现在我们将要讨论SQL中一些更高级的特性&#xff0c;这些特性有助于简化管理和防止数据丢失或损坏。最后&#xff0c;我们还将介绍一些PostgreSQL扩展。 本章有时将引用教程&#xff0…

有事休假店铺无人看守怎么办?智能远程视频监控系统保卫店铺安全

在春节期间&#xff0c;很多自营店主也得到了久违的假期&#xff0c;虽然很多店主都是长期在店铺中看守&#xff0c;但遇到春节这样的日子&#xff0c;多数人还是选择回乡休假。面对店主休假或有事不能管理店铺时&#xff0c;传统的监控虽然可以做到单一的监控&#xff0c;却仍…

【Vuforia+Unity】AR01实现单张多张图片识别产生对应数字内容

1.官网注册 Home | Engine Developer Portal 2.下载插件SDK&#xff0c;导入Unity 3.官网创建数据库上传图片&#xff0c;官网处理成数据 下载好导入Unity&#xff01; 下载好导入Unity&#xff01; 下载好导入Unity&#xff01; 下载好导入Unity&#xff01; 4.在Unity设…

白银交易新手指南:怎样选择可靠的现货交易平台?

在投资市场上&#xff0c;白银作为一种贵金属&#xff0c;具有较高的投资价值和风险防范功能。对于白银交易新手来说&#xff0c;选择一个可靠的现货交易平台是至关重要的。那么&#xff0c;如何挑选一个适合自己的现货交易平台呢&#xff1f; 1. 平台资质 一个正规的现货交易…

微信小程序-表单提交和校验

一、使用vant组件生成如下页面 二、前端代码如下 <form bindsubmit"submitForm"><view class"cell-group"><van-cell-group><van-field value"{{ title }}" label"商品名称" placeholder"请输入商品名称&qu…

不再烦恼!微信自动回复,消息秒回利器!

在当今社交网络高度发达的时代&#xff0c;微信已成为人们日常沟通不可或缺的重要工具。然而&#xff0c;随着微信好友数量的增加&#xff0c;消息的频繁和多样化也让人感到压力倍增。 针对这一现状&#xff0c;微信管理系统应运而生&#xff0c;为用户提供了一种便捷而高效的…