java B2B2C電子商務平臺分析之十六----Zuul的容錯回退與高可用

明理蘿發表於2018-12-05

zuul的容錯與回退

之前說到過,使用Hystrix實現微服務的容錯與回退,其實Zuul預設已經整合了Hystrix,使用起來也是比較簡單:


在原有 zuul-gateway 專案的基礎上新增,實現ZuulFallbackProvider介面,並實現getRoute和fallbackResponse方法。願意瞭解原始碼的朋友直接求求交流分享技術:二一四七七七五六三三

import com.google.gson.Gson;
import com.simons.cn.util.CommonEnum;
import com.simons.cn.util.CommonResult;
import org.springframework.cloud.netflix.zuul.filters.route.ZuulFallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
 
@Component
public class UserProviderZuulFallBack implements ZuulFallbackProvider {
 
    private static final String USER_PROVIDER_SERVICE = "user-provider";
 
    @Override
    public String getRoute() {
        return USER_PROVIDER_SERVICE; //返回你需要為哪個微服務提供回退
    }
 
    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
            /**
             * 返回Http狀態碼標識
             */
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }
 
            /**
             * 返回Http狀態碼對應數字:200,詳見HttpStatus
             */
            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }
 
            /**
             *返回Http狀態碼對應中譯:OK,詳見HttpStatus
             */
            @Override
            public String getStatusText() throws IOException {
                return HttpStatus.OK.getReasonPhrase();
            }
 
            @Override
            public void close() {
 
            }
 
            /**
             *body響應體
             */
            @Override
            public InputStream getBody() throws IOException {
                String message = new Gson().toJson(CommonResult.success(CommonEnum.SERVICE_NOT_AVAILABLE.getCode(), CommonEnum.SERVICE_NOT_AVAILABLE.getMessage()));
                return new ByteArrayInputStream(message.getBytes("UTF-8"));
            }
 
            /**
             * 設定HttpHeaders
             */
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                //    MediaType mediaType = new MediaType("application/json;charset=utf-8");  //這是錯誤寫法
                MediaType mediaType = new MediaType("application", "json", Charset.forName("utf-8"));
                headers.setContentType(mediaType);
                return headers;
            }
        };
    }
}

CommonEnum中的列舉(部分):


SERVICE_NOT_AVAILABLE("5001","當前服務不可用,請稍後重試!"),

測試:


啟動zuul-gateway專案和user-provider-eureka、discovery-eureka三個專案,瀏覽器訪問,效果如圖:



關閉user-provider-eureka服務,再訪問,效果如圖:



可以看到,當使用者微服務不可用時候,預設返回了自定義的json。


zuul的高可用策略

一、如果Zuul也註冊到了服務發現元件Eureka上,那麼zuul就已經實現了高可用配置,這種情況和普通的服務消費者和提供者的高可用是一致的;


二、若zuul未註冊到Eureka上,則可以透過Nginx/HAProxy等負載均衡器來將請求分配到zuul的其中一個節點;這點更多的還是負載均衡器的配置。例如nginx的:


整體程式碼結構如下:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31539957/viewspace-2284165/,如需轉載,請註明出處,否則將追究法律責任。

相關文章