Sentinel系列之服务限流入门

本文介绍了限流算法的基本概念和常见实现,包括固定窗口算法、滑动窗口算法、令牌桶算法和漏桶算法。滑动窗口算法解决了固定窗口算法的临界值问题,而令牌桶算法和漏桶算法则通过不同的方式控制流量,前者能应对突发流量,后者适合处理固定并发。Sentinel等组件利用这些算法保护系统免受高并发冲击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0、前言

在正式讲解Sentinel之前,需要了解一下业界比较常见的几个算法,就算是科普,Sentinel组件也多多少少用到了下方提到的限流方式


1、关于概念

主要目的是通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,一单达到限制数量则对当前请求进行处理,采取对应的拒绝策略,比如双十一大促,一个服务只能同一个时间点服务10w请求,但是这个时候请求量是11w,那么这11w请求过来之后,其中的10w可以正常操作,多出来的1w则会收到一个关于系统繁忙等温馨提示,这就是限流

2、其实在实际开发过程中,做过移动端的大概都清楚,限流几乎是处处皆是

1、在Nginx添加限流模块限制平均访问速度

2、通过设置数据库连接池、线程池的大小来限制总的并发数

3、通过Guava提供的Ratelimiter限制接口的访问速度

4、TCP通信协议中的流量整形 

3、其实说到限流的实现啊,最关键的还是限流的算法,这里说几个常见的限流算法

1、计算器算法

概念:算是一种比较简单的限流实现算法,在指定周期内累加访问次数,当访问次数达到设定的阀值时,出发限流策略,当进入下一个时间周期时进行访问次数的清零

举例:限定每一分钟能够处理的总请求数为100,在第一个一分钟内,一共请求了60次,接着到第二分钟,次数从0重新开始计数,如果在一分半钟时,已经达到了最大限流的阈值100,那这个时候,程序会拒绝后续的所有请求,一般情况下这种算法可以用在短信发送的频次限制上,比如限制同一个用户一分钟之内出发短信发送的次数

缺点:如果在第一分钟的58秒和第二分钟的第二秒这个时间段内,分别出现了100个请求,整体来看就会出现4秒内总的请求量达到200,超出了设置的阈值


2、滑动窗口算法

概念:这个算法其实是为了解决上述提到的缺点问题,它是一种流量控制技术,在TCP网络通信协议中,也才用到了这种算法来解决网络拥塞的问题,简单来说,滑动窗口算法的原理是在固定窗口中分割出多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口,最终只需要统计滑动窗口范围内的所有小时间窗口总计数即可

举例:如果我们将一分钟拆分成4个时间窗口,每个时间窗口最多能够处理25个请求,并且通过虚线框表示滑动窗口的大小,如图,当前红框大小是2,也就是说最多只能处理50个请求,同时滑动窗口会随着时间往前移动,比如前15秒结束之后,窗口会滑动到15-45s这个范围,然后在新的窗口中重新统计数据,这种方式就很好解决了固定窗口算法的临界值问题,也就是上述说到的缺电问题

补充:Sentinel其实也采用了滑动窗口算法来实现限流


3、令牌桶限流算法

概念:是网络流量整形和速率限制中最常使用的一种算法,对于每个请求进来的时候,都需要从令牌桶里面获得一个令牌,拿着令牌来请求,否则就会触发限流

原理:看图,这个图算是一个系统,这个系统会以一个固定的速度往有固定容量的令牌桶中放入令牌,但是如果此时客户端有请求进来,就需要先从令牌桶中拿到令牌,然后才能正常请求

缺点:假设现在图中的令牌生成速度是每秒十个,也就是并发是每秒十个,所以在这个时候请求获取令牌的话,会存在三种情况

①请求速度大于令牌生成速度:那么令牌会很快被取完,后续再进来的请求都会被限流

②请求速度等于令牌生成速度:那就情况很和谐,系统就很稳定

③请求速度小于令牌生成速度:这种情况其实就说明当前并发量很小,系统足以处理 

特性:因为令牌桶有固定的容量大小,所以当请求速度小于令牌生成速度时,令牌桶的容量会满,所以令牌桶能够处理突发流量,也就是在一瞬间内新增的流量,系统也能够正常处理


4、漏桶限流算法

作用:控制数据注入网络的速度,将突发的流量平滑处理

原理:如图,在漏桶算法内部,跟令牌桶一样,维护了一个容器,这个容器呢,会以固定的速度出水,不管上有的水速多块,下流的流出速度适中保持不变(说到这里,其实大家想想,平常我们了解的消息中间件是不是也是这个原理?不管生产者产生了多少数据,消费者该怎么处理就怎么处理)

缺点:

①请求速度大于漏桶里露出水滴的速度:也就是并发已经超出服务能处理的极限了,就会触发限流

②请求速度小于或等于漏桶流出水滴的速度:也就是说服务正好能处理客户端的并发

补充:漏桶限流算法和令牌桶限流算法的实现原理,其实仔细看看差不多,最大的区别就是,漏桶算法无法处理短时间内的瞬间并发,它更适合有固定并发的服务,比如打卡系统,每天早晨估计的每秒两个人,然后系统会以固定的速度去处理和限流

### 使用 Sentinel 实现限流与熔断的最佳实践 #### 1. 配置网关模块中的限流规则 当使用 Spring Cloud Gateway 和 Sentinel 结合时,建议在 Sentinel 控制台上针对网关模块设置具体的限流规则[^1]。这些规则可以通过控制台动态调整,适用于不同的业务场景。 #### 2. 使用 `@SentinelResource` 注解实现方法级别的限流和熔断 对于 Java 方法层面的限流和熔断,可以利用 `@SentinelResource` 注解完成配置[^2]。该注解支持多种参数,例如资源名称、限流阈值以及降级处理逻辑等。 以下是基于 `@SentinelResource` 的示例代码: ```java import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; public class Service { @SentinelResource(value = "exampleMethod", blockHandler = "handleBlock", fallback = "handleFallback") public String exampleMethod(String param) { if (param == null || param.isEmpty()) { throw new IllegalArgumentException("Parameter cannot be empty"); } return "Success: " + param; } // 处理限流异常 public String handleBlock(String param, BlockException exception) { return "Blocked by Sentinel: " + exception.getMessage(); } // 处理其他运行时异常 public String handleFallback(String param) { return "Fallback handler executed"; } } ``` 上述代码中: - `value`: 定义受保护的资源名。 - `blockHandler`: 当触发限流时调用的方法。 - `fallback`: 当发生其他异常时执行的回退方法。 #### 3. 熔断机制的状态管理 Sentinel 中的熔断器会在设定的时间窗口内统计请求的成功率或响应时间,并据此决定是否进入熔断状态。一旦达到预设条件,熔断器将切换到打开状态(Open)。经过指定的熔断时长后,熔断器会自动转换为半开状态(Half Open),并允许少量试探性请求通过。如果这些请求仍然失败或者响应超时,则重新进入熔断状态;反之则恢复至关闭状态(Closed)[^3]。 #### 4. 动手实验:快速入门 Sentinel 为了更好地理解 Sentinel 的工作原理及其实际效果,可以从官方文档提供的简单案例入手[^4]。具体步骤如下: - **Step 1**: 准备好实验所需的开发环境和服务端实例; - **Step 2**: 创建一个基础项目并将必要的依赖引入其中; - **Step 3**: 编写测试接口并通过模拟高并发流量验证其防护能力。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值