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 分类

  1. 在流控的高级选项中,还有一个流控效果选项:
    image
  2. 流控效果是指请求达到流控阈值时应该采取的措施,包括三种:
    • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出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.
    image

4.2.2 案例

需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用warm up效果,预热时长为5秒

  1. 配置流控规则
    image
    image
    image
    image
    image
    image
  2. Jmeter测试
  • 选择《流控效果,warm up》:
    image
    image
  • 启动《流控效果,warm up》
  • 查看测试结果树&与此同时到Sentinel控制台查看实时监控
    • 刚刚启动时,大部分请求失败,成功的只有3个,说明QPS被限定在3:
      image
    • 随着时间推移,成功比例越来越高:
      image
    • 到Sentinel控制台查看实时监控:
      image
    • 一段时间后:
      image

4.3 【排队等待】

4.3.1 排队等待介绍

  1. 当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。
  2. 而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
  3. 工作原理
    • 例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。
      image
    • 那什么叫做预期等待时长呢?
    • 比如现在一下子来了12 个请求,因为每200ms执行一个请求,那么:
      • 第6个请求的预期等待时长 = 200 * (6 - 1) = 1000ms
      • 第12个请求的预期等待时长 = 200 * (12-1) = 2200ms
    • 现在,第1秒同时接收到10个请求,但第2秒只有1个请求,此时QPS的曲线这样的:
      image
    • 如果使用队列模式做流控,所有进入的请求都要排队,以固定的200ms的间隔执行,QPS会变的很平滑:
      image
    • 平滑的QPS曲线,对于服务器来说是更友好的。

4.3.2 案例

需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用排队的流控效果,超时时长设置为5s

  1. 添加流控规则
    image
    image
    image
  2. Jmeter测试
  • 选择《流控效果,队列》:
    image
    image
  • QPS为15,已经超过了我们设定的10。如果是之前的 快速失败、warmup模式,超出的请求应该会直接报错。但是我们看看队列模式的运行结果:
  • 启动《流控效果,队列》
    • 查看结果树&同时查看sentinel控制台中的QPS曲线
      image
    • 全部都通过了。
    • 再去sentinel查看实时监控的QPS曲线:
      image
    • QPS非常平滑,一致保持在10,但是超出的请求没有被拒绝,而是放入队列。因此响应时间(等待时间)会越来越长。
    • 当队列满了以后,才会有部分请求失败:
      image
      image

4.4 小结

流控效果有哪些?

  • 快速失败:QPS超过阈值时,拒绝新的请求
  • warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。
  • 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝

5. 热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

5.1 全局参数限流

  • 例如,一个根据id查询商品的接口:
    image
  • 访问/goods/{id}的请求中,id参数值会有变化,热点参数限流会根据参数值分别统计QPS,统计结果:
    image
    • 当id=1的请求触发阈值被限流时,id值不为1的请求不受影响。
  • 配置示例:
    image
    • 代表的含义是:对hot这个资源的0号参数(第一个参数)做统计,每1秒相同参数值的请求数不能超过5

5.2 热点参数限流

  • 刚才的配置中,对查询商品这个接口的所有商品一视同仁,QPS都限定为5.
  • 而在实际开发中,可能部分商品是热点商品,例如秒杀商品,我们希望这部分商品的QPS限制与其它商品不一样,高一些。那就需要配置热点参数限流的高级选项了:
    image
  • 结合上一个配置,这里的含义是对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注解标记资源

  1. 标记资源
    给order-service中的OrderController中的/order/{orderId}资源添加注解:
    image
    image
    image

  2. 热点参数限流配置

注意:这里不要点击hot后面的按钮,页面有BUG,无高级配置选项
image

正确做法:

  • 点击左侧菜单中热点规则菜单
    image
  • 点击新增,填写表单:
    image
    image
  1. Jmeter测试
    选择《热点参数限流 QPS1》
    image
    这里发起请求的QPS为5.包含3个http请求:
    普通参数,QPS阈值为2
    image
    运行结果:
    image
    例外项,QPS阈值为4
    image
    运行结果:
    image
    例外项,QPS阈值为10
    image
    运行结果:
    image

image
image

posted @   yub4by  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示