Version: Next

Sentinel 流量控制


Sentinel名词解释

  • 资源名:唯一名称,默认请求路径
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,指定对哪个微服务进行限流 ,默认default(不区分来源,全部限制)
  • 阈值类型/单机阈值: 1、QPS(每秒钟的请求数量):当调用该接口的QPS达到了阈值的时候,进行限流; 2、线程数:当调用该接口的线程数达到阈值时,进行限流
  • 是否集群:不需要集群
  • 流控模式: 1、直接:接口达到限流条件时,直接限流 2、关联:当关联的资源达到阈值时,就限流自己 3、链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)[api级别的针对来源]
  • 流控效果 1、快速失败:直接失败 2、Warm Up:即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值 3、排队等待

流控模式

直接(默认)

资源名:唯一名称,默认请求路径,Controller 里的路径

  • 进入 簇点链路
  • 在对应的 路径 path (如 /testA) 后点击 流控

QPS 直接失败

  • 选择 阈值类型 QPSQPS:Queries Per Second 每秒查询/请求数,阈值设置为 1 表示每秒访问数大于 1 就触发
  • 流控模式设置为 直接
  • 流控效果设置为 快速失败


  • 之后,这条设置好的流量规则,可以再 流量规则 模块中查看


测试

  • 疯狂访问 http://localhost:8401/testA
  • 会触发设置的流控规则
  • 得到响应为报错字符串 被 Sentinel 阻挡(流量控制)

关联

当关联的资源达到阈值时,就限流自己

  • 白话:别人的锅我来背
  • 当与 A 关联的资源 B 达到阈值后,就限流 A 自己
  • B 惹事,A 把自己挂了
  • 修改 /testA 的流控规则,设置为关联到 /testB
    • 即,如果 B 挂了,希望 A 就把自己限流了,因为 A 的业务可能要调用 B


  • 此处指:如果 /testB 的 QPS 超过 1 ,就把 /testA 限流

使用 POSTMAN 模拟并发密集请求 /testB 测试

  • 在 POSTMAN 中输入请求地址,然后点 Save,把它存储到 集合 Collections 中,这样就可以把一些列请求做成一个 ArrayList 一样的东西
  • 设置集合运行方式:设置 20 个线程每间隔 300 毫秒请求一次目标地址



  • 执行 POSTMAN 密集请求,期间访问 http://localhost:8401/testA,可以发现 A 已经被限流了


  • POSTMAN 请求完毕后, /testA 又恢复了正常功能

链路

多个请求调用了同一个微服务


流控效果

快速失败

直接返回一个报错字符串

预热

分布式系统害怕遇到的情况:平时没人用,关键时刻直接好几十万访问量

  • 要实现一个 削峰 的效果
  • 公式:阈值 / coldFactor,经过预热时长后才会达到阈值。其中 coldFactor 为冷却因子,默认值为 3
  • 请求 QPS 从 阈值 / 3 开始,经过预热时长逐步提升至设定的 QPS 阈值
  • 设置允许的最大 QPS 为 10,设置为预热,在 5 秒内提升至最大阈值 10 ,一开始的 QPS 为 10 / 3 = 3


排队等待

  • 匀速排队,让请求以均匀速度通过,阈值类型必须设置为 QPS,否则无效,使用的是 漏桶算法
  • 设置 /testA QPS 阈值为 1,每秒只处理请求 1 次,如果超过了就必须排队等待,等待的超时时间设置为 20000 毫秒