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 直接失败
- 选择
阈值类型 QPS
:QPS
: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
毫秒