Skip to content

Sentinel 学习指南

导航目录

一、Sentinel 概述

1.1 什么是 Sentinel

Sentinel 是阿里开源的流量治理组件,主要用于保障微服务的稳定性。

它重点解决这些问题:

  • 接口流量过大
  • 某个下游服务响应过慢
  • 异常比例过高
  • 热点参数被频繁访问
  • 系统负载过高

重点:Sentinel 的核心目标不是“提高性能”,而是“保护系统稳定性”。

1.2 Sentinel 能做什么

  • 流量控制
  • 熔断降级
  • 热点参数限流
  • 系统自适应保护
  • 授权规则控制

1.3 Sentinel 和 Hystrix 的区别

对比项SentinelHystrix
主要能力流控 + 熔断 + 热点规则熔断降级
控制台支持一般
动态规则支持一般
生态整合Spring Cloud Alibaba 更强已逐渐淡出

1.4 Sentinel 在微服务中的位置

text
客户端 -> Gateway -> order-service -> user-service / pay-service

                 Sentinel

Sentinel 可以保护:

  • 网关入口流量
  • 服务提供者接口
  • OpenFeign 远程调用

二、为什么需要 Sentinel

2.1 没有保护机制会怎样

在高并发场景下,如果不做保护,常见后果有:

  • 某个接口被打爆
  • 下游服务超时拖垮上游
  • 线程堆积,整体雪崩
  • 热点接口占满资源

2.2 什么是服务雪崩

例如:

  1. order-service 调用 user-service
  2. user-service 响应越来越慢
  3. order-service 大量线程被阻塞
  4. 上游服务也逐步不可用

这就是典型的雪崩效应。

2.3 Sentinel 的核心价值

  • 保护自己
  • 快速失败
  • 避免故障扩散
  • 提升系统可用性

三、Sentinel 核心概念

3.1 资源

Sentinel 保护的对象叫“资源”,可以是:

  • Controller 接口
  • Service 方法
  • OpenFeign 调用
  • 网关路由

3.2 规则

规则决定如何保护资源。

常见规则:

  • 流控规则
  • 降级规则
  • 热点规则
  • 系统规则
  • 授权规则

3.3 Sentinel 规则总览

规则类型主要作用常见使用场景
流控规则控制访问速率防止接口被打爆
降级规则熔断和降级下游超时、异常率过高
热点规则限制热点参数秒杀商品、热门资源
系统规则从系统维度保护CPU、Load、线程数过高
授权规则控制来源访问黑白名单、来源隔离

3.4 流控

限制资源访问速率,避免流量过大。

3.5 降级

当资源慢调用比例、异常比例或异常数过高时,触发熔断降级。

3.6 blockHandler 和 fallback

二者容易混淆:

  • blockHandlerSentinel 规则触发时执行
  • fallback业务方法本身抛异常时执行

重点:blockHandlerfallback 是 Sentinel 的高频面试点。

3.7 @SentinelResource

@SentinelResource 可以把方法声明成一个可被 Sentinel 管理的资源。

四、Sentinel 环境搭建与控制台

4.1 引入依赖

xml
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <!-- Sentinel 核心依赖 -->
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

4.2 应用配置

yaml
spring:
  application:
    # 当前服务名
    name: order-service
  cloud:
    sentinel:
      transport:
        # Sentinel 控制台地址
        dashboard: 127.0.0.1:8080
      # 应用启动时提前初始化 Sentinel 连接
      eager: true

4.3 启动 Sentinel 控制台

bash
# 启动 Sentinel 控制台,默认端口 8080
java -jar sentinel-dashboard-1.8.8.jar

4.4 控制台使用步骤

  1. 启动 Sentinel 控制台
  2. 启动接入 Sentinel 的微服务
  3. 访问服务接口,触发资源上报
  4. 在控制台配置流控、熔断、热点等规则

4.5 控制台常用功能

  • 查看实时簇点链路
  • 配置流控规则
  • 配置降级规则
  • 配置热点规则
  • 查看机器列表

五、服务限流

5.1 什么是限流

限流就是限制单位时间内允许通过的请求数量。

目的:

  • 保护系统
  • 防止流量突增打垮服务

5.2 流控阈值类型

Sentinel 流控规则里常见两种阈值类型:

5.2.1 QPS 模式

  • 按每秒请求数限制流量
  • 更适合 Web 接口场景

5.2.2 线程数模式

  • 按并发线程数限制流量
  • 更适合方法调用或资源执行耗时较长的场景

