本節探討Zuul的高級特性。
TIPS:
筆者已經寫過很多Zuul相關的文章,對於已經寫過的內容,就不再囉嗦一遍了,直接貼地址吧。
過濾器詳解
過濾器是Zuul的核心,Zuul大多功能都是基於過濾器實現的。詳見:Spring Cloud Zuul過濾器詳解,文章着重探討了Zuul過濾器的生命週期、如何自定義過濾器、如何禁用指定過濾器等。
內置過濾器詳解
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的高可用
實戰技巧
- 如何配置Zuul的Hystrix線程池
- Spring Cloud限流詳解 ,裏面談到基於Zuul的限流。
其他
雖然是基於Edgware寫的,但Finchley版本依然適用。
本文首發
http://www.itmuch.com/spring-cloud/finchley-18/