zuul的容錯與回退
1.啟動項目microservice-discovery-eureka。
2.啟動項目microservice-provider-user。
3.啟動項目microservice-gateway-zuul。
4.啟動項目microservice-hystrix-dashboard。
5.通路http://localhost:8040/users/1,可正常獲得結果。
6.通路http://localhost:8040/actuator/hystrix.stream,可獲得Hystrix的監控資料。
7.通路http://localhost:8030/hystrix,并在監控位址一欄填入http://localhost:8040/actuator/hystrix.stream
8.關閉項目microservice-provider-user,再次通路http://localhost:8040/users/1,将會看到異常輸出。
下面來談談如何為zuul添加回退
為zuul添加回退
想要為Zuul添加回退,需要實作ZuulFallbackProvider接口,在實作類中,指定為哪個微服務提供回退,并提供一個ClientHttpResponse作為回退響應。
1.複制項目microservice-gateway-zuul,将ArtifactId修改為microservice-gateway-zuul-fallback。
2.編寫zuul的回退類:
@Component
public class UserFallbackProvider implements FallbackProvider {
public String getRoute(){
//表明是為哪個微服務提供回退,"*"表示所有微服務
return "*";
}
public ClientHttpResponse fallbackResponse(String route, Throwable cause){
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() throws IOException {
//fallback時的狀态碼
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
//數字類型的狀态碼,本例傳回的其實就是200
return this.getStatusCode().value();
}
@Override
public String getStatusText() throws IOException {
//狀态文本,本例傳回的其實就是OK
return this.getStatusCode().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;
}
};
}
}
spring2.0以上版本參考:https://www.2cto.com/kf/201806/754248.html
添加回退之後,重複之前的實驗,當users微服務無法正常響應時,将會傳回以下内容。
本文大部分内容轉載自周立的《Spring Cloud與Docker微服務架構實戰》