Skip to content

FallbackHeaders GatewayFilter 工厂

FallbackHeaders 工厂允许您在将请求转发到外部应用程序的 fallbackUri(回退 URI)时,将 Spring Cloud CircuitBreaker 的执行异常详细信息添加到请求头中。

场景示例:

application.yml

yaml
spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: CircuitBreaker
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback
        filters:
        - name: FallbackHeaders
          args:
            executionExceptionTypeHeaderName: Test-Header

工作流程解析:

  1. 在这个例子中,当 ingredients 路由中的断路器 (CircuitBreaker) 运行时发生执行异常。
  2. 请求被转发到 forward:/fallback,这将匹配到第二个路由 ingredients-fallback
  3. 请求最终被转发到运行在 localhost:9994 上的外部应用程序的 /fallback 端点。
  4. 在转发之前,FallbackHeaders 过滤器会将异常类型、异常消息以及(如果可用)根原因异常类型和消息添加到该请求的 Header 中。

自定义 Header 名称:

你可以通过设置以下参数来覆盖配置中的 Header 名称(括号中显示的是默认值):

  • executionExceptionTypeHeaderName ("Execution-Exception-Type"):执行异常的类型。
  • executionExceptionMessageHeaderName ("Execution-Exception-Message"):执行异常的消息。
  • rootCauseExceptionTypeHeaderName ("Root-Cause-Exception-Type"):根原因异常的类型。
  • rootCauseExceptionMessageHeaderName ("Root-Cause-Exception-Message"):根原因异常的消息。

有关断路器和网关的更多信息,请参阅 Spring Cloud CircuitBreaker 工厂 部分。

补充教学 —— 为什么要用 FallbackHeaders?

当你的微服务挂了,触发了网关的熔断机制,网关把请求转发到了一个“兜底服务”(Fallback Service)。

  • 问题:兜底服务只收到了请求,但它不知道“为什么”会熔断。是因为超时了?还是因为原来的服务报了 500 错误?还是网络不通?
  • 解决FallbackHeaders 就像一个信使。它把导致熔断的“案发原因”(异常信息)写在信封(Header)上,一起交给兜底服务。
  • 用途:兜底服务拿到这些 Header 后,可以根据错误类型记录更详细的日志,或者返回不同的兜底内容(例如:如果是超时,提示“网络拥堵”;如果是 500,提示“系统维护”)。

Based on Spring Framework.