springCloud(16):使用Zuul構建微服務網關-容錯回退與高可用

1、容錯與回退java

1.一、容錯spring

在Spring Cloud中,Zuul默認已經整合了Hystrix。json

測試:後端

 a、依次啓動eureka-server(4010)、provide-user(4011)、hystrix-consumer-movie(5012)、microservice-gateway-zuul(5016)、hystrix-dashboard(5013)app

 b、訪問http://localhost:5016/hystrix-consumer-movie/user/1,可正常獲取結果負載均衡

 c、訪問http://localhost:5016/hystrix.stream,可獲取監控數據maven

 d、訪問http://localhost:5013/hystrix,並在監控地址欄上填寫http://localhost:5016/hystrix.streamide

   wKiom1meQMLwlBE5AACDHygJFG8679.png

   總結:Zuul的Hystrix監控的粒度是微服務,而不是某個API;同時也說明,全部通過Zuul的請求,都會被Hystrix保護起來微服務

 e、關閉hystrix-consumer-movie,再次訪問http://localhost:5016/hystrix-consumer-movie/user/1,將會出現異常。那麼如何爲zuul實現回退呢?測試

1.二、爲Zuul添加回退

要爲Zuul添加回退,須要實現ZuulFallBackProvider接口。在實現類中指定爲哪一個微服務提供回退,並提供一個ClientHttpResponse做爲回退響應。

a、新建一個maven工程、添加zuul依賴,此處端口爲5018

b、新建回退類

package com.liuy.fallback;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

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;

/**
 * 電影微服務添加回退
 * @description 電影微服務添加回退
 * @author luis
 * @version 1.0
 * @date:2017年8月24日上午11:11:23
 */
@Component
public class MovieFallBack implements ZuulFallbackProvider {

    @Override
    public String getRoute() {
        // 代表是哪一個微服務提供回退
	return "hystrix-consumer-movie";
    }

    @Override
    public ClientHttpResponse fallbackResponse() {
        return new ClientHttpResponse() {
	    @Override
	    public HttpHeaders getHeaders() {
	        // headers設定
		HttpHeaders headers = new HttpHeaders();
		MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8"));
		headers.setContentType(mt);
		return headers;
	    }
			
	    @Override
	    public InputStream getBody() throws IOException {
	        // 響應體
		return new ByteArrayInputStream("電影微服務不可用,請稍後再試。".getBytes());
	    }
			
	    @Override
	    public String getStatusText() throws IOException {
	        // 狀態文本,此處返的OK,詳見HttpStatus
		return this.getStatusCode().getReasonPhrase();
	    }
			
	    @Override
	    public HttpStatus getStatusCode() throws IOException {
	        // fallback時的狀態碼
	        return HttpStatus.OK;
	    }
			
	    @Override
	    public int getRawStatusCode() throws IOException {
	        // 數字類型的狀態碼,此處返的200,詳見HttpStatus
	        return this.getStatusCode().value();
	    }
			
	    @Override
	    public void close() {
	    }
	};
    }
}

c、關閉hystrix-consumer-movie,再次訪問http://localhost:5018/hystrix-consumer-movie/user/1

 wKiom1mlEsKAtzXHAAAU3qXOuB4043.png

2、Zuul的高可用

zuul的高可用很是關鍵,由於外部請求到後端微服務的流量都會通過Zuul。在生產環境中通常都須要部署高可用的Zuul以免單點故障。

2.一、Zuul客戶端註冊到了Eureka Server上

這種狀況下,Zuul的高可用很是簡單,只須將多個Zuul節點註冊到Eureka Server上,就可實現Zuul的高可用。此時,Zuul的高可用與其它微服務的高可用沒啥區別。


當Zuul客戶端也註冊到Eureka Server上時,只須部署多個Zuul節點便可實現高可用。Zuul客戶端會自動從Eureka Server上查詢Zuul Server的列表,並使用Ribbon負載均衡的請求Zuul集羣。

 wKiom1mlGDjxdU2kAABl7tsigck885.png

2.二、Zuul客戶端沒有註冊到Eureka Server上

這種狀況可用使用負載均衡器來實現Zuul高可用,如:Nginx


Zuul客戶端將請求發送到負載均衡器上,而後負載均衡器將請求轉發到其代理的其中一個Zuul節點,這樣也能夠實現Zuul的高可用。

相關文章
相關標籤/搜索