5.3 Controller 接口限流示例

java
@RestController
@RequestMapping("/sentinel")
public class SentinelController {

    @GetMapping("/test")
    @SentinelResource(value = "testResource", blockHandler = "blockHandler")
    public String test() {
        return "success";
    }

    // 当触发限流规则时,执行该方法
    public String blockHandler(BlockException ex) {
        return "当前请求被限流";
    }
}

5.4 自定义限流兜底类

如果不想把兜底方法写在当前类中,也可以抽到单独类里。

java
public class SentinelBlockHandler {

    public static String handleTest(BlockException ex) {
        return "请求过于频繁,请稍后再试";
    }
}
java
@RestController
@RequestMapping("/sentinel")
public class SentinelController {

    @GetMapping("/test2")
    @SentinelResource(
            value = "testResource2",
            blockHandlerClass = SentinelBlockHandler.class,
            blockHandler = "handleTest"
    )
    public String test2() {
        return "success";
    }
}

5.5 流控模式

5.5.1 直接模式

  • 直接限制当前资源

5.5.2 关联模式

  • 关联另一个资源,当关联资源压力过大时限制当前资源

5.5.3 链路模式

  • 针对特定调用链路做限流

5.6 流控模式举例

5.6.1 直接模式举例

例如接口 /order/create 的 QPS 最大只能 10。

5.6.2 关联模式举例

例如当 /pay/submit 压力过大时,限制 /order/create,避免核心支付链路被拖慢。

5.6.3 链路模式举例

例如同一个 queryUser() 方法同时被 A 接口和 B 接口调用,只限制来自 A 接口的链路流量。

5.7 流控效果

常见效果:

  • 快速失败
  • Warm Up
  • 匀速排队

5.7.1 快速失败

  • 默认模式
  • 超过阈值立即拒绝请求

5.7.2 Warm Up

  • 冷启动预热
  • 系统刚启动时不会立刻放开全部流量

5.7.3 匀速排队

  • 请求以匀速通过
  • 适合削峰填谷场景

5.8 流控模式总表

维度模式
阈值类型QPS、线程数
流控模式直接、关联、链路
流控效果快速失败、Warm Up、匀速排队

5.9 限流学习重点

  1. QPS 限流
  2. 线程数限流
  3. 直接 / 关联 / 链路模式
  4. 快速失败 / Warm Up / 匀速排队

六、熔断与降级

6.1 为什么需要熔断降级

当下游服务异常或响应变慢时,如果继续大量请求,只会让系统更糟。

熔断降级的目标是:

  • 快速失败
  • 返回兜底结果
  • 给系统恢复时间

6.2 Sentinel 支持的降级策略

6.2.1 慢调用比例

  • 当接口响应时间持续过长时触发熔断

6.2.2 异常比例

  • 当异常比例过高时触发熔断

6.2.3 异常数

  • 当异常总数超过阈值时触发熔断

6.3 降级策略说明

6.3.1 慢调用比例模式

  • 当请求 RT 超过设定阈值
  • 且慢调用比例达到设定值
  • 触发熔断

6.3.2 异常比例模式

  • 当单位时间内异常比例过高
  • 触发熔断

6.3.3 异常数模式

  • 当单位时间内异常总数达到阈值
  • 触发熔断

6.4 熔断状态说明

Sentinel 熔断过程可以理解为:

  • 关闭状态:正常通过
  • 打开状态:触发熔断,快速失败
  • 半开状态:探测恢复情况

重点:熔断不是永久拒绝,而是给系统恢复的时间窗口。

6.5 fallback 示例

java
@RestController
@RequestMapping("/degrade")
public class DegradeController {

    @GetMapping("/test/{id}")
    @SentinelResource(
            value = "degradeTest",
            blockHandler = "blockHandler",
            fallback = "fallbackHandler"
    )
    public String test(@PathVariable Long id) {
        if (id < 0) {
            throw new IllegalArgumentException("id 不能小于 0");
        }
        return "query success, id = " + id;
    }

    // Sentinel 规则触发时走这里
    public String blockHandler(Long id, BlockException ex) {
        return "当前请求被限流或熔断";
    }

    // 业务异常时走这里
    public String fallbackHandler(Long id, Throwable ex) {
        return "业务异常,执行 fallback";
    }
}

6.6 fallbackClass 示例

java
public class SentinelFallbackHandler {

    public static String handleFallback(Long id, Throwable ex) {
        return "统一 fallback 处理,id = " + id;
    }
}
java
@RestController
@RequestMapping("/degrade")
public class DegradeController {

