各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛
🍹 Sentinel
🍸 什么是Sentinel
官网上如是介绍到:随着微服务的流行,服务和服务之间的稳定性变得越来越重要,Sentinel以流星为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。说白了Sentinel就是hystrix(豪猪哥)的阿里翻版,他能实现和豪猪哥一样的功能,但是比之前者它还提供了图形化的操作界面,操作起来更加的方便快捷
Sentinel应用场景十分重要且丰富: 它承接了阿里巴巴近年的双十—大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
🍸 Sentinel下载安装配置
第一步: 下载Sentinel监控页面jar:https://github.com/alibaba/Sentinel/tags
第二步: 使用命令运行jar,访问管理界面(用户名密码默认为sentinel),此时要保证8080端口没有被占用,否则就会产生端口冲突
java -jar
🍹 Sentinel项目实战
初始化监控服务
该项目中会创建一个新的子模块,然后通过配置文件将其注册进nacos注册中心,且通过sentinel进行实时监控
第一步: 创建一个子模块,并引入相关依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel-datasource-nacos 后续sentinel做持久化用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
第二步: 配置文件
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
第三步: 主程序类
@EnableDiscoveryClient
@SpringBootApplication
public class CloudAlibabaSentinelService8401 {
public static void main(String[] args) {
SpringApplication.run(CloudAlibabaSentinelService8401.class, args);
System.out.println("启动成功");
}
}
第四步: controller接口,访问浏览器显示相应字符串而已,没有任何联动,主要是为了后面的
@RestController
public class FlowLimitController {
@GetMapping("/testA")
public String testA() {
return "------testA";
}
@GetMapping("/testB")
public String testB() {
return "------testB";
}
}
先启动nacos,然后启动sentinel的监控jar包,最后启动主程序类
此时sentinel测监控页面并不会有任何的服务,因为sentinel使用的是懒加载机制,只有被监控服务有被访问时图形界面才会显示相应的监控图表信息,该服务一段时间没有被访问的话之前的图表数据也会消失
🍸 流控规则配置
流控配置就是对微服务里接口的流量控制配置,该配置精准到微服务的具体接口,如果该接口的访问超出了手动配置的阈值,就会执行相应的结果(这里阈值和结果都是自己在页面上配置的)
上面弹窗里所有配置项的意思都在下面进行解释,当需要对一个接口的访问进行限流时,即可参照规则进行流控配置
使用QPS进行阈值设置的请求,会在一秒内达到阈值之后的所有请求选择流控效果默认都直接失败,页面返回失败信息,这些失败的请求甚至没有到请求业务就直接失败了
而使用线程数进行阈值设置的请求,在请求线程数达到阈值之后的所有请求无法选择流控效果,这些请求会打进业务但是无法执行就页面返回失败信息
流控模式: 关联
通过关联配置,关联的接口资源出现问题被限流,对应的接口资源也会被限流,比如说/testA在流控配置的时候关联了/testB,那么一旦/testB被限流/testA也同样会被限流
流控效果: Warm Up
预热,sentinel默认选择该流控效果后需要填写预热时长(只有QPS阈值才可选),配置之后,预热时长范围内阈值都是QPS对3取模,经过预热时长后阈值才恢复预定阈值
比如说使用QPS阈值,单机阈值为13,选择Warm Up效果,预热时长为5,那就意味着前5S(预热时长),接口每秒内最多可接受4次请求(13%3=4),等到过了预热时间5S之后,该接口每秒内最多可接受13(QPS)次请求
流控效果: 排队等待
匀速排队方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。这种方式主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第—秒直接拒绝多余的请求。
🍸 熔断规则配置
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断。Sentinel和hystrix的熔断降级是非常像的,但是Sentinel并没有像hystrix一样的半开状态(也就是缓冲状态一段时间正常之后就结束熔断)
降级策略: RT
统计时长(1000ms)内,请求数超过最小请求数(5)并且在最大RT时间(200ms)内没有处理完本次任务的话,就会在未来的熔断时长(1s)内对该服务进行熔断,断路器打开微服务不可用
降级策略: 异常比例
当资源的每秒请求量大于最小请求数(5),并且每秒异常总数占通过量的比值超过比例阈值(0.2)之后,资源进入降级状态,即在接下的统计时长(1000ms)内,对该服务进行熔断,断路器打开微服务不可用,对这个方法的调用都会自动地返回。
降级策略: 异常数
当统计时间(1000ms)内的请求数量超过最小请求数(5),并且这1s中的异常数目超过异常数(10)之后会进行熔断,即在接下的统计时长(1000ms)内,对该服务进行熔断,断路器打开微服务不可用,对这个方法的调用都会自动地返回。
🍸 热点key配置
每统计窗口时长(1s)内,如果该接口接收到的请求中 参数列表包含索引为0的参数(也就是参数列表中的第一个参数),且数量超过单机阈值(1)的话就会对该服务进行熔断降级,对这个方法的调用都会自动地返回。
根据上面的描述,接口有两个参数p1、p2,如果请求为http://localhost:8401/testHotKey?p1=a或者http://localhost:8401/testHotKey?p1=a&p2=b不符合热点规则,将会触发熔断降级,但是http://localhost:8401/testHotKey?p2=b将不会触发降级
高级选项
想要使用热点规则的高级选项的话,必须从热点规则处新增,不能通过簇点链路新增。通过下面的配置,就可以实现p1有热点key限制阈值为1,但是如果p1旳值为abc的话阈值就是200、值为qaz的话阈值就是23.
🍸 系统规则配置
上面涉及到的配置都是具体到接口级的,对单个接口的流控、熔断、热点key监控配置,但是Sentinel系统规则配置是针对整个系统而言的监控配置
入口QPS
入口QPS就是对整个系统的请求数进行限制,并不指定接口请求,只要系统内所有请求的请求数到达阈值就会降级
Load自适应
该设置仅对Linux/Unix-like机器生效,系统的 load1作为启发指标,进行自适应系统保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR阶段)。系统容量由系统的 maxQps * minRt估算得出。设定参考值一般是cPu cores * 2.5。
CPU使用率
当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0) ,比较灵敏。
平均RT
当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。
并发线程数
当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。