黑白名单
黑白名单是各个大型企业应用里很常见的限流和放行手段,而且黑白名单往往是动态变化的。举个例子,如果某个IP在一段时间的访问次数过于频繁,被系统识别为机器人用户或流量攻击,那么这个IP就会被加入到黑名单,从而限制其对系统资源的访问,这就是我们俗称的“封IP”。
1.2、分布式限流
分布式限流,区别于单机限流,它把整个分布式环境中所有服务器当做一个整体来考量。比如说针对IP的限流,我们限制了1个IP每秒最多10个访问,不管来自这个IP的请求落在了哪台机器上,只要是访问了集群中的服务节点,那么都会受到限流规则的制约。
为了实现分布式限流,我们需要将限流信息保存在一个“中心化”的组件上,这样它就可以获取到集群中所有机器的访问状态。
2、常见的限流方案
基于Guava的客户端限流
Guava是一个客户端组件,在其多线程模块下提供了以RateLimiter为首的几个限流支持类。它只能对“当前”服务进行限流,即它不属于分布式限流的解决方案。
网关层限流
服务网关,作为整个分布式链路中的第一道关卡,承接了所有用户来访请求。我们在网关层进行限流,就可以达到了整体限流的目的了。目前,主流的网关层有以软件为代表的Nginx,还有Spring Cloud中的Gateway和Zuul这类网关层组件,也有以硬件为代表的F5。
中间件限流
将限流信息存储在分布式环境中某个中间件里(比如Redis缓存),每个组件都可以从这里获取到当前时刻的流量统计,从而决定是拒绝服务还是放行流量。
限流组件
目前也有一些开源组件提供了限流的功能,比如Sentinel就是一个不错的选择。Sentinel是阿里出品的开源组件,并且包含在了Spring Cloud Alibaba组件库中。Hystrix也具有限流的功能。
3、常见限流算法
常见的限流算法有:令牌桶算法、漏桶算法、滑动窗口和计数器算法等。
3.1、令牌桶算法(Token Bucket)
令牌桶算法是目前应用最为广泛的限流算法。它有以下两个关键角色:
令牌 获取到令牌的Request才会被处理,其他Requests要么排队要么被直接丢弃桶 用来装令牌的地方,所有Request都从这个桶里面获取令牌
令牌桶算法实现原理
令牌桶算法算