一、Sentinel 基础概念与服务雪崩背景

(一)服务雪崩现象剖析

服务雪崩是微服务架构中的严重问题:当某服务因高并发不堪重负,其依赖链上的其他服务会受波及,影响层层传递,最终导致大量服务瘫痪。

服务不可用的核心原因包括:

  1. 程序 Bug:隐藏错误在特定场景(输入、环境、业务)下触发,导致服务异常。
  2. 高并发冲击:突发请求远超服务器承载能力,资源被耗尽,无法及时处理请求。
  3. 硬件故障:服务器硬件老化、损坏等物理问题,直接导致服务停运。
  4. 缓存击穿:热点数据缓存过期瞬间,大量请求穿透缓存直达后端,造成服务压力激增。

(二)服务雪崩解决方案概述

应对服务雪崩的常见方案有四类:

  1. 超时机制:为服务调用设超时时间,超时未响应则返回默认结果(如 false),避免调用方长时间等待。
  2. 服务限流:限制单位时间内通过的请求数,拦截超额流量并返回“服务繁忙”提示,保护服务不被压垮。
  3. 资源隔离:划分独立资源池(线程池、数据库连接等)给不同服务/模块,某资源池耗尽不影响其他服务。
  4. 熔断降级:若被调用服务频繁错误或崩溃,直接返回默认结果,防止影响在服务链蔓延。

(三)微服务流量治理技术选型对比

微服务流量治理中,Hystrix 与 Sentinel 是主流选择,核心差异如下:

  1. Hystrix:核心聚焦“隔断+资源隔离+熔断”,提供 fallback 机制,服务异常时执行备用逻辑,保障基础可用性。
  2. Sentinel:功能更全面,除流量控制、熔断降级外,还支持系统负载保护、实时监控,且有控制台支持规则动态调整,灵活性更强。

二、Sentinel 核心概念与使用方式

(一)Sentinel 核心概念详解

  1. 资源:经 Sentinel AOP 增强的代码接口(如微服务业务方法),是 Sentinel 监控和控制的核心对象。
  2. 规则:围绕资源设定的控制策略,用于实现限流、降级等功能,支持在控制台实时动态调整,适配业务和系统变化。

(二)Sentinel 使用方式对比

  1. 原生使用:需引入多依赖,通过代码手动定义资源、规则,并在 post constructor 注入。弊端是业务代码与 Sentinel 配置耦合,可维护性差。
  2. 灵活使用:微服务推荐方式,引入切面依赖后,通过配置函数、配置类或 YAML 文件配置,实现业务代码与配置逻辑分离,结构清晰易维护。

三、Sentinel 在微服务中的具体应用

(一)常用处理机制

  1. block 流控异常处理:触发流控规则时,通过自定义逻辑返回友好提示(如“当前请求受限,请稍后重试”),提升用户体验。
  2. fallback 熔断降级函数:服务熔断时自动调用,返回备用结果,确保系统在部分服务不可用的情况下仍能提供基础功能。

(二)与 Sentinel 控制台交互

  1. 注册流程:微服务 API 被调用时,Sentinel 读取 IP、端口等配置,在 HandlerInterceptor 预处理阶段,将客户端请求信息注册到 Sentinel Dashboard。
  2. 提示优化:默认提示为 Sentinel 配置信息,可通过实现 block interceptor handler 或熔断 interceptor handler,自定义提示内容,适配业务需求。

(三)使用过程中的坑点及解决办法

核心坑点:服务重启后,控制台手动配置的规则会丢失,导致流量控制/熔断策略失效。
解决方案:规则持久化,如结合 Nacos 配置中心,将规则存储在 Nacos,服务启动时从 Nacos 加载规则,避免规则丢失。

(四)微服务调用控制维度

Sentinel 支持从两个维度对微服务调用进行熔断/限流:

  1. 微服务整体维度:针对整个服务(如“order”服务)设规则,例:限制单位时间内“order”服务的总请求数,或错误率达阈值时熔断。
  2. 接口维度:针对服务下的具体接口(如“order”服务的下单接口)设独立规则,例:给下单接口设更高限流阈值,保障核心业务稳定性。

(五)与 Spring Cloud 的整合要点及 YAML 配置示例

1. OpenFeign 支持

需在 application.yml 中开启 OpenFeign 支持,并配置 fallback factory:

1
2
3
4
5
6
7
feign:
sentinel:
enabled: true # 开启 Sentinel 对 OpenFeign 的支持
client:
config:
default:
fallbackFactory: com.example.CustomFeignFallbackFactory # 配置自定义 fallback factory 类

2. 流控规则持久化

引入 Nacos 数据源依赖(Maven),并在 application.yml 配置 Nacos 数据源:

  • 依赖引入:
    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
  • YAML 配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    spring:
    cloud:
    sentinel:
    datasource:
    flow: # 流控规则数据源
    nacos:
    server-addr: localhost:8848 # Nacos 服务器地址
    dataId: ${spring.application.name}-sentinel-flow # 规则数据 ID(结合服务名命名)
    groupId: DEFAULT_GROUP # 分组
    data-type: json # 数据格式
    rule-type: flow # 规则类型(流控)