    @GetMapping("/test2/{id}")
    @SentinelResource(
            value = "degradeTest2",
            fallbackClass = SentinelFallbackHandler.class,
            fallback = "handleFallback"
    )
    public String test2(@PathVariable Long id) {
        if (id < 0) {
            throw new IllegalArgumentException("参数非法");
        }
        return "success";
    }
}

6.7 降级模式总表

模式触发条件适合场景
慢调用比例RT 高且比例超阈值下游响应慢
异常比例异常请求占比过高稳定性差
异常数异常次数超过阈值短时间故障集中爆发

6.8 熔断降级学习重点

  1. 慢调用比例
  2. 异常比例
  3. 异常数
  4. blockHandler 和 fallback
  5. 兜底方法抽离

七、热点参数限流与系统规则

7.1 什么是热点参数限流

某些参数值会特别热门,例如:

  • 商品详情页中的某个热门商品 ID
  • 秒杀接口中的某个活动 ID

如果这些参数被大量访问,就可能压垮系统。

7.2 热点参数示例

java
@RestController
@RequestMapping("/hot")
public class HotParamController {

    @GetMapping("/test")
    @SentinelResource(value = "hotTest", blockHandler = "hotBlockHandler")
    public String test(@RequestParam(required = false) String type,
                       @RequestParam(required = false) String id) {
        return "hot param success";
    }

    public String hotBlockHandler(String type, String id, BlockException ex) {
        return "热点参数限流";
    }
}

7.3 热点参数高级用法

热点参数规则还支持对“某个具体参数值”做单独限制。

例如:

  • 普通 id 参数 QPS 上限是 10
  • id=1001 的 QPS 上限单独设置为 2

这非常适合:

  • 秒杀商品
  • 热门活动
  • 热门用户

7.4 系统规则

Sentinel 还支持系统级保护:

  • Load 自适应
  • CPU 使用率
  • 平均 RT
  • 入口 QPS
  • 并发线程数

7.4.1 Load 模式

  • 当系统 Load1 超过阈值时触发保护

7.4.2 CPU 使用率模式

  • 当 CPU 使用率过高时触发保护

7.4.3 平均 RT 模式

  • 当整体平均响应时间过高时触发保护

7.4.4 入口 QPS 模式

  • 当系统整体入口流量过高时触发保护

7.4.5 并发线程数模式

  • 当系统并发线程数过高时触发保护

7.5 授权规则

授权规则可以做来源控制,例如:

  • 黑名单
  • 白名单

7.5.1 白名单模式

  • 只允许指定来源访问

7.5.2 黑名单模式

  • 拒绝指定来源访问

7.6 来源解析器示例

授权规则通常需要配合来源解析器使用。

java
@Component
public class RequestOriginParserDefinition implements RequestOriginParser {

    @Override
    public String parseOrigin(HttpServletRequest request) {
        // 从请求头中解析调用来源,例如 gateway、app、admin
        String origin = request.getHeader("origin-app");
        return origin == null ? "blank" : origin;
    }
}

7.7 热点、系统、授权模式总表

规则类型模式
热点参数规则普通参数限流、特定参数值限流
系统规则Load、CPU、平均 RT、入口 QPS、并发线程数
授权规则白名单、黑名单

7.8 热点与系统规则学习重点

  1. 热点参数限流
  2. 系统自适应保护
  3. 授权规则

八、与 OpenFeign、Gateway、Nacos 整合

8.1 OpenFeign + Sentinel

在 Spring Cloud Alibaba 中,OpenFeign 常和 Sentinel 结合使用,实现远程调用保护。

8.1.1 开启配置

yaml
feign:
  sentinel:
    # 开启 Feign 与 Sentinel 联动
    enabled: true

8.1.2 Feign 接口示例

java
@FeignClient(name = "user-service", fallbackFactory = UserFeignFallbackFactory.class)
public interface UserFeignClient {

    @GetMapping("/user/{id}")
    Result<UserDTO> getUserById(@PathVariable("id") Long id);
}

8.1.3 FallbackFactory 示例

java
@Component
public class UserFeignFallbackFactory implements FallbackFactory<UserFeignClient> {

    @Override
    public UserFeignClient create(Throwable cause) {
        return id -> {
            // 这里可以记录原始异常 cause
            return Result.fail(500, "user-service 不可用,触发降级");
        };
    }
}

重点:在 Feign 场景下,更推荐 FallbackFactory,因为可以拿到原始异常。

