返回介绍

6.3 Sentinel 组件

发布于 2025-04-21 20:58:45 字数 6210 浏览 0 评论 0 收藏

Sentinel 是阿里巴巴公司开源的一套面向分布式服务架构的限流和熔断组件,其以流量为切入点,可以为微服务提供流量控制、熔断降级和系统负载保护等功能,使微服务更稳定、更有保障。

6.3.1 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 的方式。定义规则可分为限流控制规则(如表 6.3 所示)、熔断降级规则(如表 6.4 所示)、系统保护规则(如表 6.5 所示)、来源访问规则和热点参数规则等。

表 6.3 限流控制规则

111-1

表 6.4 熔断降级规则

111-2

表 6.5 系统保护规则

111-3

规则制定后,可以配合 Nacos 进行持久化,Sentinel 提供了统一的 API 进行规则查询。总的来说,Sentinel 具有以下特性:

  • 广泛的实战演练,多次承接阿里巴巴“双十一”大促销的流量场景。
  • 提供了控制面板,可提供完善的实时监控功能。
  • 开源生态,与流行框架容易整合。
  • slot 自定义扩展。

6.3.2 Sentinel 的原理

Sentinel 的主要工作流程是对每一个资源(Resource)创建一个 Entry 对象,并且在创建 Entry 对象的同时创建一系列的插槽(Slot)。不同的插槽有不同的功能。各个插槽的功能如下:

  • NodeSelectorSlot:通过收集资源路径,将调用路径以树状结构存储起来,然后根据调用路径进行限流降级。
  • ClusterBuilderSlot:存储资源的统计信息及调用者信息,主要包括该资源的 RT、QPS 和并发线程数等,这些信息将作为限流和降级的依据。
  • StatisticSlot:统计运行时指标的监控信息。
  • FlowSlot:根据制定的限流规则及前面的 Slot 统计的信息进行限流。
  • AuthoritySlot:根据配置的黑白名单和调用来源信息进行黑白名单控制。
  • DegradeSlot:根据制定的降级规则和统计信息进行熔断降级。
  • SystemSlot:通过系统的状态控制总的入口流量。

如图 6.6 所示为 Sentinel 的总体运行流程。同时 Sentinel 还支持自定义 Slot,灵活指定执行顺序,对 Slot Chain 进行扩展。

113-1

图 6.6 Sentinel 运行图

FlowSlot(流量控制)主要通过 QPS/并发线程数进行限流。对于 QPS 限流,当请求超过某个阈值时则进行流量控制,主要包括直接拒绝、Warm Up 和匀速排队 3 种方式。直接拒绝方式会抛出 FlowException 异常;Warm Up 是预热/冷启动方式,通过该种方式可以让流量缓慢地增加,最终达到阈值上限,给系统一个预热时间,避免被流量压垮;匀速排队方式是控制请求的时间间隔,让请求匀速地通过,也就是漏桶算法。

DegradeSlot(熔断策略)主要分为慢调用比例策略、异常比例策略和异常数策略。慢调用比例策略是选用这个比例作为阈值,同时需要设置慢调用响应时间,当达到阈值时自动熔断,经过熔断时长后进入探测恢复状态;异常比例策略则是按照系统出现异常的比例进行熔断;异常数策略是直接统计异常数量,当超过阈值时进行熔断。

6.3.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 即可看到登录页面,如图 6.7 所示。默认的用户名与密码都是 sentinel。

114-1

图 6.7 控制台登录页面

登录之后,进入某个应用可以看到管理菜单,如图 6.8 所示。

114-2

图 6.8 控制台管理菜单

选择“实时监控”选项可以看到资源的 QPS 监控页面,如图 6.9 所示。

115-1

图 6.9 实时监控页面

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

115-2

图 6.10 流控规则设置页面

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

116-1

图 6.11 降级规则设置

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

116-2

图 6.12 热点规则设置

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

117-1

图 6.13 系统规则设置页面

“集群流控”选项可以设置整个集群的流控规则,“机器列表”选项提供了服务发现功能,可以监控注册机器的健康状态。

6.3.4 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

(3)使用注解 @SentinelResource 定义资源,提供可选的异常处理与 fallback 配置。@SentinelResource 注解包含以下属性:

  • value:资源名。
  • entryType:entry 类型。
  • blockHandler/blockHandlerClass:限流类与方法。限流方法需要与资源方法参数相同且增加 BlockException 参数。
  • fallback/fallbackClass:熔断类与方法。熔断方法需要增加 Throwable 参数。

(4)配置 SentinelResourceAspect 类,代码如下:

//声明 Sentinel 切面
@Configuration
public class SentinelConfig {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。