一、环境信息
1.1 测试环境
? ? ?本地IDE直接启动的控制台和客户端
1.2 版本信息
jdk: 11
spring-boot:?2.6.13
spring-cloud:?2021.0.5
spring-cloud-alibaba:?2021.0.4.0
sentinel: 1.8.5
sentinel官网
1.3 术语解释
QPS(Queries-per-second)即每秒查询率,QPS(TPS)= 并发数/平均响应时间,可以简单理解为每秒的请求数。
流控(流量控制):就是控制请求的流量,在超过设置的阈值后,请求就直接拒绝。
熔断(熔断降级):当调用链路中某个资源出现不稳定,例如表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
二、sentinel控制台安装
官网下载jar包或者下载源码打包,和传统的springboot项目一样启动即可。
非必须,只是用来测试和看数据,默认用户密码sentinel,可在项目application.properties配置文件中修改
三、sentinel集成
3.1 spring-boot集成
只需要额外添加一个依赖
<dependency>
????<groupId>com.alibaba.cloud</groupId>
????<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
然后配置sentinel控制台地址即可
spring:
? application:
? ? name: spring-boot-demo
? cloud:
? ? sentinel:
? ? ? transport:
? ? ? ? dashboard: localhost:8080
? ? ? ? heartbeat-interval-ms: 500
? ? ? ? eager: true
注意:控制台和springboot都启动后,控制台界面上是看不到项目的,只有在springboot有接口请求后才会有项目信息。
3.2 spring-cloud集成
待测试补充
四、sentinel测试
请求模拟:5个进程,每个进程每秒请求一次接口
如果被限流,请求方会获取到429错误:Blocked by Sentinel (flow limiting)
4.1 流控规则
4.1.1 设置QPS
如图所示,设置的QPS是1,模拟的请求是接近5,但是实际通过的QPS是2,是因为Sentinel的流控规则是基于滑动窗口来计算的,也就是说,Sentinel 会在固定时间内统计请求的数量,然后根据这个统计结果来判断是否进行流控。由于统计数据存在误差,因此 Sentinel 实际的 QPS 可能会略微超过流控规则设置的 QPS,这属于正常现象。
4.1.2 设置并发线程数
如图所示,审核制的并发线程数是1,模拟的请求QPS接近5,由于每个接口响应非常快,所以在模拟请求QPS接近5的时候实际的服务端线程也很小。
那猜测下,如果接口响应比较长,服务端的线程数就应该上涨,通过的QPS就应该降低。按照这个猜想,模拟的接口睡眠800ms,之后的实时监控如下,猜想成立。
4.2 熔断规则
4.2.1 设置慢调用比例
如图所示,设置的最大RT是500ms,模拟的请求响应时间是800ms,每个请求都会超时,但是设置了最小请求数,所以依然会有一个通过的QPS
4.2.2 设置异常比例
如图所示,设置的异常比例未0.5,模拟的请求全部抛出异常,每个请求都是失败,但是设置了一个最小请求数1,所以依然会有1个请求到达服务,其他请求就都被拒绝,防止服务器负载过高或者宕机。
4.2.3 设置异常数
如图所示,设置了异常数3,最小请求数1,在模拟的QPS分别为5,10和3的时候,都是保留了一个通过的QPS,拒绝了其他的。
保持QPS=3的模拟请求,把异常数改为4以后如下
4.3 热点规则
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
并且需要硬编码,添加@SentinelResource注解才可以使用。
4.4 系统规则
4.4.1 设置cpu使用率
如图所示,CPU使用率先设置的3,请求全部拒绝,此时查看电脑cpu使用率大概在5%,所以改为5,则出现部分拒绝部分放行。