一、前言
在微服务架构中,流量突增、下游服务超时、报错雪崩是线上最常见的稳定性问题。Sentinel作为阿里开源、经过双11大促打磨的流量防护组件,相比 Hystrix 更轻量、功能更强、配置更灵活,是目前国内微服务限流、熔断、降级的主流方案。
本文带来零残缺、可直接运行、可上线的 Sentinel 完整实战案例,包含:
- 完整 Maven 依赖
- 全量 YAML 配置
- 限流 + 熔断双功能代码实现
- blockHandler / fallback 精准区分(面试高频)
- 代码硬编码规则 + 控制台动态规则两种方式
- OpenFeign 跨服务调用限流熔断识别实战
- 全套线上测试场景 & 问题总结
二、核心核心概念
1. 兜底方法区别
- blockHandler:Sentinel 框架拦截异常,只处理限流、熔断、系统保护、黑白名单拦截触发的BlockException。
- fallback:捕获业务代码所有异常,包含空指针、自定义异常、接口报错等业务异常。
2. 核心能力
- 限流:QPS 限流、并发线程限流、链路限流、热点参数限流
- 熔断:慢调用比例、异常比例、异常数三种熔断策略
- 降级:故障自动隔离,避免服务雪崩
- 系统防护:整机 CPU、负载、QPS 全局保护
三、环境与依赖
适配版本:SpringBoot 2.7.x + SpringCloud Alibaba 2021.0.1.0(稳定生产版本)
完整 pom.xml 依赖
xml |
四、项目配置文件 application.yml
配置控制台地址、开启服务预热初始化,适配开发、生产环境
yaml |
五、启动类
java |
六、核心业务代码(限流+熔断+双兜底完整实现)
统一资源名,区分限流熔断兜底、业务异常兜底,代码完全解耦,符合生产规范。
java |
七、全局异常处理器(生产核心:返回429/503标准状态码)
这是跨服务调用能识别限流/熔断的关键:
1. 限流异常FlowException→ 返回 HTTP 429
2. 熔断异常DegradeException→ 返回 HTTP 503
上游 A 服务可通过状态码精准区分「下游限流」还是「下游熔断」
java |
八、OpenFeign 跨服务调用(A服务调用B服务,精准识别限流/熔断)
场景说明
微服务最经典场景:A服务 OpenFeign 调用 B服务
B服务接口被 Sentinel 限流/熔断后,抛出对应异常,经过全局异常处理器返回标准 HTTP 状态码,A服务可精准捕获、区分限流/熔断/普通报错,做差异化降级策略。
1. Feign客户端定义(A服务)
java |
2. A服务调用代码(核心:区分429限流 / 503熔断)
java |
九、规则配置方式一:代码硬编码(快速测试)
无需控制台,项目启动自动加载限流、熔断规则,适合单元测试、快速验证场景。
java |
十、规则配置方式二:Sentinel 控制台动态配置(生产推荐)
1. 启动控制台
下载 sentinel-dashboard-1.8.8.jar,执行启动命令:
shell |
访问地址:http://127.0.0.1:8085,默认账号密码:sentinel / sentinel
2. 配置流控规则
- 资源名:createOrder
- 阈值类型:QPS
- 单机阈值:2
- 流控效果:快速失败
3. 配置熔断降级规则
- 资源名:createOrder
- 熔断策略:慢调用比例
- 最大RT:250ms
- 比例阈值:0.5
- 最小请求数:5
- 熔断时长:5秒
十一、完整测试场景(含跨服务调用)
1. 本地接口限流测试
快速高频访问:http://localhost:8080/order/create/1
每秒请求超过2次,触发限流,返回429提示信息。
2. 业务异常 fallback 测试
访问:http://localhost:8080/order/create/999
代码主动抛出业务异常,触发 fallback 兜底。
3. 跨服务限流识别测试(A调B)
高频访问:http://localhost:8080/a/call/b/1
B服务触发限流后返回429,A服务捕获状态码,执行限流专属降级逻辑。
4. 跨服务熔断识别测试(A调B)
批量并发请求接口,触发B服务慢调用熔断,B返回503,A服务捕获后执行熔断专属降级逻辑,不再重试。
十二、生产核心规范与避坑总结
1. 方法签名硬性规则
- blockHandler 方法:参数必须和原方法一致,末尾必须追加BlockException
- fallback 方法:参数同原方法,可追加Throwable捕获所有异常
2. 跨服务调用核心规范(重点)
- 限流=429:服务正常、流量打满,可短时重试、排队、友好提示
- 熔断=503:服务异常隔离,禁止重试,直接走本地兜底/缓存
- 禁止统一返回200状态码+业务码,会导致上游无法精准区分故障类型,丢失降级策略
Feign 底层逻辑:
只要 HTTP 状态码 不是 200~299,不会把 body 正常返回,直接抛出 FeignException;
FeignException 内部会保存原始 HTTP 状态码,通过 e.status() 获取。
3. 生产建议
- 禁止使用代码硬编码规则,务必使用Nacos 持久化规则,支持动态修改、集群统一生效
- 核心接口配置限流+熔断双重防护,非核心接口可只配置限流
- 统一 429/503 状态码规范,统一上下游降级逻辑
- 开启 Sentinel 监控日志,线上快速定位流量、熔断异常
十三、总结
本文实现了零缺失、可直接投产的 Sentinel 限流熔断完整案例,覆盖本地接口防护 + OpenFeign跨服务调用、上下游异常识别、差异化降级全场景,厘清了blockHandler、fallback、限流熔断跨服务传递的核心原理。
Sentinel 凭借轻量、高可用、功能丰富的特性,完全可以替代 Hystrix,作为微服务稳定性防护的核心组件,是中高级开发必备的技术栈。