springcloud : 理解Sentinel 熔断与限流服务稳定性的守护神
前面学习了 springcloud: 理解Gateway网关原理
一、什么是 Sentinel?
Sentinel 是阿里巴巴开源的一款 高可用流量防卫组件,主要用于实现:
- 限流(Flow Control)
- 熔断降级(Circuit Breaking)
- 系统负载保护(System Adaptive)
- 实时监控(Dashboard)
一句话总结:
Sentinel 是运行在每个微服务节点上的“流量卫兵”,在调用链路中监控 QPS、响应时间、异常比例等指标,当检测到风险时,会主动限流或降级,从而避免系统雪崩。
二、为什么要用 Sentinel?
在微服务架构中,一个请求往往会经过多层调用:
Gateway → Service A → Service B → Service C
一旦底层服务 Service C 出现慢响应或宕机,就可能引发:
- 级联失败:上游服务不断重试,导致所有请求堆积;
- 线程阻塞:Tomcat 线程占满,无法响应新请求;
- 雪崩效应:一个服务挂掉,整个系统不可用。
Sentinel 的目标,就是:
当系统出现异常或高并发时,能够自动“保护自己”。
三、Sentinel 的核心功能
| 功能 | 说明 | 举例 |
|---|---|---|
| 限流 | 控制每秒通过的请求数(QPS) | 一个接口每秒最多处理 100 个请求 |
| 熔断降级 | 当接口异常率过高或响应过慢时,临时中断请求 | 如果 B 服务超时率超过 50%,A 不再调用 B |
| 系统保护 | 根据系统整体负载(如 CPU、RT)动态限流 | 当 CPU 超过 80%,自动降低部分流量 |
| 热点参数限流 | 对某些参数值的请求进行特殊限流 | 对用户ID=1的请求单独限流 |
四、Sentinel 的执行流程(重点)
假设你在微服务中使用了 Sentinel 注解:
@GetMapping("/order")
@SentinelResource(value = "orderAPI", blockHandler = "handleBlock")
public String order() {return "success";
}
当请求进入系统时,Sentinel 的执行流程如下 👇
1️⃣ 定义资源点(Resource)
每个被 Sentinel 保护的方法、URL、接口等都会被定义为一个 “资源(Resource)”。
Sentinel 在进入资源点时调用
SphU.entry("orderAPI")创建上下文。
try (Entry entry = SphU.entry("orderAPI")) {// 业务逻辑
} catch (BlockException ex) {// 限流或熔断处理
}
2️⃣ 检查规则链(Slot Chain)
Sentinel 内部使用 责任链模式(Slot Chain),按顺序检查各种规则:
- NodeSelectorSlot:记录调用链;
- ClusterBuilderSlot:构建集群节点统计;
- StatisticSlot:收集实时指标(QPS、RT、异常率);
- FlowSlot:执行限流规则;
- DegradeSlot:执行熔断规则;
- SystemSlot:执行系统保护;
- AuthoritySlot:执行授权控制。
一旦某个 Slot 检测不通过,就会抛出
BlockException,并调用blockHandler。
3️⃣ 限流判断逻辑(Flow Control)
Sentinel 内部会维护一个 滑动时间窗口(Sliding Window),统计过去 N 秒的请求量。
如果在时间窗口内请求数超过设定的 QPS,就会触发限流。
示例:
配置 QPS = 10
如果在过去 1 秒内已经通过 10 次请求,第 11 次请求将被拒绝,执行 blockHandler()。
4️⃣ 熔断降级逻辑(Degrade Rule)
三种触发策略:
| 模式 | 含义 | 触发条件 |
|---|---|---|
| RT 模式 | 平均响应时间过高 | 平均 RT > 阈值 且持续时间超过指定时长 |
| 异常比例 | 异常比例过高 | 异常率 > 比例阈值 且最少请求数达到阈值 |
| 异常数 | 异常总数过多 | 在指定时间窗口内异常数超过阈值 |
熔断触发后,Sentinel 会在一段时间内直接拒绝请求,等“冷却时间”过后再自动恢复。
5️⃣ 异常处理与恢复
限流或熔断被触发后,Sentinel 会抛出:
BlockException
并调用开发者定义的:
blockHandler
示例:
public String handleBlock(BlockException ex) {return "系统繁忙,请稍后再试";
}
五、Sentinel Dashboard 可视化监控
Sentinel 提供了一个强大的 可视化控制台(Dashboard),可以:
- 实时查看每个接口的 QPS、RT、异常数;
- 动态添加限流/降级规则;
- 一键修改阈值,无需重启服务;
- 支持集群限流配置。
# 启动 Sentinel 控制台
java -jar sentinel-dashboard.jar --server.port=8080
配置客户端连接:
spring:cloud:sentinel:transport:dashboard: localhost:8080port: 8719
六、与 Gateway、Nacos、OpenFeign 的关系
| 模块 | 作用 | Sentinel 结合点 |
|---|---|---|
| Gateway | 统一流量入口 | 可以直接在 Gateway 层限流,保护下游服务 |
| Nacos | 服务注册发现 | Sentinel 规则可以注册在 Nacos 实现动态推送 |
| OpenFeign | 服务调用 | 保护调用端防止下游接口慢响应导致雪崩 |
示例:
- Gateway 限流请求入口;
- Feign 调用时使用 Sentinel 保护;
- Nacos 同步规则配置,实现动态限流。
七、可能遇到的问题与优化建议
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 限流误判 | 阈值设置过低 | 结合实际 QPS 做压测后设定 |
| 熔断频繁触发 | 异常统计周期太短 | 延长统计窗口时间 |
| 分布式多实例不一致 | 各节点规则不同步 | 结合 Nacos 实现统一规则推送 |
| 阻塞调用时间过长 | BlockHandler逻辑过重 | 保证限流降级逻辑轻量化 |
| 控制台无法连接 | 端口被防火墙拦截 | 检查 8719 与 dashboard 端口配置 |
八、总结一句话
Sentinel 是分布式系统的“保险丝”,
它不负责业务逻辑,而是让系统在「异常与高压」下依然可用。
