SpringCloud學習------Gateway詳解

????????在微服務架構中,隨著服務數量的激增,如何統一管理服務入口、實現請求路由、保障服務安全等問題日益突出。SpringCloud Gateway 作為 Spring 官方推出的網關組件,憑借其強大的功

????????Gateway 是 Spring 官方基于 Spring、SpringBoot?和 Project Reactor 開發的第二代微服務網關,用于替代 Netflix Zuul。它旨在為微服務架構提供一種簡單、高效的統一入口,負責請求路由、負載均衡、熔斷降級、安全認證、限流、監控日志等核心功能。?形象地說,Gateway 就像微服務集群的 “大門衛”,所有外部請求都需要經過它的調度和處理后才能到達目標服務。它不僅能根據請求特征將流量分發到不同的服務實例,還能在請求前后進行額外處理,如驗證身份、記錄日志、控制流量等,是微服務架構中不可或缺的關鍵組件。?

????????Gateway 的核心原理圍繞路由(Route)、斷言(Predicate)和過濾器(Filter) 三大組件展開,三者共同構成了 Gateway 的基本工作模型:

(1)路由(Route):路由是 Gateway 的基本單元,由 ID、目標 URI、斷言集合和過濾器集合組成。當請求滿足斷言條件時,Gateway 會將請求轉發到該路由指定的目標 URI。路由可以動態配置,支持實時更新。?

(2)斷言(Predicate):斷言本質是一組匹配規則,用于判斷請求是否符合某個路由的條件。Gateway 內置了多種斷言工廠,如路徑斷言(Path)、方法斷言(Method)、參數斷言(Query)、時間斷言(After)等,開發者可以組合使用這些斷言,精確匹配請求。?

(3)過濾器(Filter):過濾器用于在請求路由前后對請求和響應進行處理。Gateway 的過濾器分為全局過濾器(GlobalFilter)和局部過濾器(GatewayFilter),全局過濾器對所有路由生效,局部過濾器僅對特定路由生效。過濾器可以實現日志記錄、權限驗證、請求修改、響應處理等功能。?

????????Gateway 的工作流程可分為以下幾個步驟:?

????????1.接收請求:客戶端發送請求到 Gateway,請求首先進入 DispatcherHandler,由其負責協調后續處理流程。?

????????2.路由匹配:DispatcherHandler 將請求傳遞給 RoutePredicateHandlerMapping,該組件根據路由的斷言集合匹配請求,找到最符合條件的路由。?

? ? ? ? 3.過濾器鏈執行:匹配到路由后,請求進入 FilteringWebHandler,該組件會將路由關聯的局部過濾器和全局過濾器組合成過濾器鏈,按順序執行過濾器的前置邏輯(pre)。?

? ? ? ? 4.請求轉發:過濾器前置邏輯執行完成后,Gateway 通過 Netty 的 HttpClient 將請求轉發到目標服務。?

? ? ? ? 5.響應處理:目標服務返回響應后,過濾器鏈執行后置邏輯(post),對響應進行處理(如修改響應頭、記錄響應日志等)。?

? ? ? ? 6.返回響應:最終處理后的響應返回給客戶端。?

????????整個過程基于非阻塞的響應式編程模型,借助 Project Reactor 實現異步處理,能高效處理高并發請求。?

? ? ? ? 而在微服務架構中,Gateway 的作用主要體現在以下幾個方面:?

1. 統一服務入口?

????????Gateway 作為微服務集群的唯一入口,外部請求無需知道具體服務的地址和端口,只需訪問 Gateway 的地址,由 Gateway 負責將請求路由到對應的服務,簡化了客戶端與服務的交互方式。?

2. 路由轉發與負載均衡?

????????通過配置路由規則,Gateway 可以將不同路徑、不同參數的請求轉發到不同的服務實例。同時,Gateway 整合了 SpringCloud LoadBalancer(或 Ribbon),能根據負載均衡策略將請求分發到健康的服務實例,提高系統的可用性。?

3. 安全認證與授權?

????????Gateway 可以在請求到達服務前進行安全校驗,如驗證 JWT 令牌、檢查 API 密鑰、限制 IP 訪問等。通過全局過濾器實現統一的安全認證邏輯,避免在每個服務中重復開發認證功能,提高系統安全性。?

