前言:
本篇博客介绍了有关于Sentinel的几种常用的流控规则。
文章目录
- 一。概述
- 二。QPS-直接-快速失败
- 三。线程-直接-快速失败
- 四。QPS-关联-快速失败
- 五。QPS-链路-快速失败
- 六。QPS-直接-预热
- 七。QPS-直接-匀速排队
一。概述
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
FlowSlot
会根据预设的规则,结合前面 NodeSelectorSlot
、ClusterBuilderSlot
、StatisticSlot
统计出来的实时信息进行流量控制。
限流的直接表现是在执行Entry nodeA = SphU.entry(resourceName)
的时候抛出 FlowException
异常。FlowException
是 BlockException
的子类,您可以捕捉 BlockException
来自定义被限流之后的处理逻辑。
同一个资源可以创建多条限流规则。FlowSlot
会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
-
resource
:资源名,即限流规则的作用对象 -
count
: 限流阈值 -
grade
: 限流阈值类型(QPS 或并发线程数) -
limitApp
: 流控针对的调用来源,若为 default 则不区分调用来源 -
strategy
: 调用关系限流策略 -
controlBehavior
: 流量控制效果(直接拒绝、Warm Up、匀速排队)
二。QPS-直接-快速失败
1.说明
当一秒内 QPS 超过某个阈值的时候,则采取措施进行流量控制。
2.示例demo
控制器代码:
3.sentinel控制台操作
4.访问测试
一秒点击一次还是可以正常访问:
若快速点击多次,超过了QPS阈值,则被限流:
三。线程-直接-快速失败
1.说明
当一秒内 访问线程数超过某个阈值的时候,则采取措施进行流量控制。
2.示例demo
控制器代码:
3.sentinel控制台操作
4.访问测试
快速点击多次依然可以访问:
若打开两个浏览器窗口,快速切换并快速刷新页面,超过了访问线程数阈值,则被限流:
四。QPS-关联-快速失败
1.说明:
当接口A关联了接口B时,在访问B接口超过了规定流量阈值的情况下,接口A也将会被限流
2.示例demo
控制器代码:
3.sentinel控制台操作
先给testB建立流控规则:
在建立/testA流控规则,关联/testB:
4.访问测试
使用postman建立新的访问接口集合集中访问
在postman访问testB接口的同时,去访问testA,发现testA被限流:
五。QPS-链路-快速失败
1.说明
当两个接口A和接口B访问同一个资源时,若对接口A进行了资源的链路控制,超过了规定的阈值后,再次访问接口A去请求资源时会出现报错
2.实例demo
控制器代码:
service:
配置文件:
3.sentinel控制台操作
4.访问测试
多次访问/testA接口,超过阈值再次访问接口A去请求资源时会出现报错:
六。QPS-直接-预热
1.说明
warm up就是为了防止突然进入的大流量大系统冲垮,在一定时间内将访问流量慢慢增加
公式:阈值除以coldFactor
(默认值为3),经过预热时长后才会达到阈值
默认coldFactor
为3,即请求QPS从threshold/3
开始,经预热时长逐渐升至设定的QPS阈值。
2.实例demo
3.sentinel控制台操作
4.访问测试
当前五秒阈值为10/3=3,快速点击时,触发限流:
当五秒钟过预热后,阈值到达10,再次快速点击,访问正常:
七。QPS-直接-匀速排队
1.说明
排队等待,匀速通过
2.实例demo
3.sentinel控制台操作
4.访问测试
再次使用postman接口集合对testB接口进行访问:
后台线程数每隔相应的延迟时间对接口进行访问,实现匀速接口限流: