接口幂等性问题

通常是唯一标示+redis的setnx命令加上时间间隔,配合spring环绕通知实现的,还需要加日志等收集错误信息等,这里就不介绍了

代码逻辑:唯一表示采用:ip+方法里面的一堆参数+个人信息,主要逻辑就是下面这样,分布式锁也同理可以通过这个方法实现

   /**
     * 幂等性接口处理的环绕通知
     * 核心需要找到一些唯一的标记
     * 1.拿到请求的ip
     * 2.拿到请求的方法名称
     * 3.拿到参数值
     * 4.拿到当前用户的身份 id
     * 5.组合成一个唯一的标记
     * 6.通过redis的setnx方法(set if not exist)
     * 7.拦截还是执行目标方法
     *
     * @param joinPoint
     * @return
     */
    @Around(value = "@annotation(com.powernode.anno.Idempotence)")
    public Object IdempotenceAround(ProceedingJoinPoint joinPoint) {
        Object result = null;
        //获取ip
        String ip = WebUtil.getIp();
        //方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        String methodName = method.getName();
        //类
        Class<?> aClass = method.getDeclaringClass();
        String typeName = aClass.getName();
        //参数
        Object[] args = joinPoint.getArgs();
        String argsStr = JSON.toJSONString(args);
        //当前身份标示
        Integer userId = 1;
        //唯一标示
        String key = ip + "-" + typeName + "-" + methodName + "-" + argsStr + "-" + userId;
        //这里后面啊的表示只能一秒请求一次
        Boolean flag = redisTemplate.opsForValue().setIfAbsent("Idempotence:" + key, "", Duration.ofSeconds(1));
        if (flag) {
            try {
                result = joinPoint.proceed(args);
                return result;
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }
        //到这里说明这个吊毛1s请求了很多次
        System.out.println("抛出异常");
        return 0;
    }
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猴子的救兵啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值