Sentinel组件介绍与使用
Sentinel组件简介
Sentinel 诞生于 2012 年,当时主要用于入口流量控制。经过几年的发展及其在阿里巴巴集团内部的生产实践,Sentinel 基本上已经覆盖了阿里巴巴内部的所有核心业务场景。2018 年,Sentinel 进行了开源,2019 年推出了 C++ 版本,2020 年推出了 Go 语言版本。在 Sentinel 中有两个基本概念:资源和限流规则。其中,资源是最关键的,Sentinel 最终要保护的就是资源。资源可以是应用程序中的任何内容,如由应用程序提供的接口,或由应用程序调用的其他第三方提供的服务,也可以是一段代码或一个方法等。
规则可以包括限流的规则、熔断降级的规则及系统保护规则,所有规则可以在管理界面动态并实时地调整。
Sentinel 提供的功能如下:
1. 流量控制
一个服务处理请求的能力是有限制的,但是请求到来的时间是随机的。Sentinel 根据系统的处理能力,通过灵活组合资源调用关系、系统运行指标(QPS、线程池、系统负载)及控制的效果(直接限流、Warm Up 和排队),达到对流量控制的目的。2. 熔断降级
微服务调用关系复杂,如果某一个链路中的依赖资源出现不稳定的情况,有可能会引发级联故障。Sentinel 与 Hystrix 的熔断原则基本上是一样的,即在链路中某个请求响应时间过长或异常比例上升时,就需要对这个资源进行熔断,让请求快速失败,避免导致级联故障。Sentinel 通过两种手段进行熔断处理,第一种是控制并发线程数,当线程数在特定资源上堆积到一定数量后,则直接拒绝新的请求;第二种是通过响应时间进行降级,当依赖的资源出现响应时间过长时,则拒绝对资源的访问。
3. 系统自适应保护
Sentinel 同时提供系统维度的自适应保护能力。当应用服务负载较高的时候,如果还有请求进入,可能会导致系统崩溃,无法响应。针对这种情况,Sentinel提供了响应的保护机制,让系统的入口流量和负载达到平衡,保证系统在能力范围之内处理最多的请求。为了减少开发的复杂度,Sentinel 对当前主流框架如 Spring Boot、Spring Cloud 和 Spring WebFlux 等都做了适配,可以很方便地整合。
Sentinel 主要包括核心库与管理后台。核心库可以单独依赖,但是配合管理后台效果更佳。在使用 Sentinel 时,需要定义资源,Sentinel 提供了定义资源的很多方式,在与 Spring Boot 结合时,采用了注解 @SentinelResource 的方式。
定义规则可分为限流控制规则(如表 1 所示)、熔断降级规则(如表 2 所示)、系统保护规则(如表 3 所示)、来源访问规则和热点参数规则等。
属 性 | 说 明 | 默认值 |
---|---|---|
resource | 资源名 | |
count | 限流阈值 | |
grade | 限流类型 | QPS模式 |
limitApp | 针对的调用来源 | default |
strategy | 调用关系策略 | 直接 |
controlBehavior | 流控效果 | 直接拒绝 |
clusterMode | 是否集群限流 | 否 |
属 性 | 说 明 | 默认值 |
---|---|---|
resource | 资源名 | |
grade | 熔断策略 | 慢调用比例 |
count | 慢调用临界RT | |
timeWindow | 熔断时长 | |
minRequestAmount | 熔断触发最小请求数 | 5 |
statIntervalMs | 统计时长 | 1000ms |
slowRatioThreshold | 慢调用比例阈值 |
属 性 | 说 明 | 默认值 |
---|---|---|
highestSystemLoad | load1触发值 | -1 |
avgRt | 所有入口流量平均响应时间 | -1 |
maxThread | 入口流量最大并发数 | -1 |
qps | 所有入口资源的QPS | -1 |
highestCpuUsage | 当前系统的CPU使用率 | -1 |
规则制定后,可以配合Nacos进行持久化,Sentinel提供了统一的API进行规则查询。总的来说,Sentinel具有以下特性:
- 广泛的实战演练,多次承接阿里巴巴“双十一”大促销的流量场景。
- 提供了控制面板,可提供完善的实时监控功能。
- 开源生态,与流行框架容易整合。
- slot自定义扩展。
Sentinel的原理
Sentinel的主要工作流程是对每一个资源(Resource)创建一个 Entry 对象,并且在创建 Entry 对象的同时创建一系列的插槽(Slot)。不同的插槽有不同的功能。各个插槽的功能如下:- NodeSelectorSlot:通过收集资源路径,将调用路径以树状结构存储起来,然后根据调用路径进行限流降级。
- ClusterBuilderSlot:存储资源的统计信息及调用者信息,主要包括该资源的 RT、QPS 和并发线程数等,这些信息将作为限流和降级的依据。
- StatisticSlot:统计运行时指标的监控信息。
- FlowSlot:根据制定的限流规则及前面的 Slot 统计的信息进行限流。
- AuthoritySlot:根据配置的黑白名单和调用来源信息进行黑白名单控制。
- DegradeSlot:根据制定的降级规则和统计信息进行熔断降级。
- SystemSlot:通过系统的状态控制总的入口流量。
如图 4 所示为 Sentinel 的总体运行流程。同时 Sentinel 还支持自定义 Slot,灵活指定执行顺序,对 Slot Chain 进行扩展。