4. 限流與熔斷降級?

????????為防止高并發請求壓垮服務,Gateway 支持基于令牌桶、漏桶等算法的限流功能,可對請求頻率、并發數進行限制。同時,它能與 Hystrix、Resilience4j 等容錯組件集成,當服務響應超時或異常時,執行熔斷降級邏輯,返回預設響應。?

5. 監控與日志?

????????Gateway 可以記錄所有經過的請求和響應信息,如請求路徑、參數、響應時間、狀態碼等,為系統監控和問題排查提供數據支持。結合 Spring Boot Actuator,還能暴露監控指標,便于運維人員實時掌握網關運行狀態。?

6. 請求與響應轉換?

????????通過過濾器,Gateway 可以對請求和響應進行修改,如添加請求頭、修改請求參數、轉換響應格式等。例如,在請求轉發前統一添加版本號頭信息,或在響應返回前對敏感數據進行脫敏處理。?

????????Zuul 是 Netflix 開源的第一代微服務網關,而 Gateway 是 Spring 官方推出的第二代網關,兩者在設計理念、性能和功能上存在顯著差異,具體對比如下:?

1. 底層架構?

(1)Zuul 1.x:基于 Servlet 2.5,采用阻塞式 IO 模型,每個請求需要分配一個線程處理,線程阻塞等待服務響應,在高并發場景下性能較差。?

(2)Gateway:基于 Spring5 的 WebFlux 框架和 Netty,采用非阻塞響應式編程模型,通過事件循環機制處理請求,無需為每個請求創建線程,能高效處理高并發請求,性能遠超 Zuul 1.x。?

2. 功能特性?

(1)路由能力:兩者都支持基本的路由轉發,但 Gateway 的斷言機制更靈活,支持多種匹配規則組合,而 Zuul 的路由配置相對簡單。?

(2)過濾器機制:Gateway 的過濾器分為 pre 和 post 階段,支持精確控制執行順序;Zuul 的過濾器分為 pre、route、post、error 四個階段,但執行順序控制不如 Gateway 直觀。?

(3)集成能力:Gateway 與 Spring 生態(如 Spring Security、Spring Cloud Config)無縫集成,支持動態路由配置;Zuul 需要額外適配才能實現類似功能。?

(4)容錯與限流:Gateway 原生支持與 Resilience4j 集成實現熔斷,內置限流功能;Zuul 1.x 需依賴 Hystrix 實現熔斷,限流功能需自行擴展。?

3. 性能表現?

????????在高并發場景下,Gateway 的性能優勢明顯。由于采用非阻塞響應式模型,其吞吐量和響應速度遠高于 Zuul 1.x。根據官方測試數據,Gateway 的請求延遲比 Zuul 低 50% 以上,在每秒數萬請求的壓力下仍能保持穩定。?

4. 發展狀態?

(1)Zuul 1.x 已停止更新,Netflix 推出的 Zuul 2.x 雖采用非阻塞模型,但與 SpringCloud 生態的集成不夠緊密,應用范圍有限。?

(2)Gateway 作為 Spring 官方推薦的網關組件,持續迭代更新,功能不斷完善,已成為微服務架構的主流網關選擇。?

????????Gateway 有許多優點?,如:

(1)高性能:基于非阻塞響應式編程模型,采用 Netty 作為底層通信框架,能高效處理高并發請求,性能優于傳統網關。?

(2)功能豐富:內置路由、斷言、過濾器等核心組件,支持路由轉發、負載均衡、安全認證、限流熔斷、監控日志等全方位功能。?

(3)Spring 生態融合:與 SpringBoot、SpringCloud 組件無縫集成,配置簡單,開發成本低,易于上手和維護。?

(4)動態路由:支持通過配置中心(如 Nacos、Apollo)實現路由規則的動態更新,無需重啟網關即可生效。?

(5)靈活的過濾器機制:提供全局和局部過濾器,支持自定義過濾器,可按需擴展功能,滿足復雜業務場景。?

? ? ? ? 而其也有一些缺點,主要有:?

