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