為什么80%的碼農都做不了架構師?>>> ??
Spring Cloud Edgware對Hystrix回退的邏輯進行了一些改進。本文將信息探討新舊版本的回退操作,并分析的原因及改進后的優勢。
Dalston及更低版本
對于Dalston及更低版本,要想為Zuul提供回退,只需編寫代碼如下:
@Component
public class MyFallbackProvider implements ZuulFallbackProvider {@Overridepublic String getRoute() {// 表明是為哪個微服務提供回退,*表示為所有微服務提供回退return "*";}@Overridepublic ClientHttpResponse fallbackResponse() {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {// fallback時的狀態碼return HttpStatus.OK;}@Overridepublic int getRawStatusCode() throws IOException {// 數字類型的狀態碼,本例返回的其實就是200,詳見HttpStatusreturn this.getStatusCode().value();}@Overridepublic String getStatusText() throws IOException {// 狀態文本,本例返回的其實就是OK,詳見HttpStatusreturn this.getStatusCode().getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {// 響應體return new ByteArrayInputStream("用戶微服務不可用,請稍后再試。".getBytes());}@Overridepublic HttpHeaders getHeaders() {// headers設定HttpHeaders headers = new HttpHeaders();MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));headers.setContentType(mt);return headers;}};}
}
Edgware及更高版本
@Component
public class MyFallbackProvider implements FallbackProvider {@Overridepublic String getRoute() {// 表明是為哪個微服務提供回退,*表示為所有微服務提供回退return "*";}@Overridepublic ClientHttpResponse fallbackResponse(Throwable cause) {if (cause instanceof HystrixTimeoutException) {return response(HttpStatus.GATEWAY_TIMEOUT);} else {return this.fallbackResponse();}}@Overridepublic ClientHttpResponse fallbackResponse() {return this.response(HttpStatus.INTERNAL_SERVER_ERROR);}private ClientHttpResponse response(final HttpStatus status) {return new ClientHttpResponse() {@Overridepublic HttpStatus getStatusCode() throws IOException {return status;}@Overridepublic int getRawStatusCode() throws IOException {return status.value();}@Overridepublic String getStatusText() throws IOException {return status.getReasonPhrase();}@Overridepublic void close() {}@Overridepublic InputStream getBody() throws IOException {return new ByteArrayInputStream("服務不可用,請稍后再試。".getBytes());}@Overridepublic HttpHeaders getHeaders() {// headers設定HttpHeaders headers = new HttpHeaders();MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));headers.setContentType(mt);return headers;}};}
}
分析
由代碼可知:
- Dalston及更低版本通過實現
ZuulFallbackProvider
接口,從而實現回退; - Edgware及更高版本通過實現
FallbackProvider
接口,從而實現回退。 - 在Edgware中:
- FallbackProvider是ZuulFallbackProvider的子接口。
- ZuulFallbackProvider已經被標注
Deprecated
,很可能在未來的版本中被刪除。 - FallbackProvider接口比ZuulFallbackProvider多了一個
ClientHttpResponse fallbackResponse(Throwable cause);
方法,使用該方法,可獲得造成回退的原因。
- 筆者將在下一篇文章詳細總結在Spring Cloud中如何獲得造成回退原因的各種姿勢。