栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

接口非幂等性解决

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

接口非幂等性解决

接口非幂等性解决

项目代码:https://github.com/DaZuiZui/Interface-idempotency

1.什么是幂等性

​ 首先我们思考一下什么是幂等性,一个接口多次调用没有副作用就是幂等性,如果一个接口多次被调用产生的副作用就不是幂等性了,就出现了幂等性的问题

2.解决方案 2.1 分布式锁+token

​ 我们保证幂等性是利用redis+token实现的,首先我们我们通过从服务器获取token,然后请求的时候携带token进行请求,如果token在redis中存在就把token删除,如果不存在就不进行操作。

3.code 3.1 分布式锁+token

pom.xml

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
            org.springframework.boot
            spring-boot-starter-aop
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

Controller层

@RestController
public class TestController {
    @Autowired
    private RedisTemplate redisTemplate;


    @GetMapping("/getToken")
    public String getToken(){
        String token = UUID.randomUUID().toString().substring(0,8);
        redisTemplate.opsForValue().set(token,"1",60*10, TimeUnit.SECONDS);
        return token;
    }

    @GetMapping("/sub")
    public void sub(String token) throws InterruptedException {
        //todo 业务操作
    }
}

Aop层

@Aspect
@Component
public class TestAop {
    @Autowired
    private RedisTemplate redisTemplate;

    @Before("execution(* com.dazuizui.idempotentinterface.controller.TestController.sub(..))")
    public void befor(JoinPoint proceedingJoinPoint) throws Exception {
        Object[] args = proceedingJoinPoint.getArgs();
        boolean b = redisTemplate.delete(args[0]);
        System.out.println(b);
        if (!b){
            //todo 日志操作
            throw new Exception("幂等性操作");
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820913.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号