SpringCloud之Gateway

SpringCloud之Gateway

官網地址:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories


1. 什么是gateway

Spring Cloud Gateway 是Spring Cloud官方推出的第二代網關框架,定位于取代 Netflix Zuul。相比 Zuul 來說,Spring CloudGateway 提供更優秀的性能,更強大的有功能。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 實現的響應式的 API 網關。它不能在傳統的 servlet 容器中工作,也不能構建成 war 包。
Spring Cloud Gateway 旨在為微服務架構提供一種簡單且有效的 API 路由的管理方式,并基于 Filter 的方式提供網關的基本功能,例如安全認證、監控、限流等等。


2. 優勢

2.1 非阻塞式 & 高性能:

基于 Netty 和 Project Reactor(響應式編程模型)構建,采用異步非阻塞 I/O。

相比傳統的同步阻塞式網關(如 Zuul 1.x),它能更高效地處理高并發請求,資源消耗更低,性能顯著提升。

2.2 聲明式配置:

支持通過 Java DSL(領域特定語言)或 YAML/Properties 配置文件定義路由規則、斷言、過濾器等,配置靈活直觀。

2.3 強大的路由能力:

基于多種斷言 (Predicate) 精確匹配請求(如路徑、方法、Header、Host、Cookie、查詢參數、時間、權重等)。

支持動態路由(如從配置中心 Nacos、Consul 動態加載路由配置)。

2.4 豐富的過濾器 (Filter):

提供大量內置過濾器,用于修改請求和響應(如添加/刪除 Header、路徑重寫、參數修改、重定向、Hystrix 熔斷、請求限流、重試、修改響應體等)。

支持自定義過濾器,滿足特定業務需求(如認證、日志、加解密)。

過濾器分為 GatewayFilter (作用于單個路由) 和 GlobalFilter (作用于所有路由)。

2.5 易于集成:

無縫集成 Spring Cloud Discovery Client(Eureka, Nacos, Consul),實現服務發現和動態路由。

輕松集成 Spring Cloud CircuitBreaker(Resilience4j, Sentinel)實現熔斷降級。

集成 Spring Cloud LoadBalancer 實現客戶端負載均衡。

與 Spring Security 集成實現 OAuth2/JWT 等安全認證。

2.6 支持 WebSocket:

內置對 WebSocket 路由的支持。


3. 核心特性

Spring Cloud Gateway 的核心處理流程圍繞著三個關鍵概念: 路由 (Route),斷言 (Predicate),過濾器 (Filter)

3.1 路由 (Route):

網關的基本構建塊。定義了一個請求如何被轉發到后端服務(目標 URI)。

