Spring Cloud - Sentinel 流量控制与熔断降级

微服务架构 —— Sentinel 流量控制与熔断降级

1. 核心理论:为什么需要服务容错?

在微服务架构中,服务之间相互调用,形成一个复杂的调用链路。如果链路上的某个服务因为网络延迟、自身负载过高或出现异常而变慢或不可用,那么依赖它的上游服务也会被拖慢,请求会堆积,线程池会被占满。这种故障会像雪球一样在链路上传播,最终导致整个系统瘫痪,这就是“服务雪崩效应”。

服务容错就是为了防止服务雪崩而诞生的一系列保护机制。它通过流量控制、熔断降级、系统负载保护等手段,确保在某个服务出现问题时,能够隔离故障,保护整个系统的稳定性。

Sentinel 是阿里巴巴开源的,面向分布式服务架构的轻量级流量控制、熔断降级库。它功能强大,使用方便,是 Spring Cloud Alibaba 技术栈中保障服务稳定性的核心组件。


2. Sentinel 的核心概念

  • 资源 (Resource)

    • 资源是 Sentinel 要保护的对象,可以是任何东西:一个方法、一段代码、一个 HTTP 接口等。在我们的应用中,最常见的资源就是一个 Controller 中的 API 端点(例如 /testA)。
    • Sentinel 通过包裹资源,对其进行实时的流量统计和监控。
  • 规则 (Rule)

    • 规则是定义如何保护资源的策略。Sentinel 支持多种规则,最核心的是:
      • 流量控制规则 (Flow Rule):
        • 作用:防止服务被瞬间的大流量冲垮。Sentinel 允许你为资源(如一个 API 接口、一个方法)设置 QPS(每秒请求数)或并发线程数的阈值。
        • 原理:当对资源的访问请求超过预设阈值时,Sentinel 会根据配置的策略(如快速失败、排队等待等),拒绝多余的请求。这就像给服务安装了一个“限流阀”,确保其处理能力不被超过。
      • 熔断降级规则 (Degrade Rule):
        • 作用:防止应用程序不断地尝试调用一个已经故障或响应缓慢的下游服务,从而保护自身资源不被耗尽,避免故障扩散。
        • 原理:Sentinel 会实时监控资源的调用情况(如响应时间、异常比例)。当发现某个资源的响应时间过长或异常比例过高,达到预设的阈值时,Sentinel 会像电路中的“保险丝”一样,立即熔断该资源。在熔断期间,所有对该资源的后续调用会立即失败(快速失败),不再真正去调用下游服务,而是直接返回一个预设的降级结果或抛出异常。经过一段时间后,熔断器会进入“半开”状态,尝试放过少量请求,如果成功则恢复,如果失败则再次熔断。
      • 系统负载保护规则 (System Rule):
        • 作用:从整个应用的层面进行保护,当应用的整体负载(如 Load、CPU 使用率)超过阈值时,会限制所有入口资源的流量,防止应用整体被压垮。
        • 原理:Sentinel 不仅关注单个资源的流量,还会监控整个系统的 CPU 使用率、Load 等全局指标。当系统的整体负载超过某个阈值时,Sentinel 会自动限制所有入口资源的流量,以防止系统因过载而完全瘫痪。

3. Sentinel 的工作模式

Sentinel 主要由两部分组成:

  1. 核心库 (Java 客户端): 以 JAR 包的形式嵌入到我们的微服务中。它负责定义资源、实时收集监控数据,并根据规则执行流控和降级。
  2. 控制台 (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(或其他配置中心),实现规则的动态管理和持久化。
posted @ 2026-01-21 16:28  我是刘瘦瘦  阅读(1)  评论(0)    收藏  举报