springcloud-alibaba生态环境
springcloud-alibaba-sentinel(1)sentinel流量卫兵介绍
springcloud-alibaba-sentinel(2)sentinel下载安装运行
springcloud-alibaba-sentinel(3)sentinel的基本使用
在最新的springcloud-alibaba-sentinel(3)sentinel的基本使用
文章中,我们已经将sentnel融合进了springboot项目,并且初步体验了sentinel
的流量监控功能,接下来,咱们仔细研究下sentinel的一些强大的流控功能!
实时监控,是sentinel
对服务中的接口进行请求监控,当我们的项目连接且配置了sentinel-dashboard
服务,我们的服务的请求数据将会被sentinel进行监控,由于其是通过轮询机制请求sentinel-dashboard
的接口/metric/queryTopResourceMetric.json
获取的监控数据,所以其仍存在一定的延迟性,大约5S左右
当我们请求服务器某一资源(接口)时,请求情况就会被sentinel
收集并展示
这里,对实时监控功能做一些简单的解释说明:
簇点链路:簇点链路就是我们当前服务接口(资源)情况,我们可以在此页面统一的设置某个接口的访问限制或者流量限制以及降级策略等等…相当于一个统一管理页面
我们来仔细解释一下当前页面各个属性
app-login
服务连接的sentinel的通信地址,端口号为8719 (默认)其会与sentinel-dashboard服务端进行通信,如果您更改了默认通信端口,则需要在项目中指明,例如:spring.cloud.sentinel.transport.port=xxxx
流控规则就是对某一资源(接口)设置请求规则,当触发该规则做什么…未触发该规则做什么…
流控是流量控制的简称,是sentinel的核心功能!
流量控制(flow control),其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
QPS统计
什么是QPS?
贴近开发来讲,就是每秒钟对服务资源请求次数
当 QPS 超过某个阈值的时候,则采取措施进行流量控制
并发线程数统计
并不是多少个请求就会有多少个线程进行执行,因此,sentinel还可以精准的控制资源请求的线程并发数量
同一个资源可以创建多条限流规则。FlowSlot 会对该资源的所有限流规则依次遍历,直到有规则触发限流或者所有规则遍历完毕。
一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果:
resource:资源名,即限流规则的作用对象
count: 限流阈值
grade: 限流阈值类型(QPS 或并发线程数)
limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
strategy: 调用关系限流策略
controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
如果了解更多请移步官网:sentinel流控规则详解
接下来,咱们进行流量控制实操!!
当我们在页面疯狂请求接口http://192.168.125.8:30020/test/sentinel
后,发现我手速最多可达6次每秒,且这几秒内,拒绝QPS都为0
接口(资源)如果不设置流量控制,那么其默认是没有配置的,无论接口还是服务器最大可承受并发为多少,sentinel都不会主动拒绝任何请求!
此时,假如这个接口每秒钟最多只能承受两次请求,那么QPS持续为6就可能击垮我们的服务,这个时候呢,就需要对/test/sentinel
这个接口(资源)进行流量控制了…
如何设置流量控制呢?
①在簇点链路/test/sentinel
后点击流控按钮,设置QPS流控
② 点击左侧流控规则菜单栏,再点击新建规则按钮,设置流控
两者,本质都是一样,仅仅是展示在不同菜单罢了
点击后,会出现流控设置弹框
解释说明:
资源名:流控规则作用的资源(接口)
针对来源:针对某个来源设置的规则,默认default,针对所有来源
阈值类型:规则触发阈值类型,QPS还是线程数,单选,默认为QPS
单机阈值:阈值达到多少触发限流
是否集群:是否集群配置(我这里为单机)
设置好后,我们再来访问http://192.168.125.8:30020/test/sentinel
接口,疯狂刷新
测试结果:每秒只能最大接收2个请求,超过2个页面会显示如下报错信息
为了避免干扰测试,我们在测试线程数限流之前,先将QPS限流阈值2的规则删除掉
接口/test/sentinel
添加线程数限流
为了方便线程数测试,我这里直接使用Jemeter
压测工具了!
测试结果:每秒最多接受两个线程处理,多余请求线程分配不过来时进行限流报错
以上,QPS限流以及线程数限流便简单的演示完了,但sentinel的流控规则不仅仅是这么简单,他还包含了很多高级功能
在设置QPS限流或者线程数限流的时候,下方有一个高级选项按钮
点击展开
选择QPS限速阈值类型的时候 下方出现了流控模式
以及流控效果
面板选项
选择线程数限速阈值的时候,仅仅只有流控效果
我们不由发出疑问,流控模式,流控效果,到底是什么呢?我们先来看看它们的概念
sentinel
中,流控模式共三种:直接
、关联
、链路
直接(模式)
对资源的请求达到设置的规则阈值时直接对该资源触发流量控制
关联(模式)
下边是官网原文解释:
当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 strategy 为 RuleConstant.STRATEGY_RELATE 同时设置 refResource 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。
链路(模式)
这个模式很好理解,尤其是在微服务间相互调用情况下尤为常见(a->b->d)
假设我以a为入口资源,d为终点资源,对这条链路进行限制的话,则资源a,b,d均会被限制访问。
sentinel中,流控效果共三种:快速失败
、Warm Up(预热)
、排队等待
快速失败
(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流控效果,当QPS或线程数超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。
就是我们一开始配置流控规则触发阈值后看到的Blocked by Sentinel (flow limiting)
Warm Up(预热)
当流量突然增大的时候,我们常常会希望系统从空闲状态到繁忙状态的切换的时间长一些。即如果系统在此之前长期处于空闲的状态,我们希望处理请求的数量是缓步的增多,经过预期的时间以后,到达系统处理请求个数的最大值。Warm Up(冷启动,预热)模式就是为了实现这个目的的。
这个场景主要用于启动需要额外开销的场景,例如建立数据库连接等。
排队等待
(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,让请求以均匀的速度通过,对应的是漏桶算法。 只能对请求进行排队等待
流控模式与流控效果必须相结合使用,在未显示的指定模式与效果的时候,默认是直接模式+快速失败
效果,两种混搭出来的效果有:
直接模式+快速失败
、直接模式+Warm Up(预热)
、直接模式+排队等待
关联模式+快速失败
、关联模式+Warm Up(预热)
、关联模式+排队等待
链路模式+快速失败
、链路模式+Warm Up(预热)
、链路模式+排队等待
一共以上九种限流搭配组合效果!
这是sentinel默认的流控组合,对某一资源设置了限流阈值后,达到阈值直接抛出异常
预热:就是俗称的冷启动
,当某个接口并发飙升的时候,对这个接口一点点的扩宽限制,直到满足要求
我们首先,将原接口添加打印日志
@GetMapping("/test/sentinel")
public String get() {
String message = "赵钱孙李" + new Random().nextInt(20);
log.info(message);
return message;
}
设定每秒钟并发阈值,该方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,阀值类型必须设成QPS
注意:超时时间指的是该资源处理时长,例如我这里,对接口的请求响应如果超过了1秒,会出触发限流异常
设置后结果:当设置完QPS为16后,Jemeter压测每秒钟最多接受16个请求
2021-01-18 23:06:20.066 INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController : 赵钱孙李17
2021-01-18 23:06:20.129 INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController : 赵钱孙李19
2021-01-18 23:06:20.193 INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController : 赵钱孙李9
2021-01-18 23:06:20.255 INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController : 赵钱孙李15
2021-01-18 23:06:20.318 INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController : 赵钱孙李2
2021-01-18 23:06:20.380 INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController : 赵钱孙李19
2021-01-18 23:06:20.445 INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController : 赵钱孙李9
2021-01-18 23:06:20.508 INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController : 赵钱孙李19
2021-01-18 23:06:20.570 INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController : 赵钱孙李4
2021-01-18 23:06:20.634 INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController : 赵钱孙李10
2021-01-18 23:06:20.697 INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController : 赵钱孙李0
2021-01-18 23:06:20.760 INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController : 赵钱孙李7
2021-01-18 23:06:20.822 INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController : 赵钱孙李12
2021-01-18 23:06:20.886 INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController : 赵钱孙李0
2021-01-18 23:06:20.948 INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController : 赵钱孙李12
2021-01-18 23:06:21.012 INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController : 赵钱孙李15
2021-01-18 23:06:21.075 INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController : 赵钱孙李4
2021-01-18 23:06:21.137 INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController : 赵钱孙李17
2021-01-18 23:06:21.200 INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController : 赵钱孙李6
2021-01-18 23:06:21.263 INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController : 赵钱孙李1
2021-01-18 23:06:21.326 INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController : 赵钱孙李10
2021-01-18 23:06:21.390 INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController : 赵钱孙李16
2021-01-18 23:06:21.452 INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController : 赵钱孙李7
2021-01-18 23:06:21.514 INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController : 赵钱孙李6
2021-01-18 23:06:21.578 INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController : 赵钱孙李14
2021-01-18 23:06:21.642 INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController : 赵钱孙李3
2021-01-18 23:06:21.704 INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController : 赵钱孙李14
2021-01-18 23:06:21.768 INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController : 赵钱孙李18
2021-01-18 23:06:21.831 INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController : 赵钱孙李1
2021-01-18 23:06:21.892 INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController : 赵钱孙李5
2021-01-18 23:06:21.956 INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController : 赵钱孙李16
2021-01-18 23:06:22.020 INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController : 赵钱孙李17
2021-01-18 23:06:22.083 INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController : 赵钱孙李2
2021-01-18 23:06:22.145 INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController : 赵钱孙李19
2021-01-18 23:06:22.208 INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController : 赵钱孙李5
2021-01-18 23:06:22.271 INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController : 赵钱孙李8
2021-01-18 23:06:22.335 INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController : 赵钱孙李13
2021-01-18 23:06:22.397 INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController : 赵钱孙李7
2021-01-18 23:06:22.461 INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController : 赵钱孙李8
2021-01-18 23:06:22.523 INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController : 赵钱孙李4
2021-01-18 23:06:22.586 INFO 1968 --- [o-30020-exec-22] com.leilei.demo.LoginController : 赵钱孙李1
2021-01-18 23:06:22.650 INFO 1968 --- [o-30020-exec-10] com.leilei.demo.LoginController : 赵钱孙李14
2021-01-18 23:06:22.713 INFO 1968 --- [io-30020-exec-6] com.leilei.demo.LoginController : 赵钱孙李18
2021-01-18 23:06:22.774 INFO 1968 --- [io-30020-exec-4] com.leilei.demo.LoginController : 赵钱孙李10
2021-01-18 23:06:22.839 INFO 1968 --- [o-30020-exec-14] com.leilei.demo.LoginController : 赵钱孙李9
2021-01-18 23:06:22.902 INFO 1968 --- [o-30020-exec-23] com.leilei.demo.LoginController : 赵钱孙李17
2021-01-18 23:06:22.963 INFO 1968 --- [o-30020-exec-11] com.leilei.demo.LoginController : 赵钱孙李1
2021-01-18 23:06:23.028 INFO 1968 --- [o-30020-exec-16] com.leilei.demo.LoginController : 赵钱孙李18
2021-01-18 23:06:23.090 INFO 1968 --- [o-30020-exec-24] com.leilei.demo.LoginController : 赵钱孙李4
2021-01-18 23:06:23.154 INFO 1968 --- [o-30020-exec-13] com.leilei.demo.LoginController : 赵钱孙李1
当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联,这个时候如果在sentinel流控中对两个资源设置了关联关系,那么被关联的资源在达到阈值时另一个资源则会进入流控状态
现在假如下方两个接口存在着资源竞争关系
假如设置了如下的关联流控规则
特别特别注意:关联资源,反而是触发流控阈值的资源,资源名处资源是被流控资源!!
如果按照图上这样设置流控规则,那么结果就是当/test/name
QPS达到10+的时候,/test/sentinel
资源将会进入流控状态,流控效果是快速失败!
结果展示:
我们的/test/sentinel
资源,连每秒钟1QPS都直接进行了拒绝,而/test/name
每秒钟2200QPS都会被接受
…
至于关联模式+预热
以及关联模式+排队等待
,我这里就不演示了!!感兴趣的可以自己玩玩
…后续待更