1.概述
在平台中一些接口需要增加幂等处理,幂等的概念是一个业务请求只能执行一次。类似银行业务办理,首先需要取一个号,然后用户使用这个号去柜台办理业务。这个号只能使用一次,如果过期或者已办理这个号就无效了。
我们的幂等也是使用这种原理。
1.首先客户端调用通过我们的系统获取一个号,我们称之为幂等号,这个号已经存在我们的系统中。
2.客户端使用这个号,调用我们的接口。
3.我们系统判断这个号在我们的系统中已经存在,如果存在则允许业务办理,如果不存在,则表示这是一个非法的号,我们直接抛出异常。
4.当业务处理完成,我们会将这个号从我们的系统中删除掉。
2. 代码结构
- Idempotence:幂等号处理接口
- IdempotenceRequired:幂等处理注解
- IdempotenceSupportAdvice:幂等处理切面类
- RedisIdempotence:redis缓存实现类
- IdempotenceUtil:幂等工具类
3. 如何在自己的应用中加入幂等功能
用户可以在自己的应用中增加幂等功能。
客户可以通过切面的实现,或者自己调用幂等框架的API实现幂等。
3.1. 编辑 pom.xml 文件
引入jpaas-idempotence-spring-boot-starter模块
<dependency>
<groupId>com.redxun</groupId>
<artifactId>jpaas-idempotence-spring-boot-starter</artifactId>
<version>1.1.RELEASE</version>
</dependency>
在pom.xml 增加上述幂等模块
3.2 使用切面实现
不是所有的方法都需要切面拦截 ,只有 IdempotenceRequired
注解的方法才会被拦截。
@IdempotenceRequired
@PostMapping("/getUsers")
public JsonPageResult getUsers(
在开发幂等接口时,只需要在方法上简单增加一个 IdempotenceRequired
注解即可。
3.3 使用API接口自己实现
当用户需要自己定义接口是否使用幂等进行处理。
@Autowired
Idempotence idempotence;
@PostMapping("/getUsers")
public JsonPageResult getUsers(){
// 从HTTP header中获取幂等号idempotenceId
IdempotenceUtil idempotenceUtil=SpringUtil.getBean(IdempotenceUtil.class);
//从上下文的请求头中获取幂等号。
String idempotenceId = idempotenceUtil.getHeaderIdempotenceId();
if(StringUtils.isNotEmpty(idempotenceId)){
// 前置操作 幂等号是否存在
boolean existed = idempotence.check(idempotenceId);
if (existed) {
throw new IdempotencyException("{success:false,message:\"操作重复,请重新输入幂等号重试!\",data:-2}");
}
//记录幂等号
idempotence.record(idempotenceId,1800);
}
//执行正常业务逻辑
}
4. 客户端请求调用
服务端处理号后,在客户端访问接口的时候需要执行以下步骤
- 需要先获取幂等号
- 然后将幂等号添加到请求头中
4.1 获取幂等号
http://服务地址/api/api-system/system/idempotence/generateId
4.2 通过代码获取幂等号
IdempotenceUtil idempotenceUtil=SpringUtil.getBean(IdempotenceUtil.class);
//获取幂等号
String idempotenceId=idempotenceUtil.generateId();
4.3 请求调用(同时执行,只执行一次)
图中显示,在通过postman调用时,传入了 idempotenceId 为键的幂等号。
上面演示的是,一个幂等号只能使用一次,这样我们就可以防止客户重复提交。
文档更新时间: 2021-07-19 18:40 作者:zyg