图4 Sentinel运行图
FlowSlot(流量控制)主要通过 QPS/ 并发线程数进行限流。对于 QPS 限流,当请求超过某个阈值时则进行流量控制,主要包括 3 种方式:
- 直接拒绝方式会抛出 FlowException 异常;
- Warm Up 是预热/冷启动方式,通过该种方式可以让流量缓慢地增加,最终达到阈值上限,给系统一个预热时间,避免被流量压垮;
- 匀速排队方式是控制请求的时间间隔,让请求匀速地通过,也就是漏桶算法。
DegradeSlot(熔断策略)主要分为 3 种策略:
- 慢调用比例策略是选用这个比例作为阈值,同时需要设置慢调用响应时间,当达到阈值时自动熔断,经过熔断时长后进入探测恢复状态;
- 异常比例策略则是按照系统出现异常的比例进行熔断;
- 异常数策略是直接统计异常数量,当超过阈值时进行熔断。
快速搭建Sentinel Dashboard
Sentinel 为使用者提供了开源控制台,主要功能如下:- 登录鉴权;
- 规则管理与发布;
- 监控应用信息;
- 查看机器列表与健康状态。
搭建控制台时要先获取控制台的 GitHub 工程或下载最新的 JAR 包,启动命令如下:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
启动后访问 http://localhost:8080 即可看到登录页面,如图 5 所示。默认的用户名与密码都是 sentinel 。
图5 控制台登录页面
登录之后,进入某个应用可以看到管理菜单,如图 6 所示。

图6 控制台管理菜单
选择“实时监控”选项可以看到资源的 QPS 监控页面,如图 7 所示。

图7 实时监控页面
选择“簇点链路”选项可以看到资源链路信息及最主要的几个规则设置,如流控规则、降级规则、热点规则和系统规则。其中,流控规则设置页面如图 8 所示。阈值类型可以选择 QPS 或线程数,然后设置阈值,流控效果可以选择快速失败、Warm Up或排队等待。

图8 流控规则设置页面
“降级规则”设置页面如图 9 所示。其中,降级策略可以选择 RT、异常比例或异常数,然后设置时间窗口。

图9 降级规则设置
“热点规则”设置页面如图 10 所示。在其中可以对某些热点参数进行限流控制,或者通过添加参数属性进行限流控制。

图10 热点规则设置
“系统规则”设置页面如图 11 所示。首先选择阈值类型,如 LOAD、RT、线程数、入口 QPS 和 CPU 使用率,然后设置阈值进行系统自适应保护。

图11 系统规则设置页面
“集群流控”选项可以设置整个集群的流控规则,“机器列表”选项提供了服务发现功能,可以监控注册机器的健康状态。
Spring Boot集成Sentinel
Sentinel 提供了对 Spring Cloud 的整合,使用起来非常方便。(1)在 pom.xml 文件中添加对 Sentinel 的依赖,具体如下:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>(2)新建 bootstrap.yml 配置文件,配置 Sentinel 控制台,代码如下:
spring:
cloud:
sentinel:
enabled: true
transport:
dashboard: localhost:8080
- value:资源名。
- entryType:entry类型。
- blockHandler/blockHandlerClass:限流类与方法。限流方法需要与资源方法参数相同且增加 BlockException 参数。
- fallback/fallbackClass:熔断类与方法。熔断方法需要增加 Throwable 参数。
(4)配置 SentinelResourceAspect 类,代码如下:
//声明Sentinel切面 @Configuration public class SentinelConfig { @Bean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); } }
Nacos集成Sentinel配置
Sentinel 的配置规则都是存储到内存中,并没有持久化,因此需要提供一个持久化的解决方案。通过和 Nacos 整合可以将 Sentinel 配置规则推送到 Nacos上进行存储。具体步骤如下:(1)在应用中添加依赖包 sentinel-datasource-nacos,具体代码如下:
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency>(2)在配置文件中添加 Nacos 属性配置,具体代码如下:
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: test-flow-rules
groupId: test
rule-type: flow
degrade:
nacos:
server-addr: 127.0.0.1:8848
dataId: test-degrade-rules
groupId: test
rule-type: degrade
system:
nacos:
server-addr: 127.0.0.1:8848
dataId: test-system-rules
groupId: test
rule-type: system
authority:
nacos:
server-addr: 127.0.0.1:8848
dataId: test-authority-rules
groupId: test
rule-type: authority
param-flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: test-param-flow-rules
groupId: test
rule-type: param-flow
声明:《Java系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。