Spring Cloud - Sentinel 流量控制与熔断降级
微服务架构 —— Sentinel 流量控制与熔断降级
1. 核心理论:为什么需要服务容错?
在微服务架构中,服务之间相互调用,形成一个复杂的调用链路。如果链路上的某个服务因为网络延迟、自身负载过高或出现异常而变慢或不可用,那么依赖它的上游服务也会被拖慢,请求会堆积,线程池会被占满。这种故障会像雪球一样在链路上传播,最终导致整个系统瘫痪,这就是“服务雪崩效应”。
服务容错就是为了防止服务雪崩而诞生的一系列保护机制。它通过流量控制、熔断降级、系统负载保护等手段,确保在某个服务出现问题时,能够隔离故障,保护整个系统的稳定性。
Sentinel 是阿里巴巴开源的,面向分布式服务架构的轻量级流量控制、熔断降级库。它功能强大,使用方便,是 Spring Cloud Alibaba 技术栈中保障服务稳定性的核心组件。
2. Sentinel 的核心概念
-
资源 (Resource)
- 资源是 Sentinel 要保护的对象,可以是任何东西:一个方法、一段代码、一个 HTTP 接口等。在我们的应用中,最常见的资源就是一个 Controller 中的 API 端点(例如
/testA)。 - Sentinel 通过包裹资源,对其进行实时的流量统计和监控。
- 资源是 Sentinel 要保护的对象,可以是任何东西:一个方法、一段代码、一个 HTTP 接口等。在我们的应用中,最常见的资源就是一个 Controller 中的 API 端点(例如
-
规则 (Rule)
- 规则是定义如何保护资源的策略。Sentinel 支持多种规则,最核心的是:
- 流量控制规则 (Flow Rule):
- 作用:防止服务被瞬间的大流量冲垮。Sentinel 允许你为资源(如一个 API 接口、一个方法)设置 QPS(每秒请求数)或并发线程数的阈值。
- 原理:当对资源的访问请求超过预设阈值时,Sentinel 会根据配置的策略(如快速失败、排队等待等),拒绝多余的请求。这就像给服务安装了一个“限流阀”,确保其处理能力不被超过。
- 熔断降级规则 (Degrade Rule):
- 作用:防止应用程序不断地尝试调用一个已经故障或响应缓慢的下游服务,从而保护自身资源不被耗尽,避免故障扩散。
- 原理:Sentinel 会实时监控资源的调用情况(如响应时间、异常比例)。当发现某个资源的响应时间过长或异常比例过高,达到预设的阈值时,Sentinel 会像电路中的“保险丝”一样,立即熔断该资源。在熔断期间,所有对该资源的后续调用会立即失败(快速失败),不再真正去调用下游服务,而是直接返回一个预设的降级结果或抛出异常。经过一段时间后,熔断器会进入“半开”状态,尝试放过少量请求,如果成功则恢复,如果失败则再次熔断。
- 系统负载保护规则 (System Rule):
- 作用:从整个应用的层面进行保护,当应用的整体负载(如 Load、CPU 使用率)超过阈值时,会限制所有入口资源的流量,防止应用整体被压垮。
- 原理:Sentinel 不仅关注单个资源的流量,还会监控整个系统的 CPU 使用率、Load 等全局指标。当系统的整体负载超过某个阈值时,Sentinel 会自动限制所有入口资源的流量,以防止系统因过载而完全瘫痪。
- 流量控制规则 (Flow Rule):
- 规则是定义如何保护资源的策略。Sentinel 支持多种规则,最核心的是:
3. Sentinel 的工作模式
Sentinel 主要由两部分组成:
- 核心库 (Java 客户端): 以 JAR 包的形式嵌入到我们的微服务中。它负责定义资源、实时收集监控数据,并根据规则执行流控和降级。
- 控制台 (Dashboard): 一个独立运行的 Web 应用。它负责从客户端拉取监控数据,并提供一个可视化界面,让我们能够实时查看服务状态,并动态地创建和修改保护规则。
这种客户端-控制台分离的架构,使得即使控制台宕机,客户端的容错能力也完全不受影响,保证了其高可用性。
4. Spring Cloud 集成示例 (application.yml)
要将您的 Spring Boot 应用接入 Sentinel,需要在 pom.xml 中引入 spring-cloud-starter-alibaba-sentinel 依赖,并在 application.yml 中进行如下核心配置:
server:
# 应用端口
port: 8083
spring:
application:
# 应用名称,将显示在 Sentinel 控制台中
name: sentinel-service
cloud:
nacos:
discovery:
# Nacos 服务发现地址,用于服务注册
server-addr: 127.0.0.1:8848
sentinel:
transport:
# Sentinel 控制台的地址
dashboard: localhost:8080
# 客户端与控制台通信的端口,默认是 8719,如果端口被占用,会自动向后扫描
# port: 8719
# Sentinel 规则持久化到 Nacos(可选,但推荐)
datasource:
ds1:
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
data-id: ${spring.application.name}-sentinel
group-id: DEFAULT_GROUP
data-type: json
rule-type: flow
核心配置说明:
spring.application.name: 必须配置。这是客户端在 Sentinel 控制台显示的身份标识。spring.cloud.sentinel.transport.dashboard: 核心配置。指向 Sentinel 控制台的地址。配置后,客户端会启动一个心跳任务,定期向控制台发送心跳,并上报资源信息。spring.cloud.sentinel.datasource: 推荐配置。默认情况下,在 Sentinel 控制台配置的规则是存储在内存中的,一旦应用重启就会丢失。通过此配置,可以将规则持久化到 Nacos(或其他配置中心),实现规则的动态管理和持久化。

浙公网安备 33010602011771号