(1)學習成本較高:基于 WebFlux 響應式編程模型,開發者需要熟悉 Reactor 相關概念,對于習慣了 SpringMVC 同步編程的開發者來說有一定學習門檻。?

(2)調試難度增加:非阻塞異步的特性使得請求處理流程不如同步模型直觀,問題排查和調試相對復雜。?

(3)部分功能依賴擴展:雖然核心功能完善,但某些高級特性(如復雜的限流算法)需要結合第三方組件實現,原生支持不夠全面。?

(4)對 Servlet API 不兼容:由于基于 WebFlux 而非 Servlet,傳統的 Servlet 過濾器和 Listener 無法直接使用,需要進行適配改造。

????????下面通過一個實際案例展示 Gateway 在 SpringCloud 項目中的應用:

(1)在 SpringBoot 項目的 pom.xml 中引入 Gateway 及相關依賴:

<dependencies><!-- Gateway核心依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 服務注冊發現 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 負載均衡 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency><!-- 監控端點 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>

(2)在 application.yml 中配置路由規則、斷言和過濾器:

spring:application:name: gateway-servicecloud:gateway:# 路由配置routes:# 路由1:轉發到用戶服務- id: user-service-routeuri: lb://user-service  # lb表示使用負載均衡,user-service為服務名predicates:  # 斷言條件,所有條件滿足才匹配- Path=/api/user/**  # 路徑斷言,匹配以/api/user/開頭的請求- Method=GET,POST  # 方法斷言,只匹配GET和POST請求filters:  # 局部過濾器- StripPrefix=1  # 去除路徑前綴1級(即去除/api)- name: RequestRateLimiter  # 限流過濾器args:redis-rate-limiter.replenishRate: 10  # 令牌桶填充速率redis-rate-limiter.burstCapacity: 20  # 令牌桶容量key-resolver: "#{@userKeyResolver}"  # 限流鍵解析器# 路由2:轉發到商品服務- id: product-service-routeuri: lb://product-servicepredicates:- Path=/api/product/**- After=2025-01-01T00:00:00+08:00[Asia/Shanghai]  # 時間斷言,只處理指定時間后的請求filters:- StripPrefix=1- name: CircuitBreaker  # 熔斷過濾器args:name: productServiceCircuitBreakerfallbackUri: forward:/fallback/product  # 熔斷降級路徑# 全局過濾器配置(可選)default-filters:- AddResponseHeader=X-Response-Time, ${spring.application.name}  # 添加響應頭discovery:locator:enabled: true  # 開啟服務發現路由(可選,自動根據服務名路由)# 服務注冊配置
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/# 監控端點配置
management:endpoints:web:exposure:include: gateway,health,info  # 暴露gateway監控端點# 限流需要Redis支持(若使用RequestRateLimiter過濾器)redis:host: localhostport: 6379

(3)在啟動類上添加服務注冊發現注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient  // 開啟服務注冊發現
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

(4)創建限流鍵解析器,用于定義限流的維度(如 IP、用戶 ID 等):

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;@Configuration
public class RateLimitConfig {// 基于IP地址的限流@Beanpublic KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}
}

(5)創建全局過濾器實現統一的權限驗證:

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import reactor.core.publisher.Mono;@Configuration
public class GlobalFilterConfig {@Bean@Order(-1)  // 優先級,數值越小越先執行public GlobalFilter authFilter() {return (exchange, chain) -> {// 從請求頭獲取tokenString token = exchange.getRequest().getHeaders().getFirst("Authorization");if (token == null || !token.startsWith("Bearer ")) {// 無token或格式錯誤,返回401exchange.getResponse().setStatusCode(org.springframework.http.HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// token驗證通過,繼續執行過濾器鏈return chain.filter(exchange);};}
}

(6)創建熔斷降級接口,當服務調用失敗時返回默認響應:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class FallbackController {@GetMapping("/fallback/product")public String productFallback() {return "商品服務暫時不可用,請稍后再試!";}
}

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

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

相關文章

計算機網絡:子網掩碼在路由轉發中的關鍵作用

