您好,登錄后才能下訂單哦!
這篇文章主要介紹“SpringCloud微服務網關Zuul的作用是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“SpringCloud微服務網關Zuul的作用是什么”文章能幫助大家解決問題。
微服務架構中,服務實例的地址可能經常會發生變化,所以我們不能直接將服務的地址暴露出來。如果每一個微服務都直接暴露接口,會導致一系列的問題,比如調用過于復雜,涉及到賬戶、權限不能統一處理等。另外基于高內聚低耦合的設計準則來講,我們也應該將內部系統和外部系統做切割。
因此,這時就需要有一個獨立的組件來處理外部的請求,這個組件就是服務網關。服務網關就是為了簡化前端的調用邏輯,通常情況下也會實現相關的認證邏輯,根據外部不同的請求響應不同的數據,從而簡化內外部系統之間調用的復雜度。
服務網關負責服務請求路由、組合及協議轉換。客戶端的所有請求都首先經過服務網關,然后由它將請求路由到合適的微服務。服務網關經常會通過調用多個微服務并合并結果來處理一個請求,它可以在系統外部與內部響應之間友好的轉換。
本文將先著重介紹Zuul組件。
Zuul 是 Netflix 公司開源的產品,被稱為第一代網關,也是 Spring Cloud 前幾個版本默認使用的一款提供動態路由微服務網關組件。Zuul 接收所有外來請求,并將請求轉發到對應的后端服務。作為一個前置服務,Zuul 旨在實現動態路由,監控,彈性和安全性等功能。
Zuul 提供了不同類型的 filter 用于處理請求,這些 filter 可以讓我們實現以下功能:
權限控制和安全性:可以識別認證需要的信息和拒絕不滿足條件的請求。
監控:與邊緣位置追蹤有意義的數據和統計結果,從而帶來精確的生產視圖。
動態路由:根據需要動態地路由請求到后臺的不同集群。
壓力測試:逐漸增加指向集群的流量,以了解性能。
負載均衡:為每一種負載類型分配對應容量,并棄用超出限定值的請求
靜態資源處理:直接在 zuul 處理靜態資源的響應,從而避免其轉發到內部集群。
之前的介紹中,我們啟動了注冊中心registry,dms服務,和app服務,請求時,直接調用了app服務的接口,app服務又調用了dms服務:
加上網關服務之后,就會變成如下:
接下來,我們創建zuul服務:
創建子模塊zuul,pom.xml引入eureka-client 和zuul的依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- feign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- zuul路由 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
server:
port: 8004
spring:
application:
name: zuuleureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
feign:
hystrix:
enabled: true
zuul:
routes:
app: #活動
path: /app/** #配置請求URL的請求規則
serviceId: app #指定Eureka注冊中心中的服務id
dms: #活動
path: /dms/** #配置請求URL的請求規則
serviceId: dms #指定Eureka注冊中心中的服務id
logging:
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'
public class MyZuulFilter extends ZuulFilter { // pre :可以在請求被路由之前調用 // route :在路由請求時候被調用 // post :在route和error過濾器之后被調用 // error :處理請求時發生錯誤時被調用 @Override public String filterType() { return "pre";// 前置過濾器 } //通過int值來定義過濾器的執行順序,優先級為0,數字越大,優先級越低 @Override public int filterOrder() { return 0; } //返回一個boolean類型來判斷該過濾器是否要執行,所以通過此函數可實現過濾器的開關 @Override public boolean shouldFilter() { return true;//此處為true,說明需要過濾 } //過濾器的具體邏輯。 @Override public Object run() throws ZuulException { // 獲取上下文 RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest request = currentContext.getRequest(); String accessToken = request.getParameter("accessToken"); if (StringUtils.isEmpty(accessToken)) { //setSendZuulResponse(false)令zuul過濾該請求,不進行路由 currentContext.setSendZuulResponse(false); //設置返回的錯誤碼 currentContext.setResponseStatusCode(401); currentContext.setResponseBody("AccessToken is null"); return null; } System.out.println("獲取到AccessToken為:"+accessToken); // 否則正常執行業務邏輯..... return null; } }
注意增加@EnableZuulProxy注解
@EnableZuulProxy @EnableEurekaClient @SpringBootApplication public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
這個時候,我們將直接請求app的接口地址,改成網關zuul的地址和端口:http://localhost:8004/app/index
關于“SpringCloud微服務網關Zuul的作用是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。