通用幂等解决方案
幂等定义
在接口重复调用的情况下,对系统产生的影响是一样的,但是返回值允许不同,如查询。幂等性不仅仅只是一次或多次操作对资源没有产生影响,还包括第一次操作产生影响后,以后多次操作不会再产生影响。并且幂等关注的是是否对资源产生影响,而不关注结果。
实现方案
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、定义幂等处理切面
处理步骤:
- 获取Idempotent上的value及key用来构建Redis的Key
- 判断是否拒绝重复请求
- 是,则根据Redis的Key增加分布式锁,已锁定则执行业务方法,未锁定则抛出异常给出提示
- 否,根据Redis的Key查询是否存在数据
- 若存在,则直接返回缓存内容。
- 若不存在,则执行业务方法,执行成功后缓存到Redis中。
使用
应用在需要幂等的方法上。使用@Idempotent注解并填好相关属性即可