当前位置:首页 > 技术分析 > 正文内容

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

服务限流与降级

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

限流

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

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

限流的原理

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

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

1. 漏桶算法

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

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

2. 令牌桶算法

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


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

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

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

3. 固定窗口算法

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

4. 滑动窗口算法

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

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


限流示例

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

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

<dependency>

<groupId>com.google.guava</groupId>

<artifactId>guava</artifactId>

<version>30.0-jre</version>

</dependency>

(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时就会限流。对于分布式的应用限流则需要进行改造。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4831.html

标签: 限流器
分享给朋友:

“SpringBoot从入门到实战之服务限流!” 的相关文章

el-table内容\n换行解决办法

问题请求到的数据带有换行符 '\n'但页面展示时不换行statusRemark: "\"1、按期完成计划且准确率100%,得100分;\n2、各项目每延误1天,扣1分;每失误1次或者员工投诉1次,扣3分,失误层面达到公司级影响较大的,该项绩效分数为0\"\n&...

雅马哈TMAX 560 TECH MAX 外媒深度测评

应雅马哈(Yamaha)的邀请,在葡萄牙埃斯托里尔对全新的Yamaha TMAX 560 Tech Max踏板车进行了测试,在这里TMAX 560 Tech Max售价为11649英镑。雅马哈TMAX长期以来一直站在踏板车的顶端,就声誉和知名度而言,它是当之无愧的大踏板界NO.1。2020 TMAX...

数组、去重、排序、合并、过滤、删除

ES6数字去重 Array.from(new Set([1,2,3,3,4,4])) //[1,2,3,4] [...new Set([1,2,3,3,4,4])] //[1,2,3,4]2、ES6数字排序 [1,2,3,4].sort(); // [1, 2,3,4],默认是升序...

vue打开新窗口并且实现传参,有图有真相

我要实现的功能是打开一个新窗口用来展示新页面,而且需要传参数,并且参数不能显示在地址栏里面,而且当我刷新页面的时候,传过来的参数不能丢失,要一直存在,除非我手动关闭这个新窗口,即浏览器的标签页。通过面向百度编程,发现网上的根本达不到这个效果,而且还都是坑,明明实现不了,还若有其事的写出来,于是我在标...

52、Vue 怎么实现跨域(必会)

1、什么是跨域跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据。源指协议,端口,域名。只要这个 3 个中有一个不同就是跨域2、使用 vue-cli 脚手架搭建项目时 proxyTable 解决跨域问题,打开 config/index.js,在 proxyTable 中添写如下代码:proxy...

Vue脚手架使用Element UI

关于Element UIElement UI是一套采用 Vue 2.0 作为基础框架实现的组件库,一套为开 发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计 资源,帮助网站快速成型。Element UI的官方网址是:https://element.eleme.cn/Elem...