SpringCloud (GreenwichR2) 第三章 Gateway 入門 附原始碼
官方檔案
為什麼需要它???
如果讓客戶端直接與各個微服務通訊,會有以下的問題:
- 客戶端會多次請求不同的微服務,增加了客戶端的複雜性。
- 存在跨域請求,在一定場景下處理相對複雜。
- 認證複雜,每個服務都需要獨立認證。
- 難以重構,隨著專案的迭代,可能需要重新劃分微服務。例如,可能將多個服務合併成一個或者將一個服務拆分成多個。如果客戶端直接與微服務通訊,那麼重構將會很難實施。
- 某些微服務可能使用了防火牆 / 瀏覽器不友好的協議,直接訪問會有一定的困難。
so 我們需要一個閘道器能統一處理這些問題,包括授權、限流、日誌、安全等系統常用功能。
Gateway必須掌握的
- 路由:路由閘道器的基本構建塊。它由ID,目標URI,謂詞集合和過濾器集合定義。如果聚合謂詞為真,則匹配路由。
- 謂詞:這允許開發人員匹配來自HTTP請求的任何內容,例如標頭或引數。
- 過濾器:這些是使用特定工廠構建的Spring FrameworkGatewayFilter例項。這裡,可以在傳送下游請求之前或之後修改請求和響應。
gateway在微服務中扮演角色就是一個優秀的"皇宮護衛"吧
摘抄下網路的的原理圖吧
接著我們建立一個Gateway模組
這邊還是接著第二章的Demo開始,選中scloud專案,右擊 New - Module - Spring Initializr
next
選擇兩個依賴包Gateway 和 Euraka Discovery Client
接著 我們還是和上一章建立服務消費者一樣 修改pom.xml 和 application.yml(這邊我把預設的.properties修改成.yml檔案)
application.yml 內容如下
在啟動類加入註解
@SpringBootApplication
@EnableEurekaClient
public class EurekaGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaGatewayApplication.class,args);
}
}複製程式碼
好了到此為止閘道器應該搭建結束了
我們以此啟動eureka_server模組,eureka_client模組,eureka_consumer_openfeign 模組,eureka_gateway模組。
問題來了,當啟動eureka_gateway模組的時候報錯了!
一個警告:
**********************************************************
Spring MVC found on classpath,which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency.
**********************************************************
複製程式碼
報錯部分截圖:
經過搜尋各大論壇,說是spring-cloud-starter-gateway 和 spring-boot-starter-web 都用了webflux架包產生衝突!
解決方法:對我這個專案,就是把 spring-boot-starter-web 不放入主pom.xml引用,各個模組自己依賴spring-boot-starter-web,主pom.xml修改如下
最終gateway 的 pom.xml 包如下
我們在啟動eureka_gateway 模組,OK,現在全部啟動起來了
訪問下 http://localhost:8666 看下注冊的服務,都有了。
現在我們從瀏覽器閘道器埠訪問服務 http://localhost:8671/test/sayHello/world (8671 後面的路徑也就是服務消費者提供的Restful api)
至此,閘道器已經通了,就這麼簡單???
當然不是!!!現在只是走通請求,還有...
Predicate Factory (表明在哪種條件下,該路由配置生效)
GatewayFilter Factory (用於過濾請求,比較複雜)
除了本身的一些特性學習外,閘道器這個模組還需要整合斷路器Hystrix、Security(認證、授權)、token 等,內容還是比較多且豐富的,為了條例清晰些節約每個內容的篇幅,下一節在記錄下Predicate Factory的使用。
原始碼地址:gitee.com/dolan/sclou…
切換到分支 f_gateway !!!