前言
Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件。
Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。
1、简介
Sentinel 主要由以下两个部分组成:
- Sentinel 核心库:Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中,同时对 Spring Cloud、Dubbo 等微服务框架提供了很好的支持。
- Sentinel 控制台(Dashboard):Sentinel 提供的一个轻量级的开源控制台,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。
1.1、基本概念
Sentinel 的基本概念有两个,它们分别是:资源和规则。
基本概念 | 描述 |
资源 | 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如由应用程序提供的服务或者是服务里的方法,甚至可以是一段代码。 我们可以通过 Sentinel 提供的 API 来定义一个资源,使其能够被 Sentinel 保护起来。通常情况下,我们可以使用方法名、URL 甚至是服务名来作为资源名来描述某个资源。 |
规则 | 围绕资源而设定的规则。Sentinel 支持流量控制、熔断降级、系统保护、来源访问控制和热点参数等多种规则,所有这些规则都可以动态实时调整。 |
2、Sentinel控制台
下载:https://github.com/alibaba/Sentinel/releases
放到D:盘的sentinel目录里面,并将其启动
java -jar sentinel-dashboard-1.8.5.jar
启动后,访问地址:http://localhost:8080/
用户名和密码:sentinel/sentinel
3、Sentinel开发流程
引进sentinel依赖 -> 定义资源 -> 定义规则 -> 校验规则
3.1、 drp-app-api消费端工程引进依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2021.0.4.0</version> </dependency> <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.8.5</version> </dependency>
3.1.1、yml新加配置(跟nacos同级)
sentinel: transport: #配置 Sentinel dashboard 地址 dashboard: localhost:8080 #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口 port: 8719
3.2、定义资源
- 适配主流框架自动定义资源
- 注解方式定义资源 (推荐)
@SentinelResource(value=“user-userInfoList”)
@SentinelResource(value = "tiger-test",blockHandler = "userInfoListBlockHandler") public List<UserInfo> userInfoList(){ return this.userService.userInfoList(); } public List<UserInfo> userInfoListBlockHandler(BlockException blockException){ log.info("#########################################userInfoListBlockHandler"); return null; }
3.3、定义规则
3.3.1、流量控制
属性 | 说明 | 默认值 |
资源名 | 流控规则的作用对象。 | - |
阈值 | 流控的阈值。 | - |
阈值类型 | 流控阈值的类型,包括 QPS 或并发线程数。 | QPS |
针对来源 | 流控针对的调用来源。 | default,表示不区分调用来源 |
流控模式 | 调用关系限流策略,包括直接、链路和关联。 | 直接 |
流控效果 | 流控效果(直接拒绝、Warm Up、匀速排队),不支持按调用关系限流。 | 直接拒绝 |
3.3.2、流控模式
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
- 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
使用场景:
a、两个有竞争关系的资源
b、一个优先级较高,一个优先级较低
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
例如有两条请求链路: - /test1 --> /common
- /test2 --> /common
说明:Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:
spring: cloud: sentinel: web-context-unify: false # 关闭context整合
3.3.3、流控效果
快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。
排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长
当请求超过QPS阈值时,快速失败和warm up
会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。
例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout =
2000,意味着预期等待超过2000ms的请求会被拒绝并抛出异常
打开命令行窗口,执行以下命令查看资源的实时统计信息。
curl http://localhost:8719/cnode?id=userInfolist
idx id thread pass blocked success total aRt 1m-pass 1m-block 1m-all exceptio 2 userInfoList 0 0.0 0.0 0.0 0.0 0.0 10 16 26 0.0
实时统计信息各列名说明如下:
- thread: 代表当前处理该资源的并发数;
- pass: 代表一秒内到来到的请求;
- blocked: 代表一秒内被流量控制的请求数量;
- success: 代表一秒内成功处理完的请求;
- total: 代表到一秒内到来的请求以及被阻止的请求总和;
- RT: 代表一秒内该资源的平均响应时间;
- 1m-pass: 则是一分钟内到来的请求;
- 1m-block: 则是一分钟内被阻止的请求;
- 1m-all: 则是一分钟内到来的请求和被阻止的请求的总和;
- exception: 则是一秒内业务本身异常的总和
3.3.4、熔断降级
Sentinel 的熔断将机制会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),暂时切断对这个资源的调用,以避免局部不稳定因素导致整个系统的雪崩。
Sentinel 提供了 3 种熔断策略
熔断策略 | 说明 |
慢调用比例(SLOW_REQUEST_RATIO) | |
异常比例 (ERROR_RATIO) | 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目且异常的比例大于阈值,则在接下来的熔断时长内请求会自动被熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。 |
异常数 (ERROR_COUNT) | 当单位统计时长内的异常数目超过阈值之后会自动进行熔断。 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。 |
状态 | 说明 | 触发条件 |
熔断关闭状态(CLOSED) | 处于关闭状态时,请求可以正常调用资源。 | 满足以下任意条件,Sentinel 熔断器进入熔断关闭状态:
|
熔断开启状态 (OPEN) | 处于熔断开启状态时,熔断器会一定的时间(规定的熔断时长)内,暂时切断所有请求对该资源的调用,并调用相应的降级逻辑使请求快速失败避免系统崩溃。 | 满足以下任意条件,Sentinel 熔断器进入熔断开启状态:
|
探测恢复状态(HALF-OPEN) | 处于探测恢复状态时,Sentinel 熔断器会允许一个请求调用资源。则若接下来的一个请求成功完成(没有错误)则结束熔断,熔断器进入熔断关闭(CLOSED)状态;否则会再次被熔断,熔断器进入熔断开启(OPEN)状态。 | 在熔断开启一段时间(降级窗口时间或熔断时长,单位为 s)后,Sentinel 熔断器自动会进入探测恢复状态。 |
Sentinel 熔断规则属性
属性 | 说明 | 默认值 | 使用范围 |
资源名 | 规则的作用对象。 | - | 所有熔断策略 |
熔断策略 | Sentinel 支持3 中熔断策略:慢调用比例、异常比例、异常数策略。 | 慢调用比例 | 所有熔断策略 |
最大 RT | 请求的最大相应时间,请求的响应时间大于该值则统计为慢调用。 | - | 慢调用比例 |
熔断时长 | 熔断开启状态持续的时间,超过该时间熔断器会切换为探测恢复状态(HALF-OPEN),单位为 s。 | - | 所有熔断策略 |
最小请求数 | 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)。 | 5 | 所有熔断策略 |
统计时长 | 熔断触发需要统计的时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)。 | 1000 ms | 所有熔断策略 |
比例阈值 | 分为慢调用比例阈值和异常比例阈值,即慢调用或异常调用占所有请求的百分比,取值范围 [0.0,1.0]。 | - | 慢调用比例 、异常比例 |
异常数 | 请求或调用发生的异常的数量。 | - | 异常数 |
3.3.5、通过Nacos配置规则
[ { "resource": "tiger-test", "limitApp": "default", "grade": 1, "count": 5, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ]
limitApp:来源应用;
- 流控规则
- 熔断规则
(注:没有RT这个参数哈)
[ { "resource": "user-userInfoList", "grade": 0, "limitApp": "default", "count":2000, "slowRatioThreshold": 0.6, "timeWindow": 60, "minRequestAmount": 5, "statIntervalMs":8000, "clusterMode": false } ]
工程配置读取nacos的限流规则(跟sentinel同级)
datasource: ds: nacos: server-addr: localhost:8848 data-id: user-sentinel group-id: DEFAULT_GROUP rule-type: flow
/** * flow. */ FLOW("flow", FlowRule.class), /** * degrade. */ DEGRADE("degrade", DegradeRule.class), /** * param flow. */ PARAM_FLOW("param-flow", ParamFlowRule.class), /** * system. */ SYSTEM("system", SystemRule.class), /** * authority. */ AUTHORITY("authority", AuthorityRule.class),
配置多个nacos配置文件
datasource: ds1: nacos: server-addr: localhost:8848 data-id: user-sentinel-flow group-id: DEFAULT_GROUP rule-type: flow ds2: nacos: server-addr: localhost:8848 data-id: user-sentinel-degrade group-id: DEFAULT_GROUP rule-type: degrade