本文目录导读:

- 核心原理(先理解,再演示)
- 方案一:基于 Sentinel 的本地演示(最推荐,无需复杂架构)
- 方案二:基于 OpenFeign(Spring Cloud)的调用链演示
- 方案三:基于 Hystrix Dashboard 的图形化演示(经典版)
- 总结:哪个方案最适合你的演示场景?
微服务熔断降级的演示,通常需要搭建一个服务调用链,然后模拟下游服务故障或高延迟,观察上游服务如何通过熔断器保护自己,并触发降级逻辑。
以下是三种最实用的演示方案,从简单到复杂,你可以根据自己的环境选择。
核心原理(先理解,再演示)
- 熔断: 下游服务错误率(或延迟)超过阈值 -> 上游熔断器打开 -> 请求快速失败(不等待) -> 每隔一段时间尝试放行一个请求(半开状态) -> 若成功则关闭熔断器。
- 降级: 当熔断器打开或超时发生时,执行一个备用逻辑(Fallback),例如返回缓存数据、默认值或错误提示,而不是让请求彻底卡死。
基于 Sentinel 的本地演示(最推荐,无需复杂架构)
(推荐理由:启动简单,控制台可视化,无需 Kafka 等中间件)
架构图: A(客户端) -> B(服务端,带 Sentinel)
步骤:
-
环境准备:
- 启动 Sentinel Dashboard(下载 jar 包:
java -jar sentinel-dashboard.jar,默认端口 8080)。 - 创建一个 Spring Boot 应用
service-b。
- 启动 Sentinel Dashboard(下载 jar 包:
-
代码编写(Service-B):
-
加入依赖:
spring-cloud-starter-alibaba-sentinel。 -
配置: 在
application.yml里连接 Dashboard:spring: cloud: sentinel: transport: dashboard: localhost:8080 -
核心接口:
@RestController public class DemoController { // 演示熔断:定义一个资源,并指定熔断降级规则 @GetMapping("/api/data") // value = 资源名, fallback = 降级方法 @SentinelResource(value = "getData", fallback = "fallbackForData") public String getData() { // 模拟一个随机失败的服务 if (Math.random() > 0.7) { // 70% 成功率 throw new RuntimeException("模拟服务异常"); } return "正常数据:" + System.currentTimeMillis(); } // 降级方法:必须与原方法参数一致,加上 Throwable public String fallbackForData(Throwable t) { return "这是降级后的默认数据,原因:" + t.getMessage(); } }
-
-
演示操作:
- 启动
service-b,启动 Dashboard。 - 访问
http://localhost:8080进入 Sentinel 控制台。 - 找到
service-b,在 “簇点链路” 中点击getData的 “流控” 按钮,选择 “熔断降级”。 - 设置规则:
- 策略:慢调用比例(或 异常比例)。
- 比例阈值:0.5(50%)。
- 统计时长:1000ms。
- 熔断时长:10秒。
- 观察:
- 用浏览器或 Postman 疯狂刷新
http://localhost:8080/api/data。 - 触发前: 看到正常数据或异常错误。
- 触发后: 所有请求直接返回降级内容
"这是降级后的默认数据,...",并且响应极快(毫秒级)。 - 恢复: 10秒后,放行一个请求,若成功则恢复正常。
- 用浏览器或 Postman 疯狂刷新
- 启动
关键演示点: 由于服务端自身随机失败,触发了熔断,客户端免于等待。
基于 OpenFeign(Spring Cloud)的调用链演示
(推荐理由:贴近真实微服务架构,有调用链 A -> B -> C)
架构图: Service-A(消费者,带 Feign + Hystrix/Sentinel) -> Service-B(生产者,模拟故障)
步骤:
-
环境准备:
- 注册中心: Nacos 或 Eureka。
- 服务 B: 一个提供接口(如
/b/data)的服务,可配置为随机延迟或报错。 - 服务 A: 调用服务 B 的消费者。
-
代码编写(Service-A):
-
加入依赖:
spring-cloud-starter-openfeign,spring-cloud-starter-netflix-hystrix(或 Spring Cloud Alibaba Sentinel)。 -
Feign 接口 + 降级:
@FeignClient(name = "service-b", fallback = ServiceBFallback.class) public interface ServiceBClient { @GetMapping("/b/data") String getData(); } @Component public class ServiceBFallback implements ServiceBClient { @Override public String getData() { return "【服务B已熔断】这里是A的降级数据!"; } } -
开启熔断: 在
application.yml配置:feign: circuitbreaker: enabled: true -
服务 A 的 Controller:
@RestController public class AController { @Autowired private ServiceBClient bClient; @GetMapping("/a/get") public String get() { return bClient.getData(); // 调用远端 } }
-
-
演示操作:
- 正常阶段: 访问
http://localhost:8081/a/get,返回服务 B 的正常数据。 - 制造故障: 停止服务 B,或让服务 B 返回 500 错误 / 超时。
- 触发熔断: 快速刷新浏览器 5-10 次。
- 观察:
- 请求不再卡住等待超时。
- 直接秒回:
"【服务B已熔断】这里是A的降级数据!"。 - 若服务 B 恢复,经过一段时间(如 5 秒半开探测),A 自动恢复正常调用。
- 正常阶段: 访问
基于 Hystrix Dashboard 的图形化演示(经典版)
(推荐理由:可以直观看到熔断器开/关/半开的波形图,视觉冲击强)
架构图: Client -> Service-A(Hystrix) -> Service-B(手动控制故障)
步骤:
-
环境准备:
- Service-A 集成
spring-cloud-starter-netflix-hystrix。 - Service-A 集成
spring-boot-starter-actuator,并暴露/hystrix.stream端点。 - 启动 Hystrix Dashboard(
@EnableHystrixDashboard)。
- Service-A 集成
-
演示操作:
- 访问 Hystrix Dashboard,输入
http://service-a:8080/actuator/hystrix.stream。 - Dashboard 显示一个圆圈(代表熔断器状态,绿色=关闭,红色=打开,黄色=半开)。
- 疯狂刷新请求,让 Service-B 报错。
- 视觉变化:
- 圆圈从绿色变为红色。
- 圆圈的大小变化(代表请求量)。
- 圆圈的颜色由绿变红,这就是熔断器打开的瞬间可视化。
- 访问 Hystrix Dashboard,输入
优点: 非常适合在PPT或大屏幕上展示熔断器的状态切换。
哪个方案最适合你的演示场景?
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 技术分享 / 教学 | 方案一(Sentinel Dashboard) | 配置简单,控制台可视化好,降级原因清晰。 |
| 有完整微服务项目 | 方案二(OpenFeign + Sentinel/Hystrix) | 贴近真实业务架构,演示调用链解耦。 |
| 追求视觉效果 | 方案三(Hystrix Dashboard) | 圆圈颜色变化直观,有“熔断恢复”的波形图。 |
| 只想看代码效果 | 方案一(纯代码 + 控制台日志) | 无需 Dashboard,在日志中打印 "触发降级"。 |
建议: 优先选择 方案一 或 方案二,因为 Sentinel 是目前国内的主流选择(相比 Hystrix 已停更),且演示效果清晰。