本節探討Zuul的高級特性。spring
TIPS:json
筆者已經寫過不少Zuul相關的文章,對於已經寫過的內容,就再也不囉嗦一遍了,直接貼地址吧。後端
過濾器是Zuul的核心,Zuul大多功能都是基於過濾器實現的。詳見:Spring Cloud Zuul過濾器詳解,文章着重探討了Zuul過濾器的生命週期、如何自定義過濾器、如何禁用指定過濾器等。app
Zuul內置了不少過濾器,這些過濾器幫助咱們實現各類能力,來分析一下內置過濾器有哪些,分別是幹嗎的。ide
詳見:Spring Cloud內置的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/