SpringBoot从入门到实战之服务限流!

B站影视 韩国电影 2025-05-26 19:18 3

摘要:当一个应用服务已经达到其本身能处理的最大临界点时,如果不对服务采取限流、熔断或降级等措施,很有可能会引发服务响应缓慢,甚至导致雪崩效应,最终造成无法估量的损失。限流和降级等措施以牺牲一小部分访问流量来达到服务稳定和可用的目的,这在现代微服务治理体系中占有重要的

当一个应用服务已经达到其本身能处理的最大临界点时,如果不对服务采取限流、熔断或降级等措施,很有可能会引发服务响应缓慢,甚至导致雪崩效应,最终造成无法估量的损失。限流和降级等措施以牺牲一小部分访问流量来达到服务稳定和可用的目的,这在现代微服务治理体系中占有重要的地位。本章主要介绍服务限流的一些算法及流行的框架,如Hystrix和Sentinel等,并展示它们与SpringBoot的集成示例。

想象这样一个场景,某个电商平台某天举行秒杀活动,或者某个视频网站某一时刻上线一部热播剧,在此之前,服务器访问比较正常,服务处理能力稳定,但在进行秒杀活动或上线热播剧的特殊时段内客户端访问会突然暴增,即使后端服务器已经扩容,但是访问量仍然难以预估,此时如何保证服务的可用性呢?答案就是进行限流。

限流的本质是通过对高并发请求进行访问限制,将流量限制在一定范围内。当访问达到一定数量时,可以拒绝服务,或者进行熔断和降级操作。本节主要讲解限流的原理及相关的框架。

限流的原理

限流方式主要有两种,即限制并发数和限制访问速度。限制并发数可以通过限制连接池的最大连接数量来实现;限制访问速度可以通过设置QPS的访问规则来实现。

当前流行的限流框架是以QPS的限制为主。限流算法主要包括漏桶算法、令牌桶算法、固定窗口算法及滑动窗口算法等。

1. 漏桶算法

漏桶算法的原理如图6.1所示。

图6.1 漏桶算法的原理

漏桶算法的原理是,首先设定一个固定容量的漏桶,所有请求都需要经过这个漏桶,设定请求从漏桶里出去的速度是固定的。当请求的速度大于漏桶流出的速度时,会慢慢地超出漏桶的容量,那么后面的请求就会被阻塞或抛弃,直到漏桶再次有能力接收请求为止。

2. 令牌桶算法

令牌(Token)桶算法的原理如图6.2所示。

图6.2 令牌桶算法

令牌桶算法的原理中同样需要一个固定容量的桶,此外还需要一个程序以固定的速度向桶里加入令牌。如果超出容量,则抛弃令牌。

当请求到来时将尝试获取令牌,如果取得令牌,则进行处理,如果未获取令牌,则拒绝或阻塞等待。

Google公司提供的Guava RateLimiter便是基于令牌桶算法实现的限流工具。

3. 固定窗口算法

固定窗口算法称为计数器算法,它规定在一段时间内从零开始计数,每一次请求加1,当累计超过设定的临界值时开始限流,下一个时间段开始后,计数器重新计数。

4. 滑动窗口算法

滑动窗口算法是固定窗口算法的优化算法,它把一段时间间隔进行N等分,然后记录每一个小的时间段内的请求数。每次滑动1/N的时间窗口。如果分割的数量越多,统计结果就越精准,限流就越平滑。

以上4种算法的比较如表6.1所示。其中最常见的算法是令牌桶算法与滑动窗口算法。

表6.1 限流的算法比较

限流示例

下面给出一个简单的限流实例。

(1)在pom.xml文件中添加工具包依赖,代码如下:

com.google.guava

guava

30.0-jre

(2)新建类RateLimitService.java,限制访问量为100,代码如下:

@Service

public class RateLimitService {

//限流器

private RateLimiter rateLimiter =

RateLimiter.create(100.0);

public boolean tryAcquire{

return rateLimiter.tryAcquire;

}

}

(3)通过接口访问时添加限流,代码如下:

@GetMapping("/springBoot")

public String hi{

if(rateLimitService.tryAcquire){

return "hi spring boot!";

}else { //限流后返回

return "request rateLimit!";

}

}

上面的示例展示了单机限流的操作,当每秒请求大于100时就会限流。对于分布式的应用限流则需要进行改造。

来源:大数据架构师

相关推荐