2017-06-19 5 views
1

Ist es möglich, einen Proxy zu einem Hauptserver/Servern/Service einzurichten, aber wenn dies nicht verfügbar ist, umleiten Anfragen an einen sekundären Server/Server/Service?Spring Cloud Zuul Fallback-Service

Der sekundäre Dienst ist keine Instanz des gleichen Typs der primären. Ihre API ist kompatibel, aber nicht das Gleiche. Die sekundäre Ressource ist eine weniger leistungsfähige letzte Ressource, wenn die primäre nicht verfügbar ist.

Wir verwenden nicht Eureka, nur feste IPs noch.

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

hatte ich einen Blick auf ZuulFallbackProvider, aber diese Schnittstelle ist eine feste Antwort auf Fehlerfall zur Verfügung gestellt. Ich möchte, wenn http://server1:8080/whatever nicht reagiert, umleiten an http://server2:8080/whateverApi2.

Danke.

Antwort

4

Wenn jemand versucht, etwas Ähnliches zu tun, was tatsächlich Arbeit war, benutzte keine Zuul-Komponente, aber Hystrix stattdessen.

im Gateway-API erstellen wir eine Fassade Controller, der auf den Dienst reagieren wir die Ausweichlösung setzen wollen:

@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()); 
} 

Default und fallbackClient sind zwei verschiedene FeignClient Schnittstellen, die jeweils ein Hinweis auf jede Dienstendpunkt .

Das ist es! Wenn Sie den Hauptdienst herunterfahren, ruft die Gateway-API den Fallback-Dienst auf, ohne dass jemals ein einzelner Dienst verfügbar ist. Die Änderung dauert nur wenige Millisekunden.

Auch wenn Sie es wieder einschalten, reagiert es auch nur ein paar Millisekunden nachdem es fertig ist.

3

Sie können das mit ZuulFallbackProvider tun, aber Sie müssen die unten zuerst konfigurieren.

Erstens, url-routing - Angabe der URL direkt in zuul.routes.<service>.url - in Zuul ist nicht in HystrixCommand ausgeführt. Um dies zu erreichen, müssen Sie Ihre Konfiguration wie folgt ändern.

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

ribbon: 
    eureka: 
    enabled: false 

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

Die obige Konfiguration verwendet Ribbon ohne Eureka. Sie finden die Details here

Jetzt wird Ihre Anfrage in HystrixCommand über Ribbon ausgeführt werden. Sie können also Ihren eigenen ZuulFallbackProvider bereitstellen.

In ZuulFallbackProvider, können Sie Ihre Fallback-Anfrage an Ihre http://server2:8080/whateverApi2. in fallbackResponse Methode wie folgt machen. Das Folgende ist ein sehr naives Beispiel. :-) Sie müssen das folgende Beispiel für Ihren eigenen Zweck ausfüllen.

@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

Danke für die Antwort. Ich werde das noch nicht als Lösung markieren, nur um zu sehen, ob es eine "nur Konfigurations" -Alternative gibt. Ich werde Ihre Lösung verwenden, vielleicht sogar direkt eine der Netflix OSS-Komponenten anstelle von RestTemplate verwenden, wenn Sie die gesamte Spring Cloud-Infrastruktur verwenden. –

+0

Ich bin endlich auf dieses Problem zurückgekommen und habe diesen Ansatz versucht. Aber der ZuulFallbackProvider ist ein statisches Fallback. Gibt es Zuul, Ribbon oder Hystrix, um die Anfrage tatsächlich an meinen Fallback-Dienst weiterzuleiten? Ich möchte nicht, dass es zur Ribbon-Server-Liste hinzugefügt wird, weil ich möchte, dass es als letzter Ausweg ausgeführt wird, nur wenn die Server heruntergefahren sind. –

+1

Wenn Sie kein Hystrix-Fallback verwenden möchten, ist ein weiterer möglicher Ansatz, dass Sie einen eigenen "route" - oder "post" -Filter erstellen. In Ihrem Filter können Sie das Ergebnis der ursprünglichen Anfrage überprüfen und dann die Anfrage an den alternativen Server mit den richtigen Parametern weiterleiten. –

Verwandte Themen