【微服务保护】Sentinel 流控规则 —— 深入探索 Sentinel 的流控模式、流控效果以及对热点参数进行限流
文章目录
- 前言
- 一、快速掌握 Sentinel 的使用
- 1.1 什么是簇点链路
- 1.2 Sentinel 的简单使用示例
- 二、Sentinel 流控模式
- 2.1 直接模式
- 2.2 关联模式
- 2.3 链路模式
- 三、流控效果
- 3.1 快速失败
- 3.2 预热模式
- 3.3 排队等待
- 四、对热点参数的流控
- 4.1 热点规则
- 4.2 热点规则演示
前言
微服务架构的流行使得在分布式系统中保障稳定性变得尤为关键。在前文中,已经讨论了微服务中可能出现的雪崩问题以及相应的解决方案。作为确保系统可用性的关键工具之一,Sentinel 应运而生,它是一款功能强大的流量控制组件,为开发人员提供了多种方式来管理和保护微服务。
在本文中,我将深入探讨 Sentinel 的核心功能,包括流控模式、流控效果和对热点资源的限流策略。深入了解这些概念,并通过示例演示如何在 Spring Cloud 项目中使用 Sentinel,以便更好地应对各种流量控制和限流需求。
一、快速掌握 Sentinel 的使用
1.1 什么是簇点链路
在学习 Sentinel 的使用之前,我们有必要首先了解一下簇点链路。所谓的簇点链路就是项目内的调用链路,链路中被监控的每个接口就是一个资源。默认情况下 Sentinel 会监控 Spring MVC 的每一个端点(Endpoint),因此 SpringMVC 的每一个端点(Endpoint)就是调用链路中的一个资源。
流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:

1.2 Sentinel 的简单使用示例
现在,我们需要对 /order/{orderId} 这个路径进行限流,要求它的 QPS 每秒不能超过 5,设置步骤如下:
- 在簇点链路中,在指定的链路下点击添加流控规则:

- 设置流控规则,QPS 不超过 5:

新增之后,可以在流控规则中查看这条新增的规则:

- 使用 Jmeter 进行测试
设置线程属性:

设置了20个线程,线程的启动时间是 2s,此时的 QPS 是10。
配置 HTTP 请求:

在这个 HTTP 请求中,访问的资源是 /order/101。
启动 JMeter 进行测试:
通过结果树可以发现,连续请求成功的请求数不会超过5。

二、Sentinel 流控模式
Sentinel 是一款功能强大的流量控制组件,它支持多种流控模式,以帮助开发人员更好地管理和保护微服务。下面将介绍 Sentinel 的三种主要流控模式:直接模式、关联模式和链路模式。
在使用 Sentinel 添加限流规则时,点击高级选项,可以选择三种流控模式:
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式;
- 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流;
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流;

2.1 直接模式
直接模式是 Sentinel 最基本的流控模式,它通过对资源的访问频率进行限制来控制流量。在直接模式下,可以为每个资源配置允许的 QPS(每秒查询率)限制。如果某个资源的实际流量超过了配置的限制,Sentinel 将拒绝或降级该资源的访问请求。
这种模式适用于需要对某个具体资源进行流控的场景,例如 API 接口、微服务等。通过配置直接模式,您可以保护关键资源免受过多请求的干扰,确保系统的稳定性和可用性。
上文中 Sentinel 的简单使用示例就是直接模式,它是对order/{orderId} 这个具体的请求资源进行限流。
2.2 关联模式
关联模式是 Sentinel 提供的一种更为灵活的流控模式。在关联模式中,可以定义多个资源之间的关联关系,然后基于这些关联关系来控制流量。这使得可以更好地适应多资源之间的复杂交互。
简单来说,关联模式的作用是统计与当前资源相关的另一个资源,当触发资源访问的阈值时,对当前资源限流。
关联模式的使用场景:
比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是有限支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。
例如,下面在 order-service 中新增两个接口,query 表示查询订单,update 表示更新订单:
@GetMapping("/query")
public String queryOrder(){return "查询订单成功!";
}@GetMapping("/update")public String updateOrder(){return "更新订单成功!";}
下面通过关联模式,设置对 query 接口的限流:

此时,将 query 和 update 两个接口进行关联,当 update 资源被访问的 QPS 超过 5 时,就会对 query 接口进行限流。
使用 JMeter 测试:
设置线程数,此时 QPS 为 10:

设置 HTTP 请求:

启动 JMeter 进行测试:

此时发送可以正常处理 update接口的请求,但是此时我们通过浏览器访问query 接口,发现该接口被 Sentinel 限流了:

