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

本節探討Zuul的高級特性。spring

TIPS:json

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

過濾器詳解

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

內置過濾器詳解

Zuul內置了不少過濾器,這些過濾器幫助咱們實現各類能力,來分析一下內置過濾器有哪些,分別是幹嗎的。ide

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

爲Zuul提供回退

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

前文已詳細講過通用方式提供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類,並返回服務不可用,請稍後再試。code

高可用

詳見:Zuul的高可用生命週期

實戰技巧

其餘

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

本文首發

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

乾貨分享

全是乾貨哦!

相關文章
相關標籤/搜索