簡體   English   中英

Spring Cloud Zuul 回退服務

[英]Spring Cloud Zuul fallback service

是否可以設置到主服務器/服務器/服務的代理,但是當這不可用時,將請求重定向到輔助服務器/服務器/服務?

次要服務不是與主要服務相同類型的實例。 它們的 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

謝謝。

您可以使用ZuulFallbackProvider做到這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/

上面的配置是使用Ribbon,沒有eureka。 你可以在這里找到詳細信息

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

在 ZuulFallbackProvider 中,您可以向http://server2:8080/whateverApi2.發出回退請求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();
            }
        };
    }
}

如果有人試圖做類似的事情,那么真正有效的是 Hystrix 而不是 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 接口,每個接口都指向每個服務端點。

就是這樣! 如果您關閉主服務,網關 API 將開始調用回退服務,而不會返回任何不可用的服務,更改只需幾毫秒。

此外,如果您重新打開它,它也會在准備好幾毫秒后重新響應。

需要添加可重試

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

類似情況

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM