跟我學Spring Cloud(Finchley版)-18-Zuul深入

本節探討Zuul的高級特性。

TIPS:

筆者已經寫過很多Zuul相關的文章,對於已經寫過的內容,就不再囉嗦一遍了,直接貼地址吧。

過濾器詳解

過濾器是Zuul的核心,Zuul大多功能都是基於過濾器實現的。詳見:Spring Cloud Zuul過濾器詳解,文章着重探討了Zuul過濾器的生命週期、如何自定義過濾器、如何禁用指定過濾器等。

內置過濾器詳解

Zuul內置了很多過濾器,這些過濾器幫助我們實現各種能力,來分析一下內置過濾器有哪些,分別是幹嘛的。

詳見:Spring Cloud內置的Zuul過濾器詳解

爲Zuul提供回退

跟我學Spring Cloud(Finchley版)-16-Zuul 講過,Zuul整合了Hystrix,而Hystrix提供fallback的能力。

前文已詳細講過通用方式提供fallback、Feign提供fallback。如果不記得如何提供Fallback,可前往如下文章複習。

/**
 * @author itmuch.com
 */
@Component
public class MyFallbackProvider implements FallbackProvider {
  @Override
  public String getRoute() {
    // 表明是爲哪個微服務提供回退,*表示爲所有微服務提供回退
    return "*";
  }

  @Override
  public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
    if (cause instanceof HystrixTimeoutException) {
      return response(HttpStatus.GATEWAY_TIMEOUT);
    } else {
      return this.fallbackResponse();
    }
  }

  public ClientHttpResponse fallbackResponse() {
    return this.response(HttpStatus.INTERNAL_SERVER_ERROR);
  }

  private ClientHttpResponse response(final HttpStatus status) {
    return new ClientHttpResponse() {
      @Override
      public HttpStatus getStatusCode() throws IOException {
        return status;
      }

      @Override
      public int getRawStatusCode() throws IOException {
        return status.value();
      }

      @Override
      public String getStatusText() throws IOException {
        return status.getReasonPhrase();
      }

      @Override
      public void close() {
      }

      @Override
      public InputStream getBody() throws IOException {
        return new ByteArrayInputStream("服務不可用,請稍後再試。".getBytes());
      }

      @Override
      public HttpHeaders getHeaders() {
        // headers設定
        HttpHeaders headers = new HttpHeaders();
        MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));
        headers.setContentType(mt);
        return headers;
      }
    };
  }
}

這樣,當Zuul後端服務發生異常時,就會進到該Fallback類,並返回服務不可用,請稍後再試。

高可用

詳見:Zuul的高可用

實戰技巧

其他

雖然是基於Edgware寫的,但Finchley版本依然適用。

本文首發

http://www.itmuch.com/spring-cloud/finchley-18/

乾貨分享

全是乾貨哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章