Skip to content

分布式幂等(forge-starter-idempotent)

工程位置:forge-server/forge-framework/forge-starter-parent/forge-starter-idempotent。Maven artifactIdforge-starter-idempotentsrc/main/java 里有 29 个 Java 文件。

引入

xml
<dependency>
    <groupId>com.mdframe.forge</groupId>
    <artifactId>forge-starter-idempotent</artifactId>
</dependency>

自动装配

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 登记了:

  • com.mdframe.forge.starter.idempotent.config.IdempotentAutoConfiguration

配置属性

四个 @ConfigurationProperties 类都没有字段 javadoc。下表只写字段名和类内默认值,不编造注释。常量默认值来自 IdempotentConstantDEFAULT_PREFIX = "idempotent:"DEFAULT_EXPIRE = 600DEFAULT_MESSAGE = "请勿重复提交"CACHE_EXPIRE_DEFAULT = 3600

forge.idempotent.tokencom.mdframe.forge.starter.idempotent.properties.TokenProperties

字段类型类内默认值说明
enabledbooleantrue源码无字段注释。
expireint300源码无字段注释。Token 过期秒数,与 /api/idempotent/token/generate 返回的 expireSeconds 同源。
headerString"X-Idempotent-Token"源码无字段注释。请求头名,TokenRequiredStrategyHandler 从该头取 Token。

forge.idempotentcom.mdframe.forge.starter.idempotent.properties.IdempotentProperties

字段类型类内默认值说明
enabledbooleantrue源码无字段注释。
prefixString"idempotent:"源码无字段注释。与 IdempotentConstant.DEFAULT_PREFIX 相同。
expireint600源码无字段注释。与 IdempotentConstant.DEFAULT_EXPIRE 相同。
messageString"请勿重复提交"源码无字段注释。与 IdempotentConstant.DEFAULT_MESSAGE 相同。
cacheCachePropertiesnew CacheProperties()嵌套 forge.idempotent.cache
tokenTokenPropertiesnew TokenProperties()嵌套 forge.idempotent.token
lockLockPropertiesnew LockProperties()嵌套 forge.idempotent.lock

forge.idempotent.cachecom.mdframe.forge.starter.idempotent.properties.CacheProperties

字段类型类内默认值说明
enabledbooleantrue源码无字段注释。
expireint3600源码无字段注释。与 IdempotentConstant.CACHE_EXPIRE_DEFAULT 相同。
maxSizeint10000源码无字段注释。

forge.idempotent.lockcom.mdframe.forge.starter.idempotent.properties.LockProperties

字段类型类内默认值说明
enabledbooleantrue源码无字段注释。
waitTimelong3000源码无字段注释。RedissonLockManager.tryLock 的等待毫秒。
leaseTimelong5000源码无字段注释。RedissonLockManager.tryLock 的租约毫秒。

类内默认值不是官方启动配置。各服务 application.yml 可以覆盖。

注解

@Idempotent

com.mdframe.forge.starter.idempotent.annotation.Idempotent,可标在方法或类上。

成员类型默认值说明
prefixStringIdempotentConstant.DEFAULT_PREFIX幂等键前缀,用来区分业务场景,避免键冲突。默认 "idempotent:"
expireintIdempotentConstant.DEFAULT_EXPIRE幂等键过期秒数。过期后可再次提交。默认 600
keyString""幂等键表达式。支持 SpEL,可引用方法参数。空则走默认键生成。
messageStringIdempotentConstant.DEFAULT_MESSAGE触发幂等拦截时返回给客户端的提示。默认 "请勿重复提交"
deleteKeyAfterSuccessbooleanfalse成功后是否删除幂等键。适合支付、转账这类一次性操作。
strategyIdempotentStrategyIdempotentStrategy.RETURN_CACHE重复请求怎么处理,见下表。
cacheExpireintIdempotentConstant.CACHE_EXPIRE_DEFAULT结果缓存过期秒数。只在 strategy=RETURN_CACHEcacheResult=true 时生效。默认 3600
cacheResultbooleantrue是否缓存执行结果。true 重复请求返回缓存;false 只防重不缓存。仅 RETURN_CACHE 生效。
enableMetricsbooleantrue是否记录拦截次数、耗时等监控指标。

源码示例:

java
@Idempotent(key = "'order:' + #orderId")
public Order createOrder(Long orderId) { ... }

@Idempotent(key = "'payment:' + #paymentId", strategy = IdempotentStrategy.STRICT)
public PaymentResult pay(PaymentRequest request) { ... }

@Idempotent(key = "'transfer:' + #requestId", strategy = IdempotentStrategy.TOKEN_REQUIRED)
public TransferResult transfer(TransferRequest request) { ... }

策略枚举

com.mdframe.forge.starter.idempotent.enums.IdempotentStrategy

常量code说明
STRICTstrict同一幂等键的重复请求直接抛异常,不返回结果。
RETURN_CACHEreturn_cache返回上次执行的缓存结果。需要 cacheResult=truefromCode 找不到时也回落到这个值。
TOKEN_REQUIREDtoken_required请求必须带有效幂等 Token。Token 由服务端生成再下发给客户端。

Token 接口

IdempotentTokenController 映射在 /api/idempotent/token

方法路径参数返回
POST/api/idempotent/token/generateprefix(可选)RespInfo&lt;TokenInfoDTO&gt;
POST/api/idempotent/token/batch-generatecount(必填,1–100),prefix(可选)RespInfo&lt;List&lt;TokenInfoDTO&gt;&gt;count 越界返回 "count参数必须在1-100之间"
POST/api/idempotent/token/validatetoken(必填),prefix(可选)RespInfo&lt;Boolean&gt;

TokenInfoDTO 字段:tokenexpireSecondscreateTime。源码无字段注释。

源码类型清单

下面只列 forge-starter-idempotent 自己的公开类型。

接口

  • com.mdframe.forge.starter.idempotent.constant.IdempotentConstant
  • com.mdframe.forge.starter.idempotent.generator.IdempotentKeyGenerator
  • com.mdframe.forge.starter.idempotent.lock.LockManager
  • com.mdframe.forge.starter.idempotent.service.IdempotentStorageService
  • com.mdframe.forge.starter.idempotent.service.ResultCacheService
  • com.mdframe.forge.starter.idempotent.service.TokenService
  • com.mdframe.forge.starter.idempotent.strategy.IdempotentStrategyHandler

枚举

  • IdempotentStrategy

  • CacheProperties
  • DefaultIdempotentKeyGenerator
  • IdempotentAspect
  • IdempotentAutoConfiguration
  • IdempotentException
  • IdempotentProperties
  • IdempotentResult
  • IdempotentTokenController
  • LockProperties
  • RedisIdempotentStorageService
  • RedisResultCacheService
  • RedisTokenService
  • RedissonLockManager
  • ReturnCacheStrategyHandler
  • SpelUtil
  • StrictStrategyHandler
  • TokenInfoDTO
  • TokenInvalidException
  • TokenProperties
  • TokenRequiredStrategyHandler

相关文档