2017-06-19 156 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組成部分,但不是豪豬。

在網關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接口,每一個指向每個服務端點。

就是這樣!如果關閉主服務,Gateway API將開始調用回退服務,而不會返回單個服務不可用,並且更改只需幾毫秒。另外,如果您再次打開它,準備就緒後也會回覆幾毫秒。

3

您可以使用ZuulFallbackProvider來實現,但需要先配置下面的第一個。

首先,url-routing - 直接在zuul.routes.<service>.url中指定url - 在Zuul中不會在HystrixCommand中執行。要實現這一點,您需要像下面那樣更改您的配置。

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

ribbon: 
    eureka: 
    enabled: false 

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

上述配置使用沒有尤里卡的功能區。您可以找到detai here

現在,您的請求將通過功能區在HystrixCommand中執行。所以你可以提供你自己的ZuulFallbackProvider。

在ZuulFallbackProvider中,您可以通過fallbackResponse方法向您的http://server2:8080/whateverApi2.進行回退請求,如下所示。以下是一個非常天真的例子。 :-)爲了您自己的目的,您需要完成以下示例。

@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雲基礎架構時直接使用Netflix OSS組件之一而不是RestTemplate。 –

+0

我終於回到了這個問題,並嘗試了這種方法。但ZuulFallbackProvider是一個靜態回退。是否有任何Zuul,Ribbon或Hystrix將請求重定向到我的備用服務?我不希望它添加到功能區服務器列表中,因爲我希望它作爲最後的手段執行,僅當服務器關閉時纔會執行。 –

+1

如果您不想使用hystrix後退,我認爲另一種可能的方法是製作您自己的完整'路由'或'後置'過濾器。在您的過濾器中,您可以檢查原始請求的結果,然後使用適當的參數將請求轉發給備用服務器。 –

相關問題