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 {

    @Autowired
    private 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,此时结果应为刷新到第四次时就会报错

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 如何处理 WebSocket 连接?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 文章目录 Nginx 如何处理 WebSocket 连接?一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…

苍穹外卖(一)之环境搭建篇

Ngnix启动一闪而退 启动之前需要确保ngnix.exe的目录中没有中文字体,在conf目录下的nginx.conf文件查看ngnix的端口号,一般默认为80,若80端口被占用就会出现闪退现象。我们可以通过logs/error.log查看错误信息,错误信息如下&…

边界网关IPSEC VPN实验

拓扑: 实验要求:通过IPSEC VPN能够使PC2通过网络访问PC3 将整个路线分为三段 IPSEC配置在FW1和FW2上,在FW1与FW2之间建立隧道,能够传递IKE(UDP500)和ESP数据包,然后在FW1与PC2之间能够流通数据…

Linux网络:传输层协议TCP(二)三次挥手四次握手详解

目录 一、TCP的连接管理机制 1.1三次握手 1.2四次挥手 二、理解 TIME_WAIT 状态 2.1解决TIME_WAIT 状态引起的 bind 失败的方法 三、理解CLOSE_WAIT状态 一、TCP的连接管理机制 在正常情况下, TCP 要经过三次握手建立连接, 四次挥手断开连接 1.1三次握手 三次握手顾名思…

基于微信小程序+SpringBoot+Vue的资料分享系统(带1w+文档)

基于微信小程序SpringBootVue的资料分享系统(带1w文档) 基于微信小程序SpringBootVue的资料分享系统(带1w文档) 校园资料分享微信小程序可以实现论坛管理,教师管理,公告信息管理,文件信息管理,文件收藏管理等功能。该系统采用了Sp…

LINUX 孤儿进程和僵尸进程

1、孤儿进 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作 为了释放子进程的占用的系统资源: 进程结束之后&#xf…

pyenv-win | python版本管理,无需卸载当前版本

系统:windows,且已安装git。 使用 pyenv-win 在Windows中管理多个python版本,而无需卸载当前版本。安装步骤如下: 安装 pyenv-win 1. 安装 Git 和 pyenv-win: git clone https://github.com/pyenv-win/pyenv-win.git %USERPRO…

ControlNet on Stable Diffusion

ControlNet on Stable Diffusion 笔记来源: 1.Adding Conditional Control to Text-to-Image Diffusion Models 2.How to Use OpenPose & ControlNet in Stable Diffusion 3.ControlNet与DreamBooth:生成模型的精细控制与主体保持 4.Introduction t…

Git(分布式版本控制系统)(fourteen day)

一、分布式版本控制系统 1、Git概述 Git是一种分布式版本控制系统,用于跟踪和管理代码的变更,它由Linux、torvalds创建的,最初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本,并且可以在不同的开发人员之间进行…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

VINS-Fusion 回环检测pose_graph_node

VINS-Fusion回环检测,在节点pose_graph_node中启动。 pose_graph_node总体流程如下: 重点看process线程。 process线程中,将订阅的图像、点云、位姿时间戳对齐,对齐后分别存入image_msg、point_msg、pose_msg。pose_msg为VIO后端优化发布的位姿。 一、创建关键帧keyFram…

opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习

前言 AIS_ManipulatorOwner是OpenCascade中的一个类,主要用于操纵对象的交互控制。AIS_ManipulatorOwner结合AIS_Manipulator类,允许用户通过可视化工具(如旋转、平移、缩放等)来操纵几何对象。 以下是AIS_ManipulatorOwner的基…

【Drone】drone编译web端 防墙策略 | 如何在被墙的状态drone顺利编译npm

一、drone编译防墙版本 1、web端drone kind: pipeline type: docker name: ui steps:- name: build_projectimage: node:20-slim depends_on: [clone]volumes:- name: node_modulespath: /drone/src/node_modulescommands:- pwd- du -sh *- npm config set registry https://…

免费【2024】springboot 毕业生学历证明系统

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

SQL labs-SQL注入(二)

环境搭建参考 SQL注入(一) 一,SQL labs-less2。 http://192.168.61.206:8001/Less-2/?id-1 union select 1,2,group_concat(username , password) from users-- 与第一关没什么太大的不同,唯一区别就是闭合方式为数字型。 二…

超火爆AI工具——Vozo:一键重写视频脚本、重新配音!

最近有一款短视频工具——Vozo AI非常火热,上线即登Product Hunt榜首,且已蝉联3天。 它的全名是Vozo Rewrite & Redub,Rewrite意味着重新编写,Redub代表重新配音,它能够根据提示词,重新生成视频脚本并能…

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1,el-form品牌logo图片自定义显示2,重新导入和注册element-ui组件3,修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1,el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…

MySql 全文索引

MySql 全文索引 1.MySql 全文索引介绍2.ngram 简介3.数据库配置4.创建全文索引5.使用全文索引布尔模式校验 ngram 自然语言模式拓展查询 6.相关性排序7.注意事项 1.MySql 全文索引介绍 Mysql 的全文索引主要用于全文字段的检索场景,支持 char、varchar、text 几个字…

博客建站4 - ssh远程连接服务器

1. 什么是SSH?2. 下载shh客户端3. 配置ssh密钥4. 连接服务器5. 常见问题 5.1. IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! 1. 什么是SSH? SSH(Secure Shell)是一种加密的网络协议,用于在不安全的网络中安全地远程登录到其他…

浪潮自研交换机系列常见问题处理

CN61108PC-V-H 不能PING通任何地址,也不能被PING 输入ip traceroute enable既可。注意视图 交换机通过console口远程登录至其他交换机,掉线后console口无法使用 例如有2台交换机A和B,在A交换机上插上console线登录后,在A通过SSH…