包含:

  • ID: 路由的唯一標識符。

  • 目標 URI: 請求最終被轉發到的地址(可以是 http://, https://, lb:// (服務名負載均衡), ws://, wss://)。

  • 斷言 (Predicates) 集合: 一組匹配規則,決定當前請求是否適用此路由。

  • 過濾器 (Filters) 集合: 一組在處理請求和響應前后執行的邏輯(針對此特定路由)。

示例配置 (YAML):

   spring:cloud:gateway:routes:- id: user_service_route       # 路由IDuri: lb://user-service      # 目標URI (lb:// 表示負載均衡到 user-service)predicates:                  # 斷言集合- Path=/api/users/**      # 匹配以 /api/users/ 開頭的請求路徑filters:                     # 過濾器集合- StripPrefix=1            # 去掉路徑前綴1級 (/api/users/foo -> /foo)- AddRequestHeader=X-Request-UserService, gateway-user  # 添加請求頭

3.2 斷言 (Predicate):

Java 8 的 Predicate 函數式接口實現。

接收 ServerWebExchange 對象(包含 HTTP 請求的所有信息),根據請求的屬性(如路徑、方法、Header、Host、Cookie、查詢參數、時間等)進行邏輯判斷。

返回 boolean 值:true 表示請求匹配成功,該路由規則生效;false 表示不匹配。

常見內置斷言

  • Path: 請求路徑匹配 (Ant 風格或正則表達式)。

  • Method: HTTP 方法匹配 (GET, POST, PUT, DELETE 等)。

  • Header: 檢查請求頭是否存在或值匹配正則。

  • Host: 匹配請求頭 Host 的值。

  • Cookie: 檢查指定 Cookie 是否存在或值匹配正則。

  • Query: 檢查請求參數是否存在或值匹配正則。

  • After, Before, Between: 基于時間匹配請求。

  • RemoteAddr: 匹配客戶端 IP 地址(CIDR 表示法)。

  • Weight: 按權重分組路由(常用于灰度發布)。

多個斷言關系: 默認情況下,一個路由中的所有斷言必須同時為 true,該路由才算匹配成功(邏輯與 AND)。

3.3 過濾器 (Filter):

基于 Spring Framework GatewayFilter 工廠構建。

在路由匹配成功后,請求被轉發到目標服務之前 (pre 邏輯) 和收到目標服務響應之后 (post 邏輯) 執行特定操作。

  • 作用

修改請求 (pre): 添加/修改 Header、參數、路徑重寫、請求體修改、鑒權、限流、熔斷等。

修改響應 (post): 添加/修改 Header、修改狀態碼、修改響應體、日志記錄等。

  • 類型

GatewayFilter: 應用于特定路由。在路由配置的 filters 部分定義。

GlobalFilter: 應用于所有路由。通過 @Bean 方式注冊到 Spring 上下文即可生效。常用于全局邏輯如認證、日志、監控。

  • 常見內置過濾器

    AddRequestHeader / AddResponseHeader: 添加請求/響應頭。RemoveRequestHeader / RemoveResponseHeader: 移除請求/響應頭。SetRequestHeader / SetResponseHeader: 設置(覆蓋)請求/響應頭。RewritePath: 重寫請求路徑(正則表達式替換)。PrefixPath: 為請求路徑添加前綴。StripPrefix: 移除請求路徑的前綴(指定級數)。SetPath: 直接設置請求路徑(支持模板變量)。RedirectTo: 重定向(302/301)。SaveSession: 強制保存 WebSession(常用于分布式會話)。SetStatus: 設置響應的 HTTP 狀態碼。RequestRateLimiter: 請求限流(需集成 Redis 或其它實現)。Retry: 請求重試(配置重試次數、條件等)。Hystrix: 熔斷(注意:Spring Cloud 2020.0.0 后移除了 Netflix 堆棧,推薦使用 Resilience4j 或 Sentinel 的過濾器)。ModifyRequestBody / ModifyResponseBody: 高級功能,修改請求/響應體內容(需謹慎使用,性能影響較大)。
    

4. 執行流程

┌────────────┐
│   Client   │  ① 發送 HTTP 請求
└────┬───────┘│
┌────▼────────────┐
│ Gateway Handler │ ② Route Predicate 匹配
│    Mapping      │   - Path / Host / Header / Method …
└────┬────────────┘│ 找到匹配的路由
┌────▼────────────┐
│ Gateway Web     │ ③ 把請求交給 Handler
│   Handler       │
└────┬────────────┘│ 進入該路由的 Filter Chain
┌────▼────────────┐
│  Pre-Filter鏈   │ ④ 在代理之前執行
│  (限流、鑒權…)    │
└────┬────────────┘│
┌────▼────────────┐
│  Proxy Request  │ ⑤ 轉發到下游服務
│  (Netty Client) │
└────┬────────────┘│
┌────▼────────────┐
│ Post-Filter鏈   │ ⑥ 在代理之后執行
│ (日志、加頭…)     │
└────┬────────────┘│
┌────▼────────────┐
│   Client        │ ⑦ 收到最終響應
└─────────────────┘

說明:

步驟組件/類說明
① 接收請求Netty Reactor網關基于 WebFlux + Netty,非阻塞接收。
② 路由匹配RoutePredicateHandlerMapping根據 predicates 判斷哪個 Route 命中。
③ 創建執行鏈FilteringWebHandler把命中的 Route 對應的 GatewayFilter 串成鏈。
④ Pre-FilterGatewayFilter#filter下游調用前 執行:鑒權、限流、日志、加頭。
⑤ 代理請求NettyRoutingFilter使用 Netty 客戶端發送 HTTP/HTTPS 請求到下游。
⑥ Post-FilterGatewayFilter#filter拿到響應后 執行:改寫響應頭、記錄耗時、熔斷降級。
⑦ 返回客戶端NettyWriteResponseFilter把最終響應寫回原始客戶端連接。

5. 應用

  • 統一入口 & 路由: 所有外部請求統一訪問網關,網關根據規則路由到內部微服務。

  • 認證鑒權: 在 GlobalFilter 中實現 JWT 校驗、OAuth2 集成、基礎認證等,保護后端服務。

  • 限流熔斷: 使用 RequestRateLimiter 過濾器(如基于 Redis)進行限流;集成 Resilience4j 或 Sentinel 實現熔斷降級,防止服務雪崩。

  • 日志審計: 在 GlobalFilter 中記錄請求和響應的關鍵信息(如請求ID、路徑、方法、狀態碼、耗時等),用于監控和審計。

  • 灰度發布 / 金絲雀發布: 利用 Weight 斷言或自定義 Predicate/Filter 實現按權重、Header、Cookie、用戶ID 等條件將流量分發到不同版本的服務。

  • 跨域處理 (CORS): 在網關層統一配置 CORS 策略,避免每個微服務單獨處理。

  • 路徑重寫與聚合: 使用 RewritePath, PrefixPath, StripPrefix 等過濾器簡化客戶端請求路徑或適配后端服務路徑。對于前端聚合請求,可以考慮使用 ModifyRequestBody/ModifyResponseBody(性能需評估)或結合 GraphQL。

  • 監控集成: 集成 Micrometer 和 Prometheus/Grafana,暴露網關的指標(請求數、耗時、錯誤率等)。


6. 總結

Spring Cloud Gateway 是一個功能強大、性能優異、易于擴展的現代 API 網關解決方案。它通過路由、斷言、過濾器三大核心概念,為微服務架構提供了統一的入口、靈活的請求路由能力、強大的請求/響應處理機制以及必要的橫切面功能(安全、限流、熔斷、日志等)。其基于響應式編程模型的設計使其在高并發場景下表現卓越。結合 Spring Cloud 生態的其他組件(如服務發現、配置中心、熔斷器),Spring Cloud Gateway 是構建健壯、可擴展、易管理的微服務系統的理想選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91202.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于獲取某目錄及子目錄下所有文件且不包含隱藏文件

最近比較忙,很少寫blog了!!!關于獲取目錄及子目錄下所有文件是常遇到的功能,一般通過遞歸遍歷實現。而生產場景中,一般是遍歷nas上的目錄,在nas上利用File.listFiles(),在linux系統上無法獲取含…

docker可視化管理工具lazydocker

Lazydocker 是一個用 Go 語言編寫的命令行 Docker 管理工具。它提供了一個簡潔、直觀的終端界面,支持鍵盤和鼠標操作,可通過方向鍵與快捷鍵實時查看和管理容器、鏡像、網絡等資源,大幅簡化了原本復雜的命令行操作,提升操作效率。2…

少林寺用什么數據庫?

📢📢📢📣📣📣 作者:IT邦德 中國DBA聯盟(ACDU)成員,15年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主,全網粉絲15萬 擅長主流Oracle、MySQL、PG、高斯及…

C語言---萬能指針(void *)、查找子串(strncmp函數的應用)多維數組(一維數組指針、二維數組指針)、返回指針值函數、關鍵字(const)

一、字符串與指針用字符指針指向一個字符串,可以不定義字符數組,而定義字符指針。用字符指針指向字符串中的字符。不能使用指針去改變不能修改的空間。eg1. 運用指針將 src 的內容拷貝到 dest 中去void Strcpy(char *dest, char *src) {while(*src ! \0)…

Keepalived 實戰

一、高可用集群基礎核心概念與指標集群類型:LB(負載均衡):如 LVS、HAProxy、Nginx,提升吞吐量;HA(高可用):保障核心服務(數據庫、Redis)連續性&am…

窗口函數替代子查詢的復雜查詢簡化技巧

窗口函數通過單次掃描完成分析計算,能大幅簡化子查詢結構并提升性能,尤其在排名、累計計算等場景?15。以下是核心優化技巧:一、排名場景替代方案?部門工資排名?傳統子查詢需自連接和聚合計數:sqlSELECT e1.name, e1.salary, (S…

深度學習:預訓練和warm up的區別

“預訓練(Pre-training)”和“Warm-up(預熱)”是深度學習中常見的兩個訓練策略,它們雖然都在訓練初期起作用,但本質和目的完全不同。一、預訓練(Pre-training)1. 定義預訓練是指&…

Apache Ignite中分布式信號量(Distributed Semaphore)的說明和使用示例

這段內容是關于 Apache Ignite 中 分布式信號量(Distributed Semaphore) 的說明和使用示例。我們來一步步解析,幫助你深入理解它的含義和用途。🔹 一、什么是 Semaphore(信號量)? 在并發編程中&…

怎么提升服務器的防攻擊能力!

提升服務器的防攻擊能力需要從??架構設計、技術防護、運維管理??等多維度入手,覆蓋網絡層、系統層、應用層及數據層的安全防護。以下是具體的策略和實踐方法:??一、基礎安全加固:消除自身漏洞??服務器自身的脆弱性是最常見的攻擊入口…

vscode配置rust環境

1.官網下載vscode,安裝 2.vscode命令行運行: Invoke-WebRequest https://win.rustup.rs/x86_64 -OutFile rustup-init.exe然后: .\rustup-init.exe3.驗證 先配置path: $env:Path ";$env:USERPROFILE\.cargo\bin"查看是…

最新版 HarmonyOS NEXT 開發工具安裝教程:如何在 macOS 系統安裝 DevEco Studio 5.0.3 編輯器?

最新版 HarmonyOS NEXT 開發工具安裝教程:如何在 macOS 系統安裝 DevEco Studio 5.0.3 編輯器? 什么是 DevEco Studio? DevEco Studio 是華為為 HarmonyOS 開發的強大集成開發環境(IDE),專為開發 Harmony…

電商項目統一認證方案設計與實戰

1. 微服務網關整合 OAuth2.0 設計思路分析 網關整合 OAuth2.0 有兩種思路,一種是授權服務器生成令牌, 所有請求統一 在網關層驗證,判斷權限等操作;另一種是由各資源服務處理,網關只做請求 轉發 。 比較常用的是第一種&#xf…

學習Markdown

標題一 標題二 標題三 標題四 標題五 標題六這是一段引用文本直接編寫,段落換行是末尾兩個以上的空格+回車 或者在段落后加一個空行 粗體語法:使用兩個星號 ** 或兩個下劃線 __ 包圍文字:這是粗體文字使用星號 這是__粗體文字__使…

劇本殺系統 App 開發:科技賦能,重塑劇本殺游戲體驗

在科技飛速發展的當下,各個行業都在積極尋求與科技的融合,以實現創新和升級。劇本殺行業也不例外,劇本殺系統 App 的開發正是科技賦能的生動體現,它重塑了傳統的劇本殺游戲體驗,為玩家帶來了全新的感受。劇本殺系統 Ap…

wvp-gb28181-pro 只用jar運行

編譯前端后npm install --global yarnyarn --registryhttps://registry.npmjs.org installyarn run build,生成的前端文件,會在wvp-GB28181-pro\src\main\resources\static,因為是在resources中,打maven打包后會一起打到jar中&…

深度學習(魚書)day06--神經網絡的學習(后兩節)

深度學習(魚書)day06–神經網絡的學習(后兩節)一、梯度 像 這樣的由全部變量的偏導數匯總而成的向量稱為梯度(gradient)。 梯度實現的代碼: def numerical_gradient(f, x):h 1e-4 # 0.0001grad…

學習嵌入式的第三十四天-數據結構-(2025.7.29)數據庫

數據庫基礎概念 數據庫是用于存儲和管理海量數據的應用程序,提供數據增刪改查及統計功能(如最大值、最小值、平均數等)。通過SQL語句操作數據,以表格形式管理存儲。 數據庫分類 關系型數據庫 Oracle(大型&#xff0…

STM32——HAL庫

總:STM32——學習總綱 一、簡介 1.1 CMIS簡介 所有廠家為了市場兼容性推出的標準 arm架構 1.2 HAL庫簡介 1.2.1 各種庫優缺點 二、 STM32 Cube固件包 ST公司為CMSIS 中間層開發的pack,包含HAL。 2.1 獲取方式 ST官網:st.com/content/st_c…

數據結構-圖的相關定義

圖-多對多Graph(V,E),圖(頂點Vertex,邊Edge)圖可以沒有邊,只有一個頂點也叫圖,但是單獨的一條邊,或者一個頂點連一條邊,不能叫圖有向圖:無向圖&am…

B 站搜一搜關鍵詞優化:精準觸達用戶的流量密碼

在 B 站內容生態中,搜一搜功能是用戶主動獲取信息的重要渠道,而關鍵詞優化則是讓你的視頻在搜索結果中脫穎而出的關鍵。通過合理優化關鍵詞,能提升視頻曝光率,吸引精準流量,為賬號發展注入強勁動力。以下從關鍵詞挖掘、…