1.使用场景及需求
在高并发场景下,限流往往是控制服务器负载压力的一个可选方案,而在Spring Cloud Zuul上实现限流只需要编写一个过滤器就可以实现
备注:
- 这里的限流是限制单位时段内对某个微服务或API的最大请求数,控制的是接受请求的速率
- 信号量不同,信号量限制的是任意时间应用的可接受的最大请求数,当请求结束,该请求持有的信号量会相应释放
2.本地网关限流(限流计数器保存在网关内存)
在这种场景下,限流计数器使用Google Guava提供的工具RateLimiter。RateLimiter是令牌桶限流算法的一个封装实现,具体可以自行查阅
3.分布式限流(限流计数器保存在Redis)
此方案使用redis的缓存失效机制实现限流计数器,但网关需要依赖redis,每接受一个请求就要去redis查计数器,极大增加了时间成本,故不推荐使用
3.1 实现逻辑
一个微服务(或RESTApi)对应redis中的一个KV对,K值存储微服务的serviceId,V值存储该微服务的剩余可调用次数,请求每调用一次,计数器增加1,若在缓存失效时间内计数器未超过阀值,则可以处理任务。注意:必须设置KV对的缓存失效时间,否则就变成了信号量限制请求了
网友评论