【问题标题】:spring-cloud-gateway FallBackHeaders missing exception detailsspring-cloud-gateway FallBackHeaders 缺少异常详细信息
【发布时间】:2021-12-29 18:01:22
【问题描述】:

我是第一次使用 spring-cloud-gateway 并且对响应式世界也很陌生,所以我可能会遗漏一些东西。我已经配置了 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");
                    }
                    )

【问题讨论】:

    标签: spring spring-boot spring-cloud-gateway


    【解决方案1】:

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

    1. 由于您的后备 URI 在网关的控制器内,我认为您可以从 ServerWebExchange 获取异常

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

      • 我认为应该将它们作为过滤器添加到外部后备端点
      • 它不是 Reactive,但请参阅 this example 了解上下文(CircuitBreaker 和 FallBackHeaders 用于不同的端点)

    【讨论】:

    • 如果您能接受我的回答,我们将不胜感激。谢谢!
    猜你喜欢
    • 2019-01-09
    • 1970-01-01
    • 2018-09-30
    • 2012-05-13
    • 2011-03-20
    • 1970-01-01
    • 2023-04-07
    • 2012-09-07
    • 1970-01-01
    相关资源
    最近更新 更多