天天看點

微服務springcloud—zuul的容錯和回退zuul的容錯與回退為zuul添加回退

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

微服務springcloud—zuul的容錯和回退zuul的容錯與回退為zuul添加回退

8.關閉項目microservice-provider-user,再次通路http://localhost:8040/users/1,将會看到異常輸出。

微服務springcloud—zuul的容錯和回退zuul的容錯與回退為zuul添加回退

下面來談談如何為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微服務無法正常響應時,将會傳回以下内容。

微服務springcloud—zuul的容錯和回退zuul的容錯與回退為zuul添加回退

本文大部分内容轉載自周立的《Spring Cloud與Docker微服務架構實戰》