尝试使用通过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)发布于 2017-11-18 02:06:59
最后,我们决定让错误响应保持原样。即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的ServerHttpResponse。
注意1:网关正在使用.中的 spring-boot-starter-webflux
Bean注意2:每当我们更改路由的enabled enabled标志的状态时,我们: 1)重新构建路由,2)调用 .refresh() GatewayFilter 的Bean方法,以便在没有Bean的情况下使用|重新缓存路由。
发布于 2021-09-21 11:17:58
这个问题非常类似于:
https://stackoverflow.com/a/69257852/12952273
但是以不同的方式被问到。
有一种称为断路器的模式,它有助于避免级联故障(如果被调用的服务没有响应,可能会发生级联故障)
发布于 2017-11-14 00:44:00
这可能有点老生常谈,但是为什么不添加一个controller advice呢?像这样的东西应该能把你带到那里。
@ControllerAdvice
public class ServiceNotFoundHandler {
@ExceptionHandler(NotFoundException.class)
@ResponseBody
@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)
public String handleUnavailableService(NotFoundException e) {
return "service unavailable";
}
}https://stackoverflow.com/questions/47226810
复制相似问题