【微服务保护】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及以上版本,导致一些细节的实现存在不同。在本文中,将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

Qt的学习(二)
1. 创建Hello Word 两种方式,实现helloworld: 1.通过图形化的方式,在界面上创建出一个控件,显示helloworld 2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world; …...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

Copilot for Xcode (iOS的 AI辅助编程)
Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot,它能根据上下文补全代码,快速生成常用…...