本節探讨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端點