通用幂等解决方案

幂等定义

在接口重复调用的情况下,对系统产生的影响是一样的,但是返回值允许不同,如查询。幂等性不仅仅只是一次或多次操作对资源没有产生影响,还包括第一次操作产生影响后,以后多次操作不会再产生影响。并且幂等关注的是是否对资源产生影响,而不关注结果。

实现方案

1、定义幂等性注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Idempotent {

// 幂等Key的值,不填默认为类名+方法名
String value;

// 幂等时间
int timeSeconds() default 30L;

/**
* 参数的表达式,用来确定key值,参考Spring @Cacheable注解中key的写法
*/
String key();

//是否拒绝重复请求,true则多次请求会抛出异常后给出重复请求的结果,false则在幂等时间内返回同样结果
boolean refusedRepeatedRequests default true;
}

2、定义幂等处理切面

处理步骤:

  1. 获取Idempotent上的value及key用来构建Redis的Key
  2. 判断是否拒绝重复请求
  3. 是,则根据Redis的Key增加分布式锁,已锁定则执行业务方法,未锁定则抛出异常给出提示
  4. 否,根据Redis的Key查询是否存在数据
  • 若存在,则直接返回缓存内容。
  • 若不存在,则执行业务方法,执行成功后缓存到Redis中。

使用

应用在需要幂等的方法上。使用@Idempotent注解并填好相关属性即可