这就是关联模式,通过上面的例子可以得出结论:
满足下面条件可以使用关联模式:
- 两个有竞争关系的资源;
- 一个优先级较高,一个优先级较低。
2.3 链路模式
链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。
例如有两条请求链路test1 和 test2,从它们都可以服务到 commom 资源:
/test1->/common/test2->/common
如果只希望统计从/test2进入到/common的请求,则可以使用链路模式进行配置:

现在有一个需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。设置的步骤如下:
-
在
OrderService中添加一个queryGoods方法,不用实现业务:@SentinelResource("goods") // Sentinel 标记除 Controller 以外的方法 public void queryGoods(){System.err.println("查询商品!"); }注意,在默认情况下,Sentinel 只会监视
Controller中的端点方法,如果要监视其他方法,可以使用@SentinelResource注解。另外,Sentinel 默认会将
Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加如下配置:spring:cloud:sentinel:web-context-unify: false # 关闭 Context 上下文整合 -
在
OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法:@GetMapping("/query") public String queryOrder(){// 查询商品orderService.queryGoods();// 查询订单System.out.println("查询订单");return "查询订单成功!"; } -
在
OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法:@GetMapping("/save") public String saveOrder(){// 查询商品orderService.queryGoods();// 新增订单System.out.println("新增订单");return "新增订单成功!"; } -
给
queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS不能超过2:

-
使用 JMeter 进行测试
设置线程,QPS 为 4:

设置 HTTP 请求:


分别设置了对query和save两个接口的 HTTP 请求。
启动 JMeter:
可以发现,对query接口进行限流了:

而对save接口没有限流:

三、流控效果
在 Sentinel 中,流控效果是指当请求达到流控阈值时应该采取的措施。Sentinel 提供了多种流控效果,包括快速失败、预热模式以及排队等待。每种效果都适用于不同的使用场景,可以根据具体需求选择合适的流控效果。
- 快速失败: 达到阈值后,新的请求会被立即拒绝并抛出
FlowException异常。通过前文的演示,可以发现是默认的处理方式。 - 预热模式: 对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
- 排队等待: 让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
这些模式可以在 Sentinel 控制台的高级选项中进行设置,下面分别是对这些流控效果的演示。

3.1 快速失败
快速失败 是 Sentinel 的默认流控效果。当请求达到流控阈值时,新的请求会被立即拒绝,并抛出 FlowException 异常。这意味着请求将立即失败,不会继续执行后续逻辑。这种效果适用于对系统资源有明确限制的场景,帮助尽早识别并拒绝过多请求,以避免系统超负荷运行。
使用快速失败效果可以保护系统免受过多请求的干扰,确保系统的稳定性和可用性。
3.2 预热模式
预热模式 也被称为 “warm up” 模式。在预热模式下,超出流控阈值的请求同样会被拒绝并抛出异常,但不同的是,流控阈值在一段时间内会逐渐增加到最大阈值。
预热模式是应对服务冷启动的一种方案。请求阈值初始值是 threshold / coldFactor,持续指定时长后,逐渐提高到threshold值。而coldFactor的默认值是3。
例如,设置QPS的threshold为10,预热时间为 5 秒,那么初始阈值就是 10 / 3 ,也就是 3,然后在 5 秒后从 3 逐渐增长到 10。

现在有一个需求:就是给/order/{orderId}这个资源设置限流,最大 QPS 为 10,利用 warm up 效果,预热时长为 5 秒,步骤如下:
1. 新增流控规则:

2. 使用 JMeter 进行测试:
设置 QPS 为10:

设置 HTTP 请求:

启动 JMeter ,查看 Sentinel 控制台实时监控:

可以发现,QPS 的值最近增大,拒绝的请求数量也逐渐减少。
3.3 排队等待
排队等待 流控效果允许所有的请求按照先后次序排队执行,保证请求之间的间隔不小于指定的时长。这意味着请求会进入队列等待处理,直到轮到请求执行。如果请求无法立即执行,它们将排队等待。
排队等待效果适用于需要有序执行请求的场景,例如需要按照请求的到达顺序处理的业务,或者要求请求间保持固定的时间间隔的场景。
例如:QPS = 5,意味着每 200ms 处理一个队列中的请求;timeout = 2000,意味着预期等待超过 2000ms 的请求会被拒绝并抛出异常。

现在有一个需求:给/order/{orderId}这个资源设置限流,最大 QPS 为10,利用排队的流控效果,超时时长设置为 5s,步骤如下:
1. 添加限流规则:

2. 使用 JMeter 进行测试:
设置 QPS 为 15:

设置 HTTP 请求:

启动 JMeter,查看 Sentinel 的实时监控:

可以发现,在排队等待流控模式下,请求会有序排队执行,这有助于削峰平谷。这种模式对于高并发场景和需要请求按照到达顺序处理的业务非常有用。通过将请求按照时间间隔排队执行,系统可以更好地应对流量的突发增加,降低系统的压力,从而提高系统的稳定性和可用性。
四、对热点参数的流控
4.1 热点规则
前文的限流都是统计访问某个资源的所有请求,判断是否超过 QPS 阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。
例如下图所示,访问同样一个链路,但是这个链路中 id 为 1 的资源访问的次数比其他资源多,那么说明该资源是热点资源,就可以将该资源的 QPS 设置的大一些:

在 Sentinel 控制台中,可以发现有一个热点规则,通过这个规则就可以对热点资源进行流控设置,例如:

代表的含义是:对hot这个资源的 0 号参数(第一个参数)做统计,每 1 秒相同参数值的请求数不能超过 5。
另外,在热点参数限流的高级选项中,可以对部分参数设置例外配置:

结合上一个配置,这里的含义是对 0 号的 long 类型参数限流,每 1 秒相同参数的QPS不能超过 5,有两个例外:
- 如果参数值是 100,则每 1 秒允许的QPS为 10;
- 如果参数值是 101,则每 1 秒允许的QPS为 15。
4.2 热点规则演示
现在有一个需求,就是给 /order/{orderId} 这个资源添加热点参数限流,规则如下:
- 默认的热点参数规则是每 1 秒请求量不超过 2;
- 给 102 这个参数设置例外:每 1 秒请求量不超过 4;
- 给 103 这个参数设置例外:每1秒请求量不超过 10;
1. 添加热点规则:

热点参数限流对默认的 SpringMVC 资源无效,因此需要使用 @SentinelResource() 注解指定热点资源名称:

2. 使用 JMeter 进行测试:
设置QPS 为 5:

设置 HTTP 请求:



这里分别设置了对 ID 为 101、102、103 三个不同资源的HTTP请求,对应了上述设置的规则的不同情况。
启动 JMeter:
对于 ID 为 101 资源的结果树,发现每秒只能通过 2 个请求:

对于 ID 为 102 资源的结果树,发现每秒只能通过 4 个请求:

对于 ID 为 103 资源的结果树,发现每秒 5 个请求都通过了:

相关文章:
【微服务保护】Sentinel 流控规则 —— 深入探索 Sentinel 的流控模式、流控效果以及对热点参数进行限流
文章目录 前言一、快速掌握 Sentinel 的使用1.1 什么是簇点链路1.2 Sentinel 的简单使用示例 二、Sentinel 流控模式2.1 直接模式2.2 关联模式2.3 链路模式 三、流控效果3.1 快速失败3.2 预热模式3.3 排队等待 四、对热点参数的流控4.1 热点规则4.2 热点规则演示 前言 微服务架…...
ZXing.Net 的Core平台生成二维码
一、引用 二、代码 帮助类 /// <summary>/// ZXing.NET 二维码帮助类/// </summary>public class ZXingHelper{/// <summary>/// 站点二维码的目录/// </summary>private static string QRCodeDirectory "QRCode";/// <summary>/// 使…...
【C++】假设给类分配的是栈的空间,那么计算机是如何访问栈中不同位置的对象的数据的呢?
2023年10月22日,周日上午 当在栈上创建一个对象时,计算机会为该对象分配一块连续的内存空间。该内存空间的位置在栈帧中,栈帧是用来存储函数调用信息和局部变量的一块内存区域。 栈帧中包含一个指针,称为栈指针(stack…...
iOS使用CoreML运用小型深度神经网络架构对图像进行解析
查找一个图片选择器 我用的是ImagePicker 项目有点老了,需要做一些改造,下面是新的仓库 platform :ios, 16.0use_frameworks!target learnings dosource https://github.com/CocoaPods/Specs.gitpod ImagePicker, :git > https://github.com/KevinS…...
使用Python打造微信高效自动化操作教程
引言 在如今数字化时代,人们对于效率的追求越来越强烈,尤其是在工作和学习中。自动化操作成为了提高生产力的有效途径之一,而PyAutoGUI和Pyperclip作为Python中的两个强大库,为我们实现自动化操作提供了便利。本文将向大家介绍如…...
怎么在爬虫中使用ip代理服务器,爬虫代理IP的好处有哪些?
随着互联网的快速发展,网络爬虫已经成为数据采集、分析和整理的重要工具。然而,随着网络技术的不断发展,许多网站都会采取反爬虫措施,以避免数据被恶意获取。在这种情况下,代理IP服务器就成为了爬虫们的必本备文工将具…...
Typora的相关配置(Typora主题、字体、快捷键、习惯)
Typora的相关配置(Typora主题、字体、快捷键、习惯) 文章目录 Typora的相关配置(Typora主题、字体、快捷键、习惯)[toc]一、主题配置二、字体配置查看字体名称是否可以被识别:如果未能正确识别: 三、习惯配置四、快捷键配置更改提供的功能的快捷键&#…...
守护进程深度分析
思考 代码中创建的会话,如何关联控制终端? 新会话关联控制终端的方法 会话首进程成功打开终端设备 (设备打开前处于空闲状态) 1、关闭标准输入输出和标准错误输出2、将 stdin 关联到终端设备:STDIN_FILENO > 03、将 stdout 关联到终端设…...
SpringAMQP
SpringAMQT RabbitMQ安装与部署RabbitMQ结构简单队列模型 SpringAMQP依赖引入配置RabbitMQ连接信息基本模型简单队列模型WorkQueue模型 发布订阅模型FanoutExchangeDirectExchangeTopicExchange 消息转换器 消息队列是实现异步通讯的一种方式,我们将从RabbitMQ为例开…...
深入探索Sharding JDBC:分库分表的利器
随着互联网应用的不断发展和用户量的不断增加,传统的数据库在应对高并发和大数据量的场景下面临着巨大的挑战。为了解决这一问题,分库分表成为了一个非常流行的方案。分库分表主流的技术包括MyCat和Sharding JDBC。我们来通过一张图来了解这两者有什么区…...
Java后端模拟面试 题集④
1.你先作个自我介绍吧 面试官您好,我叫张睿超,来自湖南长沙,大学毕业于湖南农业大学,是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图…...
中国5G产业全景图谱报告2022_挚物AIoT产业研究院
中国5G产业全景图谱报告2022_挚物AIoT产业研究院 产业结构 5G 产业结构主要包括接入网、传输网、核心网、电信运营商、网络配套服务商、5G 应用生态及产业服务 7 个主要板块。根据各版块中主要市场参与者提供的产品和服务,又下分子版块。 (1ÿ…...
设计链表复习
设计链表 class ListNode {int val;ListNode next;public ListNode() {}public ListNode(int val) {this.val val;}public ListNode(int val, ListNode next) {this.val val;this.next next;}}class MyLinkedList {//size存储链表元素的个数int size;//虚拟头节点ListNode…...
在 Visual Studio Code (VS Code) 中设置
在 Visual Studio Code (VS Code) 中设置代理服务器的详细教程如下: 打开 Visual Studio Code。 在顶部菜单栏中,点击 "File"(文件) > "Preferences"(首选项) > "Settings…...
2023年拼多多双11百亿补贴新增单件立减玩法介绍
2023年拼多多双11百亿补贴新增单件立减玩法介绍 拼多多启动了11.11大促活动,主题为“天天11.11,天天真低价”。消费者享受多重优惠,包括满减、百亿补贴和单件立减等。百亿补贴新增玩法,有超过20000款品牌商品参与单件立减活动。 …...
面试题 01.06. 字符串压缩
题目来源: leetcode题目,网址:面试题 01.06. 字符串压缩 - 力扣(LeetCode) 解题思路: 计算压缩后的字符串长度,如果该长度小于原字符串长度,返回压缩后的字符串,否则…...
那些你面试必须知道的webpack知识点
目录 1、webpack介绍和简单使用1.1 什么是webpack?1.2 安装webpack1.3 简单使用一下webpack 2、webpack的入口与输出2.1 入口(entry)2.2 输出(output) 3、入口多种配置方法3.1 多文件打包成一个文件3.2 多文件打包成多文件 4、loader的概念5、压缩打包HTML5.1 使用步…...
十四、队列函数
1、概述 (1)使用队列的流程:创建队列、写队列、读队列、删除队列。 2、创建 队列的创建有两种方法:动态分配内存、静态分配内存。 2.1、动态分配内存 (1)函数:xQueueCreate,队列的内存再函数内部动态分配。 (2)函数原型如下&…...
使用高防服务器有什么好处?103.216.155.x
为什么建议租用高防服务器 第一,高防服务器由于业务的特殊性,本身机器的配置要求高,服务器的价格相比普通的贵,而且,机器还有维护费、托管费等,这会让运营的成本上升。 第二,租用高防服务器&a…...
Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架
在去年2022年曾发布一篇关于脚手架的文章:“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
