Spring Cloud Gateway - 没有可用的服务实例时返回503

时间:2017-11-10 16:04:13

标签: spring spring-boot spring-cloud netflix-eureka

使用Eureka服务器注册/发现的Spring Boot微服务试用Spring Cloud Gateway。设置工作正常,客户端可以通过网关调用发现的服务,没有问题,这很好。

现在,我正在尝试测试客户端调用服务(通过网关)的情况,当前没有可用于服务调用的实例(即服务已关闭)。当我们测试这种情况时,默认行为是客户端获得500内部服务器错误响应。更改此默认行为以返回503 Service Unavilable响应的最简单方法是什么?

当前筹码:

Java 8
Spring Boot 2.0.0.M6 
Spring Cloud 2.0.0.M3
Spring Cloud Starter Eureka 2.0.0.M2 (in Gateway JVM)
Spring Cloud Starter Netflix Ribbon 2.0.0.M3 (in Gateway JVM)
Spring Cloud Starter Netflix Eureka Server 2.0.0.M3 (in Eureka Server JVM)

2 个答案:

答案 0 :(得分:0)

最后我们决定保留错误响应。即HTTP 500 - Unable to find instance for test-service-name。然而,我们为网关的路由机制添加了一些功能,以便为每个路由添加enabled: true|false标志,现在允许我们根据需要临时启用/禁用对这些微服务的访问。我们通过重新构建标有enabled: false的路由来完成此操作,以便在其中包含GatewayFilter返回:

Mono.error(new WebRequestException(HttpStatus.SERVICE_UNAVAILABLE, "SERVICE_UNAVAILABLE",
            "Service is down for maintenance"));

每次调用enabled: false路由时都会调用。

WebRequestException是我们自己的Throwable课程,我们会在我们自己的WebExceptionHandler中拦截,根据需要处理ServerWebExchange的{​​{1}}。

注1:网关正在使用ServerHttpResponse

注2:每当我们改变Route spring-boot-starter-webflux标志的状态时,我们:1)重新构建Route,2)调用enabled Bean的CachingRouteLocator方法,以便在没有.refresh()的情况下重新缓存路由。

答案 1 :(得分:-1)

这可能有点hacky,但为什么不添加controller advice?像这样的东西应该让你到那里。

@ControllerAdvice
public class ServiceNotFoundHandler {
    @ExceptionHandler(NotFoundException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)
    public String handleUnavailableService(NotFoundException e) {
        return "service unavailable";
    }
}