使用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)
答案 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";
}
}