共计 3457 个字符,预计需要花费 9 分钟才能阅读完成。
1、Sentinel 概述
在微服务架构中,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保证服务的稳定性。
Sentinel 提供了机器发现、健康情况管理、监控(单机和集群)、规则管理和推送等功能。它还提供了一个轻量级的开源控制台(Sentinel Dashboard)。
1.2、Sentinel 特征
-
丰富的应用场景:Sentinel 是阿里巴巴在生产环境中使用的产品,应用在近 10 年来的 ” 双十一 ” 大促流量场景中,实现了秒杀(将突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等功能
-
完备的实时监控:Sentinel 提供了实时监控功能。在控制台中,不仅可以看到接入的单台机器的秒级数据,还可以看到 500 以下规模的集群的运行情况的汇总数据
-
广泛的开源生态:Sentinel 提供了 ” 开箱即用 ” 的、可与其他开源框架 / 库整合的模块,例如:可以与 Spring Cloud、Dubbo、gRPC 进行整合
-
完善的 SPI 扩展点:Sentinel 提供了 SPI(Service Provider Interface 一种服务发现机制)扩展点。它可以快速地定制逻辑,例如定制规则管理、适配数据源等
1.3、Sentinel 核心概念
-
资源:Sentinel 控制和保护的对象即 ” 资源 ”,它是 Sentinel 中一个关键的概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务、应用程序调用的其他应用提供的服务,甚至是通过 Sentinel API 定义的代码
-
规则:有流量控制、熔断降级及系统保护规则,可以动态调整这些规则
-
Context:Sentinel 处理的上下文
-
Node:它统计资源运行时的各种数据。一个 Resource(资源)在同一个 Context 中有且仅有一个 DefaultNode,一个 Resource 全局有且仅有一个 ClusterNode
-
Entry:代表对资源的一次访问。每访问一个资源都会创建一个 Entry
-
ProcessorSlotChain:由各个处理插槽组成的处理插槽链。每个资源在整个服务中对应一个处理插槽链
-
Rule:用户定义的各种规则
-
RuleManager:加载并管理 Rule
-
Slot:插槽。Sentinel 的工作流程就是围绕一个个插槽所组成的插槽链来展开的。每个插槽都有自己的职责,它们各司其职,完美地配置合,通过一定的编排顺序来达到最终限流、降级的目的
2、客户端接入控制台
客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。可以通过 pom.xml 引入 JAR 包
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
3、支持 Zuul
Sentinel 支持 Zuul,但需要额外加上 Sentinel 对网关支持的依赖
<!--Sentinel 的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--Sentinel 对网关支持的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!--Zull 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
4、支持 Spring Cloud Gateway
Sentinel 支持 Spring Cloud Gateway,但需要额外加上 Sentinel 对网关支持的依赖
<!--Sentinel 的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--Sentinel 对网关支持的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<!--Spring Cloud Gateway 的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-gateway</artifactId>
</dependency>
5、支持 Endpoint
在使用 Endpoint(端点)之前,需要在 Maven 中添加 Actuator 依赖,并在配置文件中开启对 Endpoint 的访问支持。
在 Sentinel Endpoint 中暴露的信息有:规则信息、日志目录、当前实例的 IP 地址、Sentinel Dashboard 地址、应用与 Sentinel Dashboard 的心跳频率等。
6、安装和启动 Sentinel
步骤:
1、下载 Sentinel 客户端
https://github.com/alibaba/Sentinel/releases
2、启动控制台
java -jar sentinel-dashboard.jar
3、进入控制台
访问 http://localhost:8080 访问控制台,账号和密码都是 sentinel
7、流控规则
进入控制台后,单击左侧导航栏中的 ” 流控规则 ” 按钮可以新建流控规则
流控规则的参数:
参数名 | 说明 |
---|---|
资源名 | 限流规则的作用对象,如:@SentinelResource 中 Value 字段的值、相对 URI、其他图片文件资源名 |
流控应用 | 流控针对的调用来源(服务级别)。若为 default,则不区分调用来源 |
阀值类型 | QPS(每秒查询率)或线程数 |
单机阀值 | 限流阀值。超过这个值就执行流控规则 |
流控模式 | 直接、关联、链路 |
流控方式 | 直接拒绝、Warm Up、匀速排队 |
7.1、流控模式
基于调用关系的流量控制有 3 种模式:
-
直接:直接对资源本身进行流量控制
-
关联:如果多个资源之间具有资源争抢或者依赖关系,则需要设置关联模式。当关联的资源达到阀值时,会限流某个资源的使用,让出系统资源给关联的资源
-
链路:资源通过调用关系构成一条链路
7.2、流控方式
-
直接拒绝:当 QPS 或线程数超过规则的阀值后,新的请求会被拒绝,抛出 FlowException。这种方式适用于已经知道系统处理能力的情况
-
Warm Up:流量突然增加可能把系统压垮。可以让通过的流量缓慢增加,在一定时间内逐渐增加到阀值上限,给系统一个预热 (Warm Up) 时间,避免系统突然被压垮
-
匀速排列:严格控制请求通过的间隔时间,让请求均速通过。这种方式主要用于处理间隔性突发的流量。如果在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,则可以让这些请求在接下来的空闲期间被逐渐处理,而不是在第一秒直接拒绝多余的请求
8、降级规则
Sentinel 还提供了降级规则来处理流控
重要概念:
-
RT(Response Time):当请求的时间大于阀值时,断路器打开,返回请求失败,直到时间窗口设置的时间结束后才关闭降级。RT 默认上限是 4900ms
-
异常比例:资源接近 1 分钟的异常数目超过阀值后会进行降级。它统计时间窗口是 ” 分钟 ” 级别,所以时间窗口最好大于 60s, 异常比率的阀值范围是[0.0,1.0],代表 0 -100%
9、系统规则
系统保护规则是应用整体维度,而不是资源维度。它仅对入口流量生效。
阀值类型:
-
LOAD:当系统 LOAD(一分钟的负载)超过阀值,且系统当前的并发线程数超过系统容量时才会触发系统保护
-
RT:所有入口流量的平均 RT
-
线程数:所有入口流量的并发线程数
-
QPS:所有入口流量的 QPS