2017-06-19 11 views
1

メインサーバー/サーバー/サービスにプロキシをセットアップすることはできますが、これが利用できない場合は、セカンダリサーバー/サーバー/サービスにリクエストをリダイレクトしますか?Spring Cloud Zuulフォールバックサービス

セカンダリサービスは、プライマリサービスと同じタイプのインスタンスではありません。それらのAPIは互換性がありますが、同じではありません。セカンダリは、プライマリが利用できない場合、パフォーマンスの低い最後のリソースです。

私たちはEurekaを使用していません。まだ固定IPだけです。

zuul: 
    routes: 
    whatever: 
     path: /whatever/** 
     sensitiveHeaders: Cookie,Set-Cookie 
     url: http://server1:8080/whatever 

私はZuulFallbackProviderに見ていたが、このインターフェースは、エラーの場合に固定された応答を提供しています。 http://server1:8080/whateverが応答しない場合は、http://server2:8080/whateverApi2にリダイレクトします。

ありがとうございました。

答えて

4

誰もが実際に仕事ではなく、任意のZuulコンポーネントを使用しますが、Hystrixていなかったものを、類似した何かをしようとしている場合。ゲートウェイAPIで

、我々は代替ソリューションを設定したいサービスへの対応ファサードコントローラ作成:

@HystrixCommand(fallbackMethod = "fallbackWhatever") 
@PostMapping 
ResponseEntity<Object> whatever(final RequestEntity<?> request) { 
    return defaultClient.searchSubmissions(request.getHeaders(), request.getBody()); 
} 

ResponseEntity<Object> fallbackWhatever(final RequestEntity<?> request) { 
    return fallbackClient.searchSubmissions(request.getHeaders(), request.getBody()); 
} 

をdefaultClientとfallbackClientは、二つの異なるFeignClientインタフェース、各サービスのエンドポイントを指し、それぞれ一つであります。

これだけです!メインサービスをシャットダウンすると、ゲートウェイAPIは1つのサービスを利用できなくすることなく、フォールバックサービスの呼び出しを開始し、変更にはわずか数ミリ秒かかります。

また、電源をオンにすると、準備が整い、数ミリ秒後に応答します。

3

これはZuulFallbackProviderで行うことができますが、まず以下のように設定する必要があります。

まず、Zuulのurl-routing - urlを直接指定します(zuul.routes.<service>.url) - HystrixCommandでは実行されません。これを実現するには、以下のように構成を変更する必要があります。

zuul: 
    routes: 
    whatever: 
     path: /whatever/** 
     sensitiveHeaders: Cookie,Set-Cookie 
     serviceId: whatever 
     stripPrefix: false 

ribbon: 
    eureka: 
    enabled: false 

whatever: 
    ribbon: 
    listOfServers: http://server1:8080/ 

上記の設定では、ユーレカなしのリボンを使用しています。あなたはdetaisを見つけることができますhere

今、あなたのリクエストは、リボンを介してHystrixCommandで実行されます。したがって、独自のZuulFallbackProviderを提供することができます。

ZuulFallbackProviderでは、http://server2:8080/whateverApi2.に以下のようにfallbackResponseの方法でフォールバックリクエストを行うことができます。以下は非常に素朴な例です。 :-)あなたの目的のために以下の例を完成させる必要があります。

@Component 
public class TestZuulFallbackProvider implements ZuulFallbackProvider{ 
    @Override 
    public String getRoute() { 
     return "test"; 
    } 

    @Override 
    public ClientHttpResponse fallbackResponse() { 

     ResponseEntity<String> response = new RestTemplate().exchange("http://server2:8080/whateverApi2", HttpMethod.GET, null, String.class); 
     return new ClientHttpResponse() { 
      @Override 
      public HttpStatus getStatusCode() throws IOException { 
       return response.getStatusCode(); 
      } 
      @Override 
      public int getRawStatusCode() throws IOException { 
       return response.getStatusCodeValue(); 
      } 
      @Override 
      public String getStatusText() throws IOException { 
       return response.getStatusCode().getReasonPhrase(); 
      } 
      @Override 
      public void close() { 
      } 
      @Override 
      public InputStream getBody() throws IOException { 
       return new ByteArrayInputStream(response.getBody().getBytes("UTF-8")); 
      } 
      @Override 
      public HttpHeaders getHeaders() { 
       return response.getHeaders(); 
      } 
     }; 
    } 
} 
+0

お返事ありがとうございます。私は解決策としてまだマークしません。単に「構成のみ」の代替案があるかどうかを確認するだけです。あなたのソリューションは、完全なSpring Cloudインフラストラクチャを使用する場合、RestTemplateの代わりにNetflix OSSコンポーネントの1つを使用しても使用します。 –

+0

ついにこの問題に戻り、このアプローチを試みました。しかし、ZuulFallbackProviderは静的なフォールバックです。実際にリクエストをフォールバックサービスにリダイレクトするZuul、Ribbon、またはHystrixはありますか?サーバーが停止している場合に限り、最後の手段として実行する必要があるため、リボンサーバーリストに追加する必要はありません。 –

+1

hystrixフォールバックを使用したくない場合は、独自の完全な 'route'または' post'フィルタを作ることが考えられます。フィルタでは、元の要求の結果を確認してから、適切なパラメータを使用して代替サーバーに要求を転送できます。 –

関連する問題