首页 > 编程笔记

Sentinel组件介绍与使用

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 所示)、来源访问规则和热点参数规则等。
表1 限流控制规则
属  性 说  明 默认值
resource 资源名  
count 限流阈值  
grade 限流类型 QPS模式
limitApp 针对的调用来源 default
strategy 调用关系策略 直接
controlBehavior 流控效果 直接拒绝
clusterMode 是否集群限流

表2 熔断降级规则
属  性 说  明 默认值
resource 资源名  
grade 熔断策略 慢调用比例
count 慢调用临界RT  
timeWindow 熔断时长  
minRequestAmount 熔断触发最小请求数 5
statIntervalMs 统计时长 1000ms
slowRatioThreshold 慢调用比例阈值  

表3 系统保护规则
属  性 说  明 默认值
highestSystemLoad load1触发值 -1
avgRt 所有入口流量平均响应时间 -1
maxThread 入口流量最大并发数 -1
qps 所有入口资源的QPS -1
highestCpuUsage 当前系统的CPU使用率 -1

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

Sentinel的原理

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

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

图4  Sentinel运行图
图4 Sentinel运行图

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

DegradeSlot(熔断策略)主要分为 3 种策略:
  1. 慢调用比例策略是选用这个比例作为阈值,同时需要设置慢调用响应时间,当达到阈值时自动熔断,经过熔断时长后进入探测恢复状态;
  2. 异常比例策略则是按照系统出现异常的比例进行熔断;
  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 控制台登录页面
图5 控制台登录页面

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

图6 控制台管理菜单
图6 控制台管理菜单

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

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

图8 流控规则设置页面
图8 流控规则设置页面

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

图9 降级规则设置
图9 降级规则设置

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

图10 热点规则设置
图10 热点规则设置

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

图11 系统规则设置页面
图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

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

(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

完成以上配置后,重新启动 Nacos 管理后台即可看到配置的 Sentinel 规则数据信息。

优秀文章