Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门:Sentinel快速入门,这一期主要讲述 Sentinel 的限流规则

簇点链路

簇点链路就是项目内的调用链路(Controller -> Service -> Mapper),链路中被监控的每个接口就是一个资源。默认情况下 Sentinel 会监控 SpringMVC 的每一个端点(Endpoint),因此 SpringMVC 的每一个端点(Endpoint)就是调用链路中的一个资源(这里指的就是 Controller 中的方法)

流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:

image-20240723132225733

点击后面的流控按钮,就可以弹出表单。表单中可以添加流控规则,如下图所示:

image-20240723132308620

然后,我们在单击阈值的框中填写数字 1 并点击新增按钮,表示限制 /service1/hello 这个资源的单击 QPS 为1,即每秒只允许1次请求,超出的请求会被拦截并报错

之后在浏览器快速刷新对应的页面,结果如下所示,表示限流规则已经生效

image-20240723132556847

流控模式

在添加限流规则时,点击高级选项,可以选择三种流控模式:

image-20240723132703948

三种模式对应的含义是:

1.直接

统计当前资源的请求,触发阈值时对当前资源直接限流,是默认的模式

2.关联

统计与当前资源相关的另一个资源,当另一个资源触发阈值时,对当前资源限流

使用场景:用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流

例如,对于下图来说,当 /write 资源访问量触发阈值时,就会对 /read 资源限流,避免影响 /write 资源

关联模式

一般来说,满足下面条件就可以使用关联模式:

① 两个有竞争关系的资源
② 一个优先级较高,一个优先级较低

3.链路

统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

例如,有两条请求链路:

/link1 -> /common
/link2 -> /common

如果只希望统计从 /link2 进入到 /common 的请求,就可以设置链路模式的流控规则

实现步骤:

1.在服务层中填写共同调用的方法

@Service
public class WebServiceImpl implements WebService {@Override@SentinelResource("/common")public void common() {System.out.println("调用共同方法");}}

需要注意的是,Sentinel 默认只标记 Controller 中的方法作为资源,如果要标记其它方法,需要利用 @SentinelResource 注解进行标记,参数为对应资源的路径

2.在控制层中,编写两条请求链路方法

@RestController
@RequestMapping("/service1")
public class WebController {@Autowiredprivate WebService service;@GetMapping("/link1")public String link1() {service.common();return "调用链路1";}@GetMapping("/link2")public String link2() {service.common();return "调用链路2";}}

3.修改配置文件

Sentinel 默认会将 Controller 中所有的方法进行 context 整合,此时会认为所有的 Controller 端点是同一个根链路发展而来的两个子链路,那么最终还是属于一个链路,由于不是两个链路,因此会导致链路模式的流控失效

如下图所示:

image-20240723143120544

此时需要在 application.yml 添加:

spring:cloud:sentinel:web-context-unify: false # 关闭context整合

重新启动后,可以发现变成了两个链路,如下图所示:

image-20240723143926675

4.在控制台设置流控规则,限制从 /service1/link2 进入到 /common 的 QPS 阈值为 2

image-20240723144016213

5.测试

快速在浏览器刷新 link2 的请求,可以得到如下结果,即流控规则已经生效

image-20240723144128389

流控效果

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

1.快速失败

达到阈值后,新的请求会被立即拒绝并抛出 FlowException 异常。是默认的处理方式

2.wam up

预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值

warm up 是应对服务冷启动(冷启动指的是服务器虽然具有某一 QPS 最大值,但在刚启动时,是无法达到这个最大值的,如果此时请求数较高,即使没有超过最大QPS,服务器也可能因此挂掉)的一种方案。请求阈值初始值是 threshold / coldFactor,threshold 是最大阈值,coldFactor 是冷启动因子。持续指定时长后,逐渐提高到 threshold 值。而 coldFactor 的默认值是 3

预热模式

3.排队等待

让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长

在排队等待中,所有请求都会进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求的等待时间超出最大时长,则会被拒绝

例如,如果 QPS = 5,意味着每 200ms 处理一个队列中的请求;而如果此时 timeout = 2000,则意味着等待超过 2000ms 的请求会被拒绝并抛出异常

排队等待案例

这种效果的好处是,即使请求数量的波动较大,即某段时间请求数量很少,某段时间请求数量很多,从队列中出去的数量也会是稳定的。因此起到流量削峰的作用,对微服务具有一定的保护功能

排队等待

热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过 QPS 阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过 QPS 阈值。这种方式是一种粒度更细的限流,精细到参数级别

例如,在下图中,有四个请求,其中三个请求的参数 id 为1,最后一个请求的参数 id 为 2。此时就可以得出,id 为 1 的 QPS 为 3,id 为 2 的 QPS 为1

热点参数限流

案例:

1.编写控制层代码

这里需要注意的是,热点参数限流对默认的 SpringMVC 资源无效,只有通过 @SentinelResource 注解声明的资源才有效

@RestController
@RequestMapping("/service1")
public class WebController {@GetMapping("/hot")@SentinelResource("/hot")public String hot(String username, String password, Integer age) {return "热点";}}

2.在控制台中编写热点规则

image-20240723185922856

image-20240723192317280

该配置代表的含义是,对 /hot 这个资源的第 0 号参数(即第一个参数)做统计,每 10s 相同参数值的请求数不能超过 1

点击高级选项,可以对部分参数进行例外配置。如下图所示

image-20240723190640738

结合之前的配置,表示对第一个参数限流,每 10s 相同参数的 QPS 不能超过 1,但有两个例外:

