曾夢想執劍走天涯,我是程序猿【AK】
目錄
- 簡述概要
- 知識圖譜
- 什么是SpringCloudGateway
- 功能特征
- 應用場景
- 核心概念
- 配置文件
- 工作原理
- 路由謂詞工廠(內置的)
- [After 路由謂詞工廠](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-after-route-predicate-factory)
- Before 路由謂詞工廠
- 路由之間謂詞工廠
- Cookie 路由謂詞工廠
- 標頭路由謂詞工廠
- 主機路由謂詞工廠
- 方法路由謂詞工廠
- 路徑路由謂詞工廠
- 查詢路由謂詞工廠
- RemoteAddr 路由謂詞工廠
- 修改遠程地址解析方式
- 權重路由謂詞工廠
- XForwarded 遠程地址路由謂詞工廠
簡述概要
了解SpringCloud Gateway微服務網關
知識圖譜
什么是SpringCloudGateway
- Spring Cloud官方推出的第二代網關框架,定位于取代Netflix Zuul。相比Zuul來說,Spring Cloud Gate提供更優秀的性能,更強大的功能。(Zuul1.x是同步阻塞的設計,性能低,但2.x版本也基于Netty,zuul2.x版本與springcloudgateway性能差距其實不大)
- 由WebFlux+Netty+Reactor實現的響應式的API網關。它不能在傳統的servlet容器中工作,也不能構建成war包。
- 目的為微服務架構提供一種簡單且有效的API路由的管理方式,并給予Fliter的方式提供網關的基本功能,例如安全認證、監控、限流等。
功能特征
- 基于 Spring 框架和 Spring Boot 構建
- 能夠匹配任何請求屬性上的路由。
- 謂詞(Predicate)和過濾器(Fliter)特定于路由。
- 斷路器集成(Sentinel、Hystrix)
- Spring Cloud Discovery客戶端集成(Nacos、Eruka)
- 易于編寫謂詞和過濾器
- 請求速率限制
- 路徑重寫
應用場景
全局性流控
日志統計
防止SQL注入
防止Web攻擊
屏蔽工具掃描
黑白IP名單
證書加解密處理
服務級別流控
服務降級與熔斷
路由與負載均衡、灰度策略
服務過濾、聚合與發現
權限驗證與用戶等級策略
業務規則與參數檢驗
多級緩存策略
核心概念
- 路由(route)
路由是網關中最基礎的部分,路由信息包括一個ID、一個目的URI、一組斷言工廠、一組Filter組成、如果斷言為真則說明請求的URL和配置的路由匹配。
- 斷言(predicates)
Java8中的斷言函數,SpringCloudGateway中的斷言函數類型是spring5.0框架中的ServerWebExchange。斷言函數允許開發者去定義匹配Http request中的任何信息,比如請求頭和參數等。
- 過濾器(Filter)
SpringCloudGateway中的filter分為Gateway Filter和Global Fliter、Filter可以對請求和響應進行處理。
配置文件
spring:cloud:# Spring Cloud Gateway 配置項,對應 GatewayProperties 類gateway:# 路由配置項,對應 RouteDefinition 數組routes:## 各個微服務- id: system-admin-api # 路由的服務唯一編號uri: grayLb://system-serverpredicates: # 斷言,作為路由的匹配條件,對應 RouteDefinition 數組- Path=/admin-api/system/**filters:- RewritePath=/admin-api/system/v3/api-docs, /v3/api-docs # 配置,保證轉發到 /v3/api-docs- id: system-app-api # 路由的編號uri: grayLb://system-serverpredicates: # 斷言,作為路由的匹配條件,對應 RouteDefinition 數組- Path=/app-api/system/**filters:- RewritePath=/app-api/system/v3/api-docs, /v3/api-docs
工作原理
客戶端向 Spring Cloud Gateway 發出請求。如果網關處理程序映射確定請求與路由匹配,則會將其發送到網關 Web 處理程序。該處理程序通過特定于請求的過濾器鏈運行請求。過濾器被虛線分開的原因是過濾器可以在發送代理請求之前和之后運行邏輯。執行所有“預”過濾器邏輯。然后發出代理請求。發出代理請求后,將運行“post”過濾器邏輯。
路由謂詞工廠(內置的)
Spring Cloud Gateway 將路由作為 Spring WebFluxHandlerMapping基礎設施的一部分進行匹配。Spring Cloud Gateway 包含許多內置的路由謂詞工廠。所有這些謂詞都匹配 HTTP 請求的不同屬性。您可以將多個路由謂詞工廠與邏輯and語句組合起來。
After 路由謂詞工廠
路由謂詞工廠After采用一個參數 a datetime(它是一個 java ZonedDateTime)。此謂詞匹配指定日期時間之后發生的請求。以下示例配置后路由謂詞:
spring:cloud:gateway:routes:- id: after_routeuri: https://example.orgpredicates:- After=2017-01-20T17:42:47.789-07:00[America/Denver]
Before 路由謂詞工廠
路由謂詞工廠Before采用一個參數 a datetime(它是一個 java ZonedDateTime)。該謂詞匹配在指定的 之前發生的請求datetime。以下示例配置 before 路由謂詞:
spring:cloud:gateway:routes:- id: before_routeuri: https://example.orgpredicates:- Before=2017-01-20T17:42:47.789-07:00[America/Denver]
路由之間謂詞工廠
路由謂詞工廠Between有兩個參數,datetime1它們datetime2 是javaZonedDateTime對象。datetime1該謂詞匹配 之前和之后發生的請求datetime2。參數datetime2必須在 后面datetime1。以下示例配置了 Between 路由謂詞:
spring:cloud:gateway:routes:- id: between_routeuri: https://example.orgpredicates:- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie 路由謂詞工廠
路由Cookie謂詞工廠采用兩個參數:cookiename和 a regexp(這是一個 Java 正則表達式)。此謂詞匹配具有給定名稱且其值與正則表達式匹配的 cookie。以下示例配置 cookie 路由謂詞工廠:、
spring:cloud:gateway:routes:- id: cookie_routeuri: https://example.orgpredicates:- Cookie=chocolate, ch.p
標頭路由謂詞工廠
路由Header謂詞工廠采用兩個參數:theheader和 a regexp(這是一個 Java 正則表達式)。此謂詞與具有給定名稱且其值與正則表達式匹配的標頭匹配。以下示例配置標頭路由謂詞:
spring:cloud:gateway:routes:- id: header_routeuri: https://example.orgpredicates:- Header=X-Request-Id, \d+
主機路由謂詞工廠
路由謂詞工廠Host采用一個參數:主機名列表patterns。該模式是 Ant 風格的模式,以.為分隔符。該謂詞匹配Host與模式匹配的標頭。以下示例配置主機路由謂詞:
spring:cloud:gateway:routes:- id: host_routeuri: https://example.orgpredicates:- Host=**.somehost.org,**.anotherhost.org
方法路由謂詞工廠
路由Method謂詞工廠采用一個methods參數,該參數是一個或多個參數:要匹配的 HTTP 方法。以下示例配置方法路由謂詞:
spring:cloud:gateway:routes:- id: method_routeuri: https://example.orgpredicates:- Method=GET,POST
路徑路由謂詞工廠
路由Path謂詞工廠采用兩個參數:一個 Spring 列表PathMatcher patterns和一個名為 的可選標志matchTrailingSlash(默認為true)。以下示例配置路徑路由謂詞:
spring:cloud:gateway:routes:- id: path_routeuri: https://example.orgpredicates:- Path=/red/{segment},/blue/{segment}
如果請求路徑是,則此路由匹配,例如:/red/1or /red/1/or /red/blueor /blue/green。
如果matchTrailingSlash設置為,則不會匹配false請求路徑。/red/1/
該謂詞提取 URI 模板變量(例如segment,在前面的示例中定義的)作為名稱和值的映射,并將其放置在 中,ServerWebExchange.getAttributes()并使用 中定義的鍵ServerWebExchangeUtils.URI_TEMPLATE_VARIABLES_ATTRIBUTE。這些值可供GatewayFilter工廠使用
可以使用實用程序方法(稱為get)來更輕松地訪問這些變量。以下示例展示了如何使用該get方法:
Map<String, String> uriVariables = ServerWebExchangeUtils.getUriTemplateVariables(exchange);String segment = uriVariables.get("segment");
查詢路由謂詞工廠
路由Query謂詞工廠有兩個參數:一個必需參數param和一個可選參數regexp(這是一個 Java 正則表達式)。以下示例配置查詢路由謂詞:
spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=green
如果請求包含green查詢參數,則前面的路由匹配。
spring:cloud:gateway:routes:- id: query_routeuri: https://example.orgpredicates:- Query=red, gree.
RemoteAddr 路由謂詞工廠
路由RemoteAddr謂詞工廠采用 的列表(最小大小為 1)sources,它們是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址,16是子網掩碼)。以下示例配置 RemoteAddr 路由謂詞:
spring:cloud:gateway:routes:- id: remoteaddr_routeuri: https://example.orgpredicates:- RemoteAddr=192.168.1.1/24
修改遠程地址解析方式
默認情況下,RemoteAddr 路由謂詞工廠使用傳入請求中的遠程地址。如果 Spring Cloud Gateway 位于代理層后面,這可能與實際的客戶端 IP 地址不匹配。
您可以通過設置自定義來自定義遠程地址的解析方式RemoteAddressResolver。Spring Cloud Gateway 附帶一個非默認遠程地址解析器,該解析器基于X-Forwarded-For 標頭, XForwardedRemoteAddressResolver。
XForwardedRemoteAddressResolver有兩個靜態構造函數方法,它們采用不同的安全方法:
- XForwardedRemoteAddressResolver::trustAll返回RemoteAddressResolver始終采用X-Forwarded-For標頭中找到的第一個 IP 地址的 a。這種方法很容易受到欺騙,因為惡意客戶端可以為 設定一個初始值X-Forwarded-For,該值將被解析器接受。
- XForwardedRemoteAddressResolver::maxTrustedIndex采用與 Spring Cloud Gateway 前面運行的可信基礎設施數量相關的索引。例如,如果 Spring Cloud Gateway 只能通過 HAProxy 訪問,則應使用值 1。如果在訪問 Spring Cloud Gateway 之前需要可信基礎設施的兩跳,則應使用值 2。
考慮以下標頭值:、
X-Forwarded-For: 0.0.0.1, 0.0.0.2, 0.0.0.3
權重路由謂詞工廠
路由謂詞工廠Weight有兩個參數:group和weight(一個 int)。權重按每組計算。以下示例配置權重路由謂詞:
spring:cloud:gateway:routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1, 8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1, 2
XForwarded 遠程地址路由謂詞工廠
路由XForwarded Remote Addr謂詞工廠采用 的列表(最小大小為 1)sources,它們是 CIDR 表示法(IPv4 或 IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是 IP 地址,16是子網掩碼)。
此路由謂詞允許根據 HTTP 標頭過濾請求X-Forwarded-For。
這可以與反向代理(例如負載均衡器或 Web 應用程序防火墻)一起使用,其中僅當請求來自這些反向代理所使用的可信 IP 地址列表時才應允許請求。
以下示例配置 XForwardedRemoteAddr 路由謂詞:
spring:cloud:gateway:routes:- id: xforwarded_remoteaddr_routeuri: https://example.orgpredicates:- XForwardedRemoteAddr=192.168.1.1/24
持續更新......
?????????????????????????????????????????????????????????????????????????????????????????????????????????---- 永不磨滅的番號:我是AK