在路由表中,子網掩碼是一個不可或缺的組成部分,其核心作用是精確界定IP地址中“網絡位”和“主機位”的邊界,從而實現路由器對數據包的準確轉發。以下從多個角度詳細解釋其必要性: 1. 區分網絡位與主機位,定位目標網絡 IP地址由“網絡標識”(網絡位)和“主機標識”(主…

14.Home-新鮮好物和人氣推薦實現

新鮮好物實現1.準備模板<script setup>import HomePanel from ./HomePanel.vue</script><template><homePanel></HomePanel><!-- 下面是插槽主體內容模版<ul class"goods-list"><li v-for"item in newList" :ke…

Linux 系統重置用戶密碼指南

Linux 系統重置用戶密碼指南 在 Linux 系統運維中&#xff0c;重置用戶密碼&#xff08;尤其是 root 密碼&#xff09;是一項核心技能。當您忘記密碼時&#xff0c;可以通過進入單用戶模式或恢復模式來修改密碼。此方法適用于大多數 Linux 發行版&#xff0c;如 RHEL/CentOS、D…

[自動化Adapt] GUI交互(窗口/元素) | 系統配置 | 非侵入式定制化

第三章&#xff1a;GUI交互&#xff08;窗口/元素&#xff09; 各位OpenAdapt探索者&#xff0c;歡迎回來~ 在第一章&#xff1a;錄制引擎中&#xff0c;我們揭示了OpenAdapt如何通過"眼睛和耳朵"捕捉所有操作細節。接著在第二章&#xff1a;數據模型中&#xff0c…

Java 模版進階

文章目錄模版通配符模版 通配符 實例 import java.util.ArrayList; import java.util.List;class Message<T> {private T message ;public T getMessage() {return message;}public void setMessage(T message) {this.message message;} } public class test {public …

統計魚兒分布情況 Java

假設有一個池塘&#xff0c;管理員在池塘中添加隨機數量的魚類&#xff0c;為了統計魚類的分布情況&#xff0c;他將池塘劃分為8*8的二維網格&#xff0c;魚兒隨機游動&#xff0c;但是每個網格中最多容納100條魚&#xff0c;要求編寫程序顯示魚兒分布情況&#xff0c;并計算魚…

【HUST】計算機|大學計算機基礎內容(純科普向)+數據結構數組、樹、隊列【舊文搬運】

最初發布時間&#xff1a;2020-09-19 23:17:48 以前寫這篇文章&#xff0c;主要是接觸到一些非計算機學院的同學&#xff0c;為了交流方便我寫下了這篇文章……雖然現在回過頭來看寫得也比較草率&#xff0c;但確實是我對電腦的基礎操作的最早的認識&#xff0c;放到現在我絕對…

CRT調試堆檢測:從原理到實戰的資源泄漏排查指南

在C/C開發中&#xff0c;內存泄漏和資源管理不當是導致程序崩潰、性能下降的常見原因。微軟提供的C運行時庫&#xff08;CRT&#xff09;內置了強大的調試工具&#xff0c;能夠幫助開發者在開發階段及時發現并修復資源泄漏問題。本文將深入解析CRT調試堆的工作原理&#xff0c;…

filezilla出現connected refused的時候排查問題

問題描述: 系統是ubuntu20.04&#xff0c;使用filezilla&#xff0c;兩個主機之間能夠ping通&#xff0c;但是filezilla使用sftp連接的時候顯示的是 FATAL ERROR: Connection refused Could connect to the server應該如何排查問題呢 這是一個非常典型的SFTP連接問題。“Connec…

FPGA 基本設計思想--乒乓操作、串并轉換、流水線

乒乓操作&#xff08;Ping-Pong&#xff09;的理解&#xff1a;為什么是另一種pipeline&#xff1f;-CSDN博客 FPGA菜鳥學習筆記——2、四大設計思想 - 知乎 乒乓操作&#xff08;Ping-Pong&#xff09;-CSDN博客 乒乓操作原理與FPGA設計-CSDN博客 乒乓操作 — [野火]FPGA …

2023 年 6 月 GESP Python 二級試卷真題+答案+解析

2023 年 6 月 GESP Python 二級試卷解析 一、單選題&#xff08;每題 2 分 &#xff0c;共 30 分&#xff09; 1 、 高級語言編寫的程序需要經過以下&#xff08; &#xff09;操作&#xff0c;可以生成在計算機上運行的可執行代碼。 A. 編輯 B. 保存 C. 調試…

數據對齊:如何處理時間序列與空間對齊問題?

在多模態學習中&#xff0c;不同模態&#xff08;文本、語音、圖像、視頻、傳感器數據等&#xff09;具有不同的采樣率、時間步長、空間分辨率。例如&#xff0c;視頻是連續幀&#xff0c;音頻是高采樣頻率的波形&#xff0c;文本是離散符號序列。為了實現有效融合&#xff0c;…

兩個任務同一個調用時間 CRON:0 0 3 * * ?,具體如何調度的,及任務如何執行的

xxLjob兩個任務 pullGuanjiaSalesJob&#xff0c;不同的執行參數&#xff0c;配置了同一個 XxlJob("pullGuanjiaSalesJob")兩個任務同一個調用時間 CRON&#xff1a;0 0 3 * * ?&#xff0c;具體如何調度的&#xff0c;及任務如何執行的在 XXL-JOB 中&#xff0c;當…

【基于WAF的Web安全測試:繞過Cloudflare/Aliyun防護策略】

當Cloudflare或阿里云WAF矗立在Web應用前端&#xff0c;它們如同智能護盾&#xff0c;過濾惡意流量。然而&#xff0c;真正的Web安全測試不止于驗證防護存在&#xff0c;更需挑戰其邊界——理解并模擬攻擊者如何繞過這些先進防護&#xff0c;才能暴露深藏的風險。這不是鼓勵攻擊…

使用YOLOv8-gpu訓練自己的數據集并預測

本篇將教學使用示例代碼訓練自己的數據集&#xff08;train&#xff09;以及預測&#xff08;predict&#xff09;。 目錄 一、代碼獲取 二、訓練 1、添加自己的訓練集 2、創建訓練集設置文件 3、 修改訓練代碼中數據集設置文件 4、開始訓練 三、預測 1、 修改圖片路徑…

Transformer的并行計算與長序列處理瓶頸

Transformer相比RNN&#xff08;循環神經網絡&#xff09;的核心優勢之一是天然支持并行計算&#xff0c;這源于其自注意力機制和網絡結構的設計.并行計算能力和長序列處理瓶頸是其架構特性的兩個關鍵表現&#xff1a; 并行計算&#xff1a;指 Transformer 在訓練 / 推理時通過…

LightRAG:大模型時代的低成本檢索利器

LightRAG&#xff1a;大模型時代的低成本檢索利器 大模型浪潮下&#xff0c;RAG 技術的困境與曙光 在科技飛速發展的當下&#xff0c;大語言模型&#xff08;LLMs&#xff09;已成為人工智能領域的璀璨明星。從最初驚艷世人的 GPT-3&#xff0c;到如今功能愈發強大的 GPT-4&…

spring boot開發中的資源處理等問題

文章目錄一、RESTful 風格二、Spring Boot 靜態資源處理三、Spring Boot 首頁&#xff08;歡迎頁&#xff09;四、PathVariable 注解五、攔截器&#xff08;Interceptor&#xff09;六、過濾器&#xff08;Filter&#xff09;七、觸發器&#xff08;Trigger&#xff09;八、Han…

[2025CVPR-圖象生成方向]ODA-GAN:由弱監督學習輔助的正交解耦比對GAN 虛擬免疫組織化學染色

?研究背景與挑戰? ?臨床需求? 組織學染色(如H&E和IHC)是病理診斷的核心技術,但IHC染色存在耗時、組織消耗大、圖像未對齊等問題。 虛擬染色技術可通過生成模型將H&E圖像轉換為IHC圖像,但現有方法面臨兩大挑戰: ?染色不真實性?:生成圖像與真實IHC的分布存在…

【Leetcode】2106. 摘水果

文章目錄題目思路代碼CJavaPython復雜度分析時間復雜度空間復雜度結果總結題目 題目鏈接&#x1f517; 在一個無限的 x 坐標軸上&#xff0c;有許多水果分布在其中某些位置。給你一個二維整數數組 fruits &#xff0c;其中 fruits[i] [positioni, amounti] 表示共有 amounti…