① 如果参数类型是 String 且 参数值是 123456,则每 1 秒允许的 QPS 为 2
② 如果参数类型是 int 且 参数值是 20,则每 1 秒允许的 QPS 为 3

3.测试

在浏览器输入:localhost:8081/service1/hot?username=张三&password=123456&age=20

测试点主要有三个:

① 快速刷新浏览器,此时结果应为刷新到第二次时就会报错
② 将参数索引修改为 1,此时结果应为刷新到第三次时就会报错
③ 将参数索引修改为 2,此时结果应为刷新到第四次时就会报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384646.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins+Maven+Gitlab+Tomcat自动化构建打包+部署

目录 环境准备 导入项目包 配置jenkins 构建项目 配置项目上线 修改项目代码测试 环境准备 本实操项目环境基于https://blog.csdn.net/Lzcsfg/article/details/140359830 首先在node01主机中操作,本次操作需要java8的版本,将之前安装的java17卸…

Shell编程之正则表达式与文本三剑客

目录 一、正则表达式 1.引言--什么是正则表达式 1.1正则表达式的功能 2.基础正则表达式(BRE) 2.1特殊字符 2.2定位符 2.3非打印字符 3.扩展正则表达式(ERE) 4.元字符操作的案列 二、命令小工具 1.cut:列截取工具 2.sort排序 …

请你谈谈:spring bean的生命周期 - 阶段5:BeanPostProcessor前置处理-自定义初始化逻辑-BeanPostProcess后置处理

BeanPostProcessor的postProcessBeforeInitialization方法是在bean的依赖注入(即属性填充)完成后,但在bean的初始化回调(如PostConstruct注解的方法或InitializingBean接口的afterPropertiesSet方法)之前被调用的。 具…

大数据管理中心设计规划方案(可编辑的43页PPT)

引言:随着企业业务的快速发展,数据量急剧增长,传统数据管理方式已无法满足高效处理和分析大数据的需求。建立一个集数据存储、处理、分析、可视化于一体的大数据管理中心,提升数据处理能力,加速业务决策过程&#xff0…

Hive3:Hive初体验

1、创建表 CREATE TABLE test(id INT, name STRING, gender STRING);2、新增数据 INSERT INTO test VALUES(1, 王力红, 男); INSERT INTO test VALUES(2, 钉钉盯, 女); INSERT INTO test VALUES(3, 咔咔咔, 女);3、查询数据 简单查询 select * from test;带聚合函数的查询 …

自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)

李群李代数扰动bundle adjustment 这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客也会同步更新,全网…

IDEA-安装插件 驼峰下划线转换

第一步:安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步:设置 file-settings-editor-camel_case 第三步:使用 选中想转换的遍历 使用快捷键 Alt Shift U

Linux中tomcat下载教程

一.安装tomcat 1.安装 EPEL 仓库: sudo yum install epel-release2.安装 Tomcat: sudo yum install tomcat3.启动 Tomcat 服务: sudo systemctl start tomcat4.启用 Tomcat 服务开机启动: sudo systemctl enable tomcat5.检查…

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

如何通过netsh命令重启主机网卡?

正文共&#xff1a;999 字 15 图&#xff0c;预估阅读时间&#xff1a;1 分钟 不知道各位遇到过没有&#xff0c;VMware Workstation的NAT网卡经常出现一种情况&#xff1a;在虚拟机里面访问外部网络还是正常的&#xff0c;但是从宿主机却访问不到虚拟机。 说实话&#xff0c;这…

el-upload照片墙自定义上传多张图片(手动一次性上传多张图片)包含图片回显,删除

需求&#xff1a;el-upload照片墙自定义上传多张图片&#xff08;手动一次性上传多张图片&#xff09;包含图片回显&#xff0c;删除&#xff0c;预览&#xff0c;在网上看了很多&#xff0c;都没有说怎么把数据转为file格式的&#xff0c;找了很久最终实现&#xff0c; 难点&a…

【SpringBoot】1 Gitee

本项目 Gitee 地址&#xff1a;https://gitee.com/Lin_DH/system idea中可能装个gitee的插件&#xff0c;这样操作起来比较方便。 1&#xff09;登录 Gitee 官网&#xff08;https://gitee.com/&#xff09;&#xff0c;新建仓库。 2&#xff09;复制新建的 Gitee 仓库地址&am…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录 引言复习堆堆——前K个高频元素个人实现复习实现二参考实现 新作单词搜索个人实现参考实现 分割回文串个人实现参考实现 环形链表II个人实现参考实现 两个有序链表个人实现 总结 引言 又是充满挑战性的一天&#xff0c;继续完成我们的任务吧&#xff01;继续往下刷&a…

【C++】模板详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

域内攻击手法——AS-REP Roasting攻击和Kerberoasting攻击

一、AS-REP Roasting攻击 1、AS-REP Roasting攻击原理 AS-REP Roasting是一种对用户账户进行离线爆破的攻击方式。但是该攻击方式使用上比较受限&#xff0c;因为其需要用户账户设置不要求Kerberos 预身份验证选项&#xff0c;而该选项默认是没有勾选的。Kerberos 预身份验证…

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-发送信息服务处理

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、因为仿钉钉设计器里发送消息处理是一个服务任务&#xff0c;所以要根据这个服务任务进行处理 2、这里目前只对消息进行处理&#xff0c;就是用websocket的发送方式 输入相应的内容&…

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…

Java-- Stream流

感受stream流 代码 package demo1;import javax.naming.Name; import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class StreamDemo1 {public static void main(String[] args) {ArrayList<String> list1 new ArrayList<>();l…