对于限流,从一个完整的请求链路上来看的话,可以分几块,有nginx接入层网关的限流,微服务网关gateway的限流,在业务层我们也可以实现自己的限流逻辑,Redission和Google的Guava包本身也提供了一些限流工具。
而对于常见的限流算法,有计数法、令牌桶算法、漏桶算法、滑动窗口算法等。
在Nginx接入层网关,我们可以简单通过配置,或执行一些lua脚本去做限流。
在微服务网关,像SpringCloud官方的网关组件其实也内置了基于令牌桶算法的限流实现。
org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilterFactory也是可以拿来即用的。
实现org.springframework.cloud.gateway.filter.ratelimit.KeyResolver我们可以基于ip或请求参数等指定不同维度,然后在配置文件指定令牌生成的频率和桶的容量,定制自己的限流逻辑。
在业务层,除了可以用Redission和Google的Guava包提供的限流工具,可以通过注解和切面封装实现滑动窗口等算法逻辑来简化使用。
其实说到限流,相信都知道阿里开源的Sentinel中间件,专门用来做限流的,提供了规则配置的前端项目,相关规则项配置的维护可以与Nacos结合使用。
令牌桶算法的实现
漏桶算法
滑动窗口算法
待续