2017-11-10 21 views
0

유레카 서버를 통해 등록/발견 된 스프링 부트 마이크로 서비스로 Spring Cloud Gateway를 시험 사용합니다. 설치가 잘 진행되고있어 클라이언트가 문제없이 게이트웨이를 통해 발견 된 서비스를 호출 할 수 있습니다.스프링 클라우드 게이트웨이 - 서비스 인스턴스가 없을 때 503을 반환합니다.

이제 클라이언트가 현재 서비스를 제공 할 수있는 인스턴스가없는 (즉 서비스가 다운 된) 서비스를 게이트웨이를 통해 호출하는 시나리오를 테스트하려고합니다. 이 시나리오를 테스트 할 때 기본 동작은 클라이언트가 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

예외가 발생하여 500 응답이되는 예외는 무엇입니까? – iLikeBreakfast

+0

@iLikeBreakfast, 예외는 다음과 같습니다 :'org.springframework.cloud.gateway.support.NotFoundException : test-service-name 인스턴스를 찾을 수 없습니다. ' –

답변

0

이것은 조금 해키 될 수도 있지만 왜하지 않는 controller advice을 추가? 이 같은 것이 당신을 거기에 데려다 줄 것입니다.

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

결국 오류 응답을 그대로 남겨두기로 결정했습니다. 즉 HTTP 500 - Unable to find instance for test-service-name입니다. 그러나 각 라우팅에 enabled: true|false 플래그를 포함하도록 게이트웨이의 라우팅 메커니즘에 기능을 추가 했으므로 이제는 원하는대로 해당 마이크로 서비스에 대한 액세스를 일시적으로 활성화/비활성화 할 수 있습니다. 우리는 반환 그들에 GatewayFilter를 포함 enabled: false으로 표시됩니다 다시 건물 경로로이 일을하고 있습니다 :

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

enabled: false 경로에 대한 호출이 호출 될 때마다.

WebRequestException 우리는 다음 처리하는 WebExceptionHandler 우리 자신에 차단 우리 자신의 Throwable 클래스 인 ServerWebExchangeServerHttpResponse 필요.

참고 1 : 게이트웨이는 spring-boot-starter-webflux을 사용하고 있습니다.

주 2 : 우리는 경로의 enabled 플래그 우리의 상태를 변경할 때마다 : 1) 경로를 다시 빌드 경로가 재 캐시 될 수 있도록, 2) 위해 CachingRouteLocator 콩의 .refresh() 메서드를 호출 | GatewayFilter을 제자리에 두지 마십시오.