当存在大量请求到来的时候为了避免服务器出现宕机的情况我们需要对一些请求拒绝服务操作,这里就需要我们实现接口限流。本次针对接口限流实现,未来将加入IP限流操作。
具体做法是aop思想,在访问某一个接口之前判断当前请求能否通过如果可以通过就放行,如果不能通过就拒绝操作。判断是否放行这里使用令牌桶算法实现,guava的RateLimiter对令牌桶算法进行封装具体方法如下:Guava-RateLimiter详解 - 简书 (jianshu.com)
既然对接口进行限流,我们需要引用注解,对不同的接口可能存在不同的QPS。注解定义如下:
其中key代表具体的访问接口
切面的业务代码如下:
我们对每个接口访问定义一个RateLimiter,当每有一个请求到达时候去RateLimiter获取令牌如果能获取到就调用接口,如果获取不到就拒绝接口访问。
Controller层代码:
通过postman模拟接口访问
结果如下: