我是第一次使用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,以下是我的发现。希望这对你有帮助。
-
由于您的回退URI位于网关的控制器内,我认为您可以从ServerWebExchange 获得异常
-
此处的文档(位于6.5.1正上方(
-
我用Kotlin编写的示例代码:
@GetMapping("/fallback") fun fallbackEndpoint(serverWebExchange: ServerWebExchange): ResponseEntity<String> { val exception: Exception? = serverWebExchange .getAttribute(ServerWebExchangeUtils.CIRCUITBREAKER_EXECUTION_EXCEPTION_ATTR)
-
-
在您的示例中,CircuitBreaker和FallBackHeaders似乎位于同一个端点上。我认为FallbackHeader应该用于不同于CircuitBreaker 的端点
- 我认为应该将它们作为过滤器添加到外部回退端点
- 它不是Reactive,但请参阅此示例以了解上下文(CircuitBreaker和FallBackHeader用于不同的端点(