01 什么是接口幂等性
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条...,这就没有保证接口的幂等性
02 基本思路
核心是判断两次请求是否为同一操作。通常方法是解析请求所有参数,判断参数是否完全一致。如果两次参数一样,则是重复提交。还有是通过唯一索引来判断,如发货操作,一笔订单只能发货一次。所以可以通过唯一订单号来判断两次是否为重复提交。
03 具体实现
- 定义幂等性注解,在需要幂等性的接口加上此注解
- 项目启动时,扫描幂等性注解,解析具体接口URL,并将URL与幂等性接口一一绑定,生成map对象,以便后续快速根据URL判断此接口是否需要幂等性判断
- 新增幂等性拦截器。根据URL判断此请求是否需要幂等性校验(第2步已将数据封装,可快速判断)。
- 将请求参数按照特定规则生成key值,根据此Key值,从redis获取具体值,如果为null,则为首次(正常)访问。否则为重复访问,需要过滤此请求。
04 延伸:限流
场景:限制单个用户每个小时只能访问某个接口100次
实现:将用户的每次访问时间记录在redis中,每次访问获取第100前的访问时间。如果未能获取到访问时间,则说明该用户未访问100次。如果获取到时间,则判断该时间是否在一小时内,如果是在一小时内,则该用户需要限流,不能再访问了。如果不在一小时内,则从redis移除该访问记录。