秒杀系统之接口限流(令牌桶)

发布于 2021-06-05  825 次阅读


引入依赖 guava

<!-- Google接口限流 guava  RateLimter 令牌桶实现-->
<dependency>
   <groupId>com.google.guava</groupId>
   <artifactId>guava</artifactId>
   <version>30.1.1-jre</version>
</dependency>

既然是接口限流,那么一般将限流放在控制器Controller

@GetMapping("/sale")
public String sale(Integer id){
    //1.没有获取到 token 请求 直到获取到 token 令牌
    LOGGER.info("等待的时间:" + rateLimiter.acquire());//试图拿到令牌
    //2.设置一个等待的时间,如果在等待的时间内获取到了 token 令牌,则处理业务,如果在等待时间内没有获取到相应的 token 则抛弃请求
    if(!rateLimiter.tryAcquire(5, TimeUnit.SECONDS)){
        System.out.println("当前请求被限流,直接抛弃,无法调用后续秒杀逻辑......");
        return "抢购失败!";
    }
    System.out.println("处理业务..................");
    return "测试令牌桶";
}

令牌桶原理:先获取令牌,再执行业务逻辑


她喜欢所以就做咯