HM-SpringCloud微服务系列8.2.2【流量控制(2)】
准备工作
进入nacos的bin目录下startup.cmd -m standalone
启动nacos
进入sentinel的jar包目录下java -jar sentinel-dashboard-1.8.1.jar
启动sentinel
进入jmeter的bin目录下双击jmeter.bat启动测试工具
idea打开cloud-demo项目,启动order&user&gateway三个微服务
4. 流控效果
4.1 分类
- 在流控的高级选项中,还有一个流控效果选项:
- 流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
- 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式(即之前碰到的状态码429)。
- warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
- 排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
4.2 【warm up预热】
4.2.1 warm up介绍
- 阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。
- warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3.
- 例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.
4.2.2 案例
需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用warm up效果,预热时长为5秒
- 配置流控规则
- Jmeter测试
- 选择《流控效果,warm up》:
- 启动《流控效果,warm up》
- 查看测试结果树&与此同时到Sentinel控制台查看实时监控
- 刚刚启动时,大部分请求失败,成功的只有3个,说明QPS被限定在3:
- 随着时间推移,成功比例越来越高:
- 到Sentinel控制台查看实时监控:
- 一段时间后:
- 刚刚启动时,大部分请求失败,成功的只有3个,说明QPS被限定在3:
4.3 【排队等待】
4.3.1 排队等待介绍
- 当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。
- 而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
- 工作原理
- 例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。
- 那什么叫做预期等待时长呢?
- 比如现在一下子来了12 个请求,因为每200ms执行一个请求,那么:
- 第6个请求的预期等待时长 = 200 * (6 - 1) = 1000ms
- 第12个请求的预期等待时长 = 200 * (12-1) = 2200ms
- 现在,第1秒同时接收到10个请求,但第2秒只有1个请求,此时QPS的曲线这样的:
- 如果使用队列模式做流控,所有进入的请求都要排队,以固定的200ms的间隔执行,QPS会变的很平滑:
- 平滑的QPS曲线,对于服务器来说是更友好的。
- 例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。
4.3.2 案例
需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s
- 添加流控规则
- Jmeter测试
- 选择《流控效果,队列》:
- QPS为15,已经超过了我们设定的10。如果是之前的 快速失败、warmup模式,超出的请求应该会直接报错。但是我们看看队列模式的运行结果:
- 启动《流控效果,队列》
- 查看结果树&同时查看sentinel控制台中的QPS曲线
- 全部都通过了。
- 再去sentinel查看实时监控的QPS曲线:
- QPS非常平滑,一致保持在10,但是超出的请求没有被拒绝,而是放入队列。因此响应时间(等待时间)会越来越长。
- 当队列满了以后,才会有部分请求失败:
- 查看结果树&同时查看sentinel控制台中的QPS曲线
4.4 小结
流控效果有哪些?
- 快速失败:QPS超过阈值时,拒绝新的请求
- warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
- 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝
5. 热点参数限流
之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。
5.1 全局参数限流
- 例如,一个根据id查询商品的接口:
- 访问/goods/{id}的请求中,id参数值会有变化,热点参数限流会根据参数值分别统计QPS,统计结果:
- 当id=1的请求触发阈值被限流时,id值不为1的请求不受影响。
- 配置示例:
- 代表的含义是:对hot这个资源的0号参数(第一个参数)做统计,每1秒相同参数值的请求数不能超过5
5.2 热点参数限流
- 刚才的配置中,对查询商品这个接口的所有商品一视同仁,QPS都限定为5.
- 而在实际开发中,可能部分商品是热点商品,例如秒杀商品,我们希望这部分商品的QPS限制与其它商品不一样,高一些。那就需要配置热点参数限流的高级选项了:
- 结合上一个配置,这里的含义是对0号的long类型参数限流,每1秒相同参数的QPS不能超过5,有两个例外:
- 如果参数值是100,则每1秒允许的QPS为10
- 如果参数值是101,则每1秒允许的QPS为15
5.3 案例
需求:给/order/{orderId}这个资源添加热点参数限流,规则如下:
- 默认的热点参数规则是每1秒请求量不超过2
- 给102这个参数设置例外:每1秒请求量不超过4
- 给103这个参数设置例外:每1秒请求量不超过10
注意事项:热点参数限流对默认的SpringMVC资源无效,需要利用@SentinelResource注解标记资源
-
标记资源
给order-service中的OrderController中的/order/{orderId}资源添加注解:
-
热点参数限流配置
注意:这里不要点击hot后面的按钮,页面有BUG,无高级配置选项
正确做法:
- 点击左侧菜单中热点规则菜单
- 点击新增,填写表单:
- Jmeter测试
选择《热点参数限流 QPS1》
这里发起请求的QPS为5.包含3个http请求:
普通参数,QPS阈值为2
运行结果:
例外项,QPS阈值为4
运行结果:
例外项,QPS阈值为10
运行结果:
分类:
微服务
标签:
SpringCloud
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!