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工作流程解析:
- 在这个例子中,当
ingredients路由中的断路器 (CircuitBreaker) 运行时发生执行异常。 - 请求被转发到
forward:/fallback,这将匹配到第二个路由ingredients-fallback。 - 请求最终被转发到运行在
localhost:9994上的外部应用程序的/fallback端点。 - 在转发之前,
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,提示“系统维护”)。