2017-11-10 7 views
0

Eurekaサーバー経由でSpringブートマイクロサービスを登録/発見してSpring Cloud Gatewayを試してみましょう。セットアップは正常に動作しており、クライアントは問題なくゲートウェイを介して検出されたサービスを呼び出すことができます。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。しかし、GatewayのRoutingメカニズムに機能を追加して、それぞれのRouteにenabled: true|falseフラグを追加することで、必要に応じてこれらのマイクロサービスへのアクセスを一時的に有効/無効にすることができます。私たちは、返しそれらでGatewayFilterを含めることenabled: falseでマークされている再構築のルートでこれをやっている:

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

そのenabled: falseルートへの呼び出しが呼ばれるたびに。

WebRequestExceptionたちは、その後、必要に応じてServerWebExchangeServerHttpResponseを処理するWebExceptionHandler私たち自身の中に傍受私たち自身Throwableクラスです。

注1:ゲートウェイではspring-boot-starter-webfluxが使用されています。

注2:私たちは、ルートのenabled旗、我々の状態を変更するたびに:1)再構築ルート、2)ルートはで再キャッシュされるようにするためでCachingRouteLocator Beanの.refresh()メソッドを呼び出し| GatewayFilterを使用しないでください。

関連する問題