微服务间的熔断降级如何演示?

wen java案例 76

本文目录导读:

微服务间的熔断降级如何演示?

  1. 核心原理(先理解,再演示)
  2. 方案一:基于 Sentinel 的本地演示(最推荐,无需复杂架构)
  3. 方案二:基于 OpenFeign(Spring Cloud)的调用链演示
  4. 方案三:基于 Hystrix Dashboard 的图形化演示(经典版)
  5. 总结:哪个方案最适合你的演示场景?

微服务熔断降级的演示,通常需要搭建一个服务调用链,然后模拟下游服务故障或高延迟,观察上游服务如何通过熔断器保护自己,并触发降级逻辑。

以下是三种最实用的演示方案,从简单到复杂,你可以根据自己的环境选择。


核心原理(先理解,再演示)

  1. 熔断: 下游服务错误率(或延迟)超过阈值 -> 上游熔断器打开 -> 请求快速失败(不等待) -> 每隔一段时间尝试放行一个请求(半开状态) -> 若成功则关闭熔断器。
  2. 降级: 当熔断器打开或超时发生时,执行一个备用逻辑(Fallback),例如返回缓存数据、默认值或错误提示,而不是让请求彻底卡死。

基于 Sentinel 的本地演示(最推荐,无需复杂架构)

(推荐理由:启动简单,控制台可视化,无需 Kafka 等中间件)

架构图: A(客户端) -> B(服务端,带 Sentinel)

步骤:

  1. 环境准备:

    • 启动 Sentinel Dashboard(下载 jar 包:java -jar sentinel-dashboard.jar,默认端口 8080)。
    • 创建一个 Spring Boot 应用 service-b
  2. 代码编写(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();
          }
      }
  3. 演示操作:

    • 启动 service-b,启动 Dashboard。
    • 访问 http://localhost:8080 进入 Sentinel 控制台。
    • 找到 service-b,在 “簇点链路” 中点击 getData“流控” 按钮,选择 “熔断降级”
    • 设置规则
      • 策略:慢调用比例(或 异常比例)。
      • 比例阈值:0.5(50%)。
      • 统计时长:1000ms。
      • 熔断时长:10秒。
    • 观察
      • 用浏览器或 Postman 疯狂刷新 http://localhost:8080/api/data
      • 触发前: 看到正常数据或异常错误。
      • 触发后所有请求直接返回降级内容 "这是降级后的默认数据,...",并且响应极快(毫秒级)。
      • 恢复: 10秒后,放行一个请求,若成功则恢复正常。

关键演示点: 由于服务端自身随机失败,触发了熔断,客户端免于等待。


基于 OpenFeign(Spring Cloud)的调用链演示

(推荐理由:贴近真实微服务架构,有调用链 A -> B -> C)

架构图: Service-A(消费者,带 Feign + Hystrix/Sentinel) -> Service-B(生产者,模拟故障)

步骤:

  1. 环境准备:

    • 注册中心: Nacos 或 Eureka。
    • 服务 B: 一个提供接口(如 /b/data)的服务,可配置为随机延迟或报错。
    • 服务 A: 调用服务 B 的消费者。
  2. 代码编写(Service-A):

    • 加入依赖spring-cloud-starter-openfeignspring-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(); // 调用远端
          }
      }
  3. 演示操作:

    • 正常阶段: 访问 http://localhost:8081/a/get,返回服务 B 的正常数据。
    • 制造故障: 停止服务 B,或让服务 B 返回 500 错误 / 超时。
    • 触发熔断: 快速刷新浏览器 5-10 次。
    • 观察
      • 请求不再卡住等待超时。
      • 直接秒回"【服务B已熔断】这里是A的降级数据!"
      • 若服务 B 恢复,经过一段时间(如 5 秒半开探测),A 自动恢复正常调用。

基于 Hystrix Dashboard 的图形化演示(经典版)

(推荐理由:可以直观看到熔断器开/关/半开的波形图,视觉冲击强)

架构图: Client -> Service-A(Hystrix) -> Service-B(手动控制故障)

步骤:

  1. 环境准备:

    • Service-A 集成 spring-cloud-starter-netflix-hystrix
    • Service-A 集成 spring-boot-starter-actuator,并暴露 /hystrix.stream 端点。
    • 启动 Hystrix Dashboard@EnableHystrixDashboard)。
  2. 演示操作:

    • 访问 Hystrix Dashboard,输入 http://service-a:8080/actuator/hystrix.stream
    • Dashboard 显示一个圆圈(代表熔断器状态,绿色=关闭,红色=打开,黄色=半开)。
    • 疯狂刷新请求,让 Service-B 报错。
    • 视觉变化
      • 圆圈从绿色变为红色。
      • 圆圈的大小变化(代表请求量)。
      • 圆圈的颜色由绿变红,这就是熔断器打开的瞬间可视化。

优点: 非常适合在PPT或大屏幕上展示熔断器的状态切换。


哪个方案最适合你的演示场景?

场景 推荐方案 理由
技术分享 / 教学 方案一(Sentinel Dashboard) 配置简单,控制台可视化好,降级原因清晰。
有完整微服务项目 方案二(OpenFeign + Sentinel/Hystrix) 贴近真实业务架构,演示调用链解耦。
追求视觉效果 方案三(Hystrix Dashboard) 圆圈颜色变化直观,有“熔断恢复”的波形图。
只想看代码效果 方案一(纯代码 + 控制台日志) 无需 Dashboard,在日志中打印 "触发降级"

建议: 优先选择 方案一方案二,因为 Sentinel 是目前国内的主流选择(相比 Hystrix 已停更),且演示效果清晰。

抱歉,评论功能暂时关闭!