image.png分布式锁

ykkj-spring-boot-starter-protection技术组件,使用 Redis 实现分布式锁的功能,它有 2 种使用方式:

  • 编程式锁:基于 Redisson框架提供的各种分布式锁
  • 声明式锁:基于 Lock4j框架的 @Lock4j 注解

    1. 编程式锁

    ```xml org.redisson redisson-spring-boot-starter
  1. <a name="ALgMC"></a>
  2. ### 1.1 Redisson 配置
  3. 无需配置。因为在 [Redis 缓存](https://doc.iocoder.cn/redis-cache) 中,进行了 Spring Data Redis + Redisson 的配置。
  4. <a name="x9z5Q"></a>
  5. ### 1.2 实战案例
  6. ykkj-module-pay 模块的 notify功能,使用到分布式锁,确保**每个**支付通知任务有且仅有一个在执行。下面,来看看这个案例是如何实现的。<br />**友情提示:**<br />建议你已经阅读过 《开发指南 —— Redis 缓存》 文档。<br />① 在 RedisKeyConstants类中,定义通知任务使用的分布式锁的 Redis Key。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652278237292-c24f5bb4-86d8-4c7a-9df4-4b50bf8394c7.png#clientId=u54f24ce5-d659-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=uc69adee9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=152&originWidth=1120&originalType=url&ratio=1&rotation=0&showTitle=false&size=41889&status=done&style=none&taskId=u01ceab1b-9413-489a-a0a7-16c9c06df41&title=)<br />② 创建 PayNotifyLockRedisDAO类,使用 RedisClient 实现分布式锁的加锁与解锁。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652278237537-c490f24a-a920-473f-9561-399f366948f2.png#clientId=u54f24ce5-d659-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ud2204050&margin=%5Bobject%20Object%5D&name=image.png&originHeight=504&originWidth=884&originalType=url&ratio=1&rotation=0&showTitle=false&size=105437&status=done&style=none&taskId=u54ada9c5-3f4e-4850-9ac0-02a9e142133&title=)<br />③ 在 PayNotifyServiceImpl执行指定的支付通知任务时,通过 PayNotifyLockRedisDAO 获得分布式锁。如下图所示:<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28522586/1652278237860-62f95bb2-1420-428b-96b4-2b521ba9497c.png#clientId=u54f24ce5-d659-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ua354738e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=571&originWidth=1154&originalType=url&ratio=1&rotation=0&showTitle=false&size=139049&status=done&style=none&taskId=u87c3a47d-f8e3-4d28-9390-1c3f3fb3230&title=)<br />**技术选型:为什么不使用 Lock4j 提供的 LockTemplate 实现编程式锁?**<br />两者各有优势,选择 Redisson 主要考虑它支持的 Redis 分布式锁的类型较多:可靠性较高的红锁、性能较好的读写锁等等。<br />Lock4j 的 LockTemplate 也是不错的选择,一方面不强依赖 Redisson 框架,一方面支持 ZooKeeper 等等。
  7. <a name="epzmy"></a>
  8. ## 2. 声明式锁
  9. ```xml
  10. <dependency>
  11. <groupId>org.redisson</groupId>
  12. <artifactId>redisson-spring-boot-starter</artifactId>
  13. </dependency>

2.1 Lock4j 配置

在 application-local.yaml配置文件中,通过 lock4j 配置项,添加 Lock4j 全局默认的分布式锁配置。如下图所示:
image.png

2.2 使用案例

在需要使用到分布式锁的方法上,添加 @Lock4j 注解,非常方便。示例代码如下:

@Service
public class DemoService {

    // 默认使用 lock4j 配置项
    @Lock4j
    public void simple() {
        //do something
    }

    // 完全配置,支持 Spring EL 表达式
    @Lock4j(keys = {"#user.id", "#user.name"}, expire = 60000, acquireTimeout = 1000)
    public User customMethod(User user) {
        return user;
    }

}

image.png限流熔断

ykkj-spring-boot-starter-protection技术组件,基于 Resilience4j轻量级的容错组件,实现熔断器、限流器、舱壁隔离、重试、限时器的功能。