# 分布式幂等(forge-starter-idempotent) 基于注解的分布式幂等框架,支持多种策略和 Redisson 分布式锁。 ## 快速开始 ### 1. 引入依赖 ```xml com.mdframe.forge forge-starter-idempotent ``` ### 2. 使用 `@Idempotent` 注解 ```java @PostMapping("/order") @Idempotent(prefix = "order:create", expire = 600, message = "订单创建中,请勿重复提交") public RespInfo createOrder(@RequestBody OrderCreateRequest request) { // ... } ``` ## 核心功能 ### 幂等策略 | 策略 | 说明 | 适用场景 | |------|------|---------| | `STRICT` | 严格拒绝,重复请求直接抛出异常 | 支付、下单等严格幂等场景 | | `RETURN_CACHE`(默认) | 重复请求返回缓存的上次执行结果 | 查询后写、耗时的计算 | | `TOKEN_REQUIRED` | 必须先获取幂等 Token,携带 Token 才能执行 | 前端表单提交 | ### 注解属性 | 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | `prefix` | String | `"idempotent:"` | Redis Key 前缀 | | `expire` | int | 600 | 幂等 Key 过期时间(秒) | | `key` | String | `""` | SpEL 表达式,用于自定义幂等 Key | | `message` | String | `"请勿重复提交"` | 重复提交时的提示信息 | | `deleteKeyAfterSuccess` | boolean | false | 成功后是否删除幂等 Key | | `strategy` | IdempotentStrategy | `RETURN_CACHE` | 幂等策略 | | `cacheExpire` | int | 3600 | 缓存结果过期时间(秒) | | `cacheResult` | boolean | true | 是否缓存执行结果 | | `enableMetrics` | boolean | true | 是否启用 Prometheus 指标 | ### TOKEN_REQUIRED 策略 — Token API 使用 `TOKEN_REQUIRED` 策略时,需要先获取幂等 Token: ``` POST /api/idempotent/token/generate { "prefix": "order:create", "expire": 300 } # 返回 { "token": "a1b2c3d4-..." } ``` 执行请求时在请求头中携带 Token: ``` POST /api/order X-Idempotent-Token: a1b2c3d4-... Content-Type: application/json {...} ``` ### SpEL 表达式自定义 Key ```java @Idempotent(prefix = "user:update", key = "#userId", expire = 300) public RespInfo updateUser(@PathVariable Long userId, @RequestBody UserUpdateRequest request) { // 幂等 Key = "user:update:" + userId } ``` ## 配置项 ```yaml forge: idempotent: enabled: true prefix: "idempotent:" expire: 600 message: "请勿重复提交" cache: enabled: true expire: 3600 maxSize: 10000 lock: enabled: true waitTime: 3000 # 分布式锁等待时间(ms) leaseTime: 5000 # 分布式锁持有时间(ms) token: enabled: true expire: 300 # Token 过期时间(秒) header: "X-Idempotent-Token" ``` ## 核心组件 | 组件 | 说明 | |------|------| | `IdempotentAspect` | AOP 切面,拦截 `@Idempotent` 注解的方法 | | `IdempotentKeyGenerator` | 幂等 Key 生成器,支持 SpEL 表达式 | | `RedisTokenService` | Redis Token 服务,管理 Token 生命周期 | | `RedisResultCacheService` | 结果缓存服务,缓存执行结果 | | `RedissonLockManager` | Redisson 分布式锁管理器(带 Watchdog) | | `StrictStrategyHandler` | STRICT 策略处理器 | | `ReturnCacheStrategyHandler` | RETURN_CACHE 策略处理器 | | `TokenRequiredStrategyHandler` | TOKEN_REQUIRED 策略处理器 | ## 执行流程 ``` 请求进入 → 生成/解析幂等 Key → 选择策略 → STRICT: 尝试获取锁 → 失败则抛异常 → RETURN_CACHE: 查缓存 → 有则返回,无则执行并缓存 → TOKEN_REQUIRED: 验证 Token → 通过后走 RETURN_CACHE 流程 ```