spring云网关FallBackHeaders缺少异常详细信息



我是第一次使用spring云网关,也是反应世界的新手,所以我可能错过了一些东西。我已经配置了CircuitBreaker,它工作正常。我有一个后备uri,它在网关的控制器中。我想抛出原始异常,但也想捕获该异常,可能是为了度量。所以我配置了fallbackHeaders。因此首先调用SpringCloudCircuitBreakerFilter,并使用CircuitBreaker调用服务。如果抛出异常,我原以为它会先调用addExceptionDetails方法,然后再调用FallbackHeadersGatewayFilter,但它似乎会调用FallbackHeadersGatewayFilter,然后添加异常。有人能帮助我理解这是否是正确的行为,以及我是如何获得异常的(除了编写自己的过滤器(。以下是路由器配置:

.filters(spec -> spec.filters(filters)
.circuitBreaker(c -> {
c.setRouteId(route.getRouteId());
c.setName("slow");
c.setFallbackUri("forward:/fallback");
c.addStatusCode("400");
c.addStatusCode("404");
c.addStatusCode("500");
}
)
.fallbackHeaders(config -> {
config.setExecutionExceptionMessageHeaderName("message-header");
config.setExecutionExceptionTypeHeaderName("type-header");
config.setRootCauseExceptionMessageHeaderName("root-cause-message-header");
config.setRootCauseExceptionTypeHeaderName("root-cause-type-header");
}
)

我一直在学习如何使用CircuitBreaker,以下是我的发现。希望这对你有帮助。

  1. 由于您的回退URI位于网关的控制器内,我认为您可以从ServerWebExchange 获得异常

    • 此处的文档(位于6.5.1正上方(

    • 我用Kotlin编写的示例代码:

    @GetMapping("/fallback")
    fun fallbackEndpoint(serverWebExchange: ServerWebExchange):
    ResponseEntity<String> {
    val exception: Exception? = serverWebExchange
    .getAttribute(ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR)
    
  2. 在您的示例中,CircuitBreaker和FallBackHeaders似乎位于同一个端点上。我认为FallbackHeader应该用于不同于CircuitBreaker 的端点

    • 我认为应该将它们作为过滤器添加到外部回退端点
    • 它不是Reactive,但请参阅此示例以了解上下文(CircuitBreaker和FallBackHeader用于不同的端点(

相关内容

  • 没有找到相关文章

最新更新