8.2 Gateway + Sentinel

Sentinel 也可以保护网关入口流量。

常见场景:

  • /api/order/** 做限流
  • 对登录接口做特殊规则
  • 对敏感接口做黑白名单控制

8.2.1 网关流控模式

Gateway 场景下常见两种维度:

  • route 维度:按路由 ID 控制
  • API 分组维度:按一组接口规则控制

8.2.2 API 分组说明

可以把多个接口归为一个组,例如:

  • /api/order/**
  • /api/order/query/**
  • /api/order/create/**

统一归到 order-api-group 下做限流。

8.3 Nacos + Sentinel 动态规则

生产环境一般不会把规则只写在控制台里,更推荐持久化到 Nacos。

8.3.1 配置示例

yaml
spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            # Nacos 地址
            server-addr: 127.0.0.1:8848
            # Nacos 中的 Data ID
            dataId: order-service-flow-rules
            # 规则所在分组
            groupId: SENTINEL_GROUP
            # 规则类型
            rule-type: flow

rule-type 常见值包括:

  • flow:流控规则
  • degrade:降级规则
  • param-flow:热点参数规则
  • system:系统规则
  • authority:授权规则

8.3.2 Nacos 规则 JSON 示例

json
[
  {
    "resource": "testResource",
    "limitApp": "default",
    "grade": 1,
    "count": 5,
    "strategy": 0,
    "controlBehavior": 0
  }
]

8.3.3 降级规则 JSON 示例

json
[
  {
    "resource": "degradeTest",
    "grade": 0,
    "count": 1000,
    "timeWindow": 5,
    "slowRatioThreshold": 0.5,
    "minRequestAmount": 5,
    "statIntervalMs": 1000
  }
]

8.3.4 热点参数规则 JSON 示例

json
[
  {
    "resource": "hotTest",
    "grade": 1,
    "count": 5,
    "paramIdx": 0
  }
]

8.4 联动学习重点

  1. Feign + Sentinel
  2. Gateway + Sentinel
  3. Nacos 持久化规则
  4. 动态规则推送

九、常见面试题与故障排查

9.1 Sentinel 的核心作用是什么

  • 限流
  • 熔断
  • 降级
  • 热点保护
  • 系统保护

9.2 blockHandler 和 fallback 有什么区别

  • blockHandler:规则触发时执行
  • fallback:业务异常时执行

9.3 为什么需要熔断

  • 防止下游故障扩散
  • 防止线程被长时间占用
  • 给系统恢复时间

9.4 Sentinel 控制台看不到服务怎么办

重点排查:

  1. 是否引入了 Sentinel 依赖
  2. 控制台地址是否正确
  3. 服务是否访问过受保护资源
  4. 控制台和服务之间网络是否打通

9.5 Feign 降级不生效怎么办

  • 是否开启了 feign.sentinel.enabled=true
  • fallback / fallbackFactory 是否被 Spring 管理
  • Feign 客户端是否配置正确

9.6 热点规则不生效怎么办

  • 检查方法参数是否和规则配置一致
  • 检查资源名是否正确
  • 检查是否真的命中了热点参数

9.7 高频面试重点

  1. Sentinel 和 Hystrix 的区别
  2. 限流、熔断、降级的区别
  3. blockHandler 和 fallback 的区别
  4. 热点参数限流
  5. Feign + Sentinel 如何配合
  6. 流控模式和流控效果有哪些
  7. 降级策略有哪些
  8. 授权规则和系统规则有哪些模式

十、最佳实践

10.1 规则设计建议

  • 核心接口必须有限流规则
  • 核心依赖必须有熔断降级
  • 热点接口要单独配置热点参数规则

10.2 代码设计建议

  • blockHandlerfallback 分工明确
  • 兜底逻辑尽量统一抽离
  • 不要把业务主逻辑写进兜底方法

10.3 生产建议

  • Sentinel 规则持久化到 Nacos
  • 控制台仅作为查看和调试入口
  • 对关键接口配置监控报警
  • 配合 Gateway、Feign、Nacos 一起使用

10.4 总结

Sentinel 是 Spring Cloud Alibaba 体系里非常关键的稳定性组件。

  • 入门阶段要掌握流控规则和控制台使用
  • 进阶阶段要掌握熔断降级、热点参数和系统规则
  • 高阶阶段要掌握 Feign、Gateway、Nacos 的联动与生产实践

真正把这些能力用起来,微服务系统才算具备了基础的稳定性保障。