springCloud (一)gateway (整理&轉發)
Spring Cloud Gateway
是基于 Spring5.0、SpringBoot2.0 和 Project Reactor 開發的網關,旨在提供一種簡單而有效的方式來對 API 進行路由,基于過濾器鏈的方式提供:安全,監控 / 埋點,和限流。
Spring Cloud Gateway 基于 Spring Boot2.x、Spring WebFlux 和 Project Reactor 構建,屬于異步非阻塞模型。
Spring Cloud Gateway 的目標,不僅提供統一的路由方式,并且基于 Filter 鏈的方式提供了網關基本的功能,例如:安全,監控/指標,和限流。
核心觀念
(1)Route(路由):
網關配置的基本組成模塊,和Zuul的路由配置模塊類似。一個Route模塊由一個 ID,一個目標 URI,一組斷言和一組過濾器定義。如果斷言為真,則路由匹配,目標URI會被訪問。
單個 URI 的地址的 schema 協議,一般為 http 或者 https 協議。 和注冊中心相結合的路由配置的 schema 協議部分為自定義的 lb: 類型,表示從微服務注冊中心(如 Eureka)訂閱服務,并且進行服務的路由。
(2)Predicate(斷言):
這是一個 Java 8 的 Predicate,可以使用它來匹配來自 HTTP 請求的任何內容,例如 headers 或參數。斷言的輸入類型是一個 ServerWebExchange。
路由匹配規則, Predicates 工廠通過不同的 HTTP 請求參數來匹配,多個 Predicates 工廠可以組合使用。
路由謂詞工廠(Route Predicate Factories)
| 類型 | 路由謂詞 | 路由謂詞工廠 | 描述 |
|---|---|---|---|
| 時間相關 | After | AfterRoutePredicateFactory | 在某個時間之后的請求才會被轉發,如:`- After=2017-01-20T17:42:47.789-07:00 [America/Denver]` |
| Before | BeforeRoutePredicateFactory | 在某個時間之前的請求才會被轉發,如:`- Before=2017-01-20T17:42:47.789-07:00 [America/Denver]` | |
| Between | BetweenRoutePredicateFactory | 在某個時間段之間的才會被轉發,如:`- Between=2017-01-20T17:42:47.789-07:00 [America/Denver], 2017-01-21T17:42:47.789-07:00 [America/Denver]` | |
| Cookie 相關 | Cookie | CookieRoutePredicateFactory | `- Cookie=chocolate, ch.p` 名為 chocolate 的表單或者滿足正則 ch.p 的表單才會被匹配到進行請求轉發 |
| Header 相關 | Header | HeaderRoutePredicateFactory | `- Header=X-Request-Id, \d+` 攜帶參數 X-Request-Id 或者滿足 \d + 的請求頭才會匹配 |
| Host | HostRoutePredicateFactory | `- Host=**.somehost.org,**.anotherhost.org` 當主機名為 somehost.org 或 anotherhost.org 的時候才會被轉發 | |
| 請求相關 | Method | MethodRoutePredicateFactory | `- Method=GET,POST` 只有 GET 和 POST 方法才會匹配轉發請求 |
| Path | PathRoutePredicateFactory | `- Path=/red/{segment},/blue/{segment}` 當請求的路徑為 /red/、/blue/ 開頭的時才會被轉發 | |
| Query | QueryRoutePredicateFactory | `- Query=green` 只要請求中包含 green 參數即可 | |
| RemoteAddr | RemoteAddrRoutePredicateFactory | `- RemoteAddr=192.168.1.1/24` 主機 IP | |
| Weight | WeightRoutePredicateFactory | `- Weight=group1, 2` 權重是按組計算的,兩個參數:group 和 weight(int) |
(3)Filter(過濾器):
可以使用它攔截和修改請求,并且對上游的響應,進行二次處理。過濾器為org.springframework.cloud.gateway.filter.GatewayFilter類的實例。
StripPrefix網關過濾器工廠采用一個參數StripPrefix。 StripPrefix參數表示在將請求發送到下游之前從請求中剝離的路徑個數。
PrefixPath 過濾器,它的作用和StripPrefix正相反,是在URL路徑前面添加一部分的前綴。
工作流程

客戶端向 Spring Cloud Gateway 發出請求。 由網關處理程序 Gateway Handler Mapping 映射確定請求與路由匹配,則將其發送到網關 Web 處理程序 Gateway Web Handler。 Web 處理程序通過指定的過濾器鏈將請求發送到我們實際的服務執行業務邏輯,然后返回。 過濾器被虛線分隔的原因是過濾器可以在發送代理請求之前和之后運行邏輯。執行所有 pre 過濾器邏輯,然后發出代理請求;發出代理請求后,將運行 post 過濾器邏輯。
相關配置示例:
spring:
redis:
host: localhost
port: 6379
password:
cloud:
gateway:
discovery:
locator: # 是否與服務發現組件進行結合,通過 serviceId 轉發到具體的服務實例。
lowerCaseServiceId: true # 將請求路徑的服務名配置改成小寫
enabled: true #默認為false,設為true便開啟通過服務中心的自動根據 serviceId 創建路由的功能
routes:
# 認證中心
- id: aei-auth #### 自定義的路由 ID,保持唯一性
uri: lb://aei-auth ### 從注冊中心獲取服務,且以lb(load-balance)負載均衡方式轉發,請求schema一般是http或https
predicates:
- Path=/auth/** ### 將以/auth/開頭的請求轉發到uri為lb://aei-auth的地址上
filters: ##過濾器攔截處理
# 驗證碼處理
- CacheRequestFilter
- ValidateCodeFilter
- StripPrefix=1 #將請求發送到下游之前從請求中剝離的1個路徑,比如外部請求的url(比如http:/192.168.1.1/auth/login)最后轉發到注冊中心的服務為:lb://aei-auth/login
參考學習網址:
網關配置 https://my.oschina.net/chaoo/blog/5291146
SpringCloud gateway (史上最全) https://blog.csdn.net/a1036645146/article/details/106383883
備注:以上信息僅個人學習整理,部分內容摘抄優秀博主

浙公網安備 33010602011771號