本文主要介紹zuul的基本原理和在sprngcloud服務下如何使用
一、簡單介紹
Zuul 是 Netflix OSS 中的一員,是一個基於 JVM 路由和服務端的負載均衡器。提供路由、監控、彈性、安全等方面的服務框架。Zuul 能夠與 Eureka、Ribbon、Hystrix 等組件配合使用。
Zuul 的核心是過濾器,通過這些過濾器我們可以擴展出很多功能,比如:
1)動態路由
動態地將客戶端的請求路由到后端不同的服務,做一些邏輯處理,比如聚合多個服務的數據返回。
2)請求監控
可以對整個系統的請求進行監控,記錄詳細的請求響應日志,可以實時統計出當前系統的訪問量以及監控狀態。
3)認證鑒權
對每一個訪問的請求做認證,拒絕非法請求,保護好后端的服務。
4)壓力測試
壓力測試是一項很重要的工作,像一些電商公司需要模擬更多真實的用戶並發量來保證重大活動時系統的穩定。通過 Zuul 可以動態地將請求轉發到后端服務的集群中,還可以識別測試流量和真實流量,從而做一些特殊處理。
5)灰度發布
灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度。
二、使用Zuul構建微服務網關——路由配置
首先,基於前幾篇springcloud搭建的基礎之上,這里借助了已經注冊進eureka中心的web服務study-web,端口是8002,已添加了一個方法
1、創建一個新的maven項目,這里命名為study-zuul,選中zuul
2、導入依賴
3、添加配置文件,使用Eureka負載路由
注:如果不想依賴於eureka使用zuul,那么可以使用 zuul.routes.study-web.url=http://localhost:8002/
4、啟動類上添加注解 @EnableZuulProxy和@EnableEurekaClient
5、啟動eureka中心,study-web,study-zuul,訪問http://localhost:8005/study-web/hello,結果顯示:
三、Zuul容錯機制超時重試
容錯,簡單來說就是當某個服務不可用時,能夠切換到其他可用的服務上去,也就是需要有重試機制。在 Zuul 中開啟重試機制需要依賴 spring-retry。
1、Spring-cloud中的zuul網關重試機制是使用spring-retry實現的,需要在pom.xml中添加spring-retry
2、配置文件
3、在zuul中可配置的超時時間有兩個位置,ribbon和hystrix,hystrix配置如下:
4、啟動eureka中心、study-zuul,study-web,study-ms,study-toms,訪問http://localhost:8005/study-web/test,ribbon負載兩個服務器
刷新時輪詢顯示:
停掉一個服務器8004之后多次刷新顯示:
總結:沒加重試機制之前,當你請求接口的時候肯定有一次是會被轉發到停掉的服務上去的,返回的是異常信息。
當我們加入了重試機制后,你可以循環請求接口,這個時候不會返回異常信息,因為 Ribbon 會根據重試配置進行重試,當請求失敗后會將請求重新轉發到可用的服務上去。
四,Zuul的回退方法
添加回退方法是因為在通過網關訪問服務器的時候,如果服務器斷開,會直接返回一個回退的信息
1、首先創建一個類,去實現FallbackProvider 接口
package com.study.controller; import com.google.common.collect.ImmutableMap; import com.google.gson.GsonBuilder; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; 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; import java.time.LocalDateTime; @Component public class FallBack implements FallbackProvider { @Override public String getRoute() { return null; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return this.getStatusCode().value(); } @Override public String getStatusText() throws IOException { return this.getStatusCode().getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { String result = new GsonBuilder().create().toJson(ImmutableMap.of("errorCode", 500, "content", "請求失敗", "time", LocalDateTime.now())); return new ByteArrayInputStream(result.getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); MediaType mt = new MediaType("application", "json", Charset.forName("UTF-8")); headers.setContentType(mt); return headers; } }; } }
2、測試,啟動eureka中心、study-zuul,study-web,study-ms,訪問http://localhost:8005/study-web/queryUser
將study-ms服務斷開,刷新顯示會有回退信息:
5、Zuul的過濾器
1)、首先,創建一個新的類,這里命名為MyFilter,繼承ZuulFilter,進而去實現ZuulFilter類里的方法,主要有以下四種方法
filterType()方法是指過濾器類型選擇:
●pre 為路由前
●route 為路由過程中
●post 為路由過程后
●error 為出現錯誤的時候
同時也支持static ,返回靜態的響應,詳情見StaticResponseFilter的實現
filterOrder()方法指的是過濾器的執行順序,數值越小,優先級越高。
shouldFilter()是否通過這個過濾器,默認為true,改成false則不啟用
2)、實現方法
3)、測試,啟動eureka中心、study-zuul,study-web,study-ms,用postman測試,不傳accessToken參數,訪問http://localhost:8005/study-web/queryUser,結果:
傳accessToken參數后,繼續訪問http://localhost:8005/study-web/queryUser,結果顯示: