天天看點

跟我學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,可前往如下文章複習。
  • 跟我學Spring Cloud(Finchley版)-13-通用方式使用Hystrix
  • 跟我學Spring Cloud(Finchley版)-14-Feign使用Hystrix
/**
 * @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的高可用

實戰技巧

  • 如何配置Zuul的Hystrix線程池
  • Spring Cloud限流詳解 ,裡面談到基于Zuul的限流。

其他

  • Spring Cloud Edgware新特性之四:Zuul routes端點功能增強
  • Spring Cloud Edgware新特性之五:filters端點

本文首發

幹貨分享