Spring Boot Gateway 教程:從入門到精通

一、Spring Cloud Gateway 簡介

Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 構建的 API 網關,旨在為微服務架構提供一種簡單而有效的路由管理方式。它取代了 Netflix Zuul,提供了更高效和更強大的網關解決方案。

核心特點:

  • ??反應式編程模型??:基于 Project Reactor 的非阻塞高性能處理
  • ??路由管理??:支持靈活的路由匹配規則
  • ??過濾器機制??:提供全局和局部過濾器處理請求和響應
  • ??易于擴展??:可通過自定義過濾器和路由器擴展功能

二、Spring Cloud Gateway 核心概念

1. 三大核心組件

  1. ??Route(路由)??:網關的基本構建塊,定義了請求路徑與服務之間的映射關系
  2. ??Predicate(斷言)??:Java 8 的 Predicate,用于匹配 HTTP 請求中的任何內容(如 headers 或參數)
  3. ??Filter(過濾器)??:可以在請求被路由前后修改請求和響應的組件

2. 工作流程

  1. 客戶端向 Spring Cloud Gateway 發出請求
  2. 如果 Gateway Handler Mapping 中找到與請求相匹配的路由,將其發送到 Gateway Web Handler
  3. Handler 再通過指定的過濾器鏈來將請求發送到我們實際的服務執行業務邏輯,然后返回

三、Spring Boot 項目中集成 Gateway

1. 添加依賴

在 Maven 項目的 pom.xml 文件中添加以下依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>4.3.0</version> <!-- 版本號根據實際情況選擇 -->
</dependency>

對于 Gradle 項目,在 build.gradle 中添加:

implementation 'org.springframework.cloud:spring-cloud-starter-gateway:2.2.6.RELEASE'

2. 啟用網關

在 Spring Boot 應用程序的入口類上,通常不需要特殊注解,因為 Spring Cloud Gateway 會自動配置。但如果你使用的是較新版本,可能需要確保有 @SpringBootApplication 注解:

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

四、Spring Cloud Gateway 的 YML 配置詳解

Spring Cloud Gateway 的路由配置主要通過 application.ymlapplication.properties 文件完成。下面詳細介紹 YML 配置文件的規則與使用。

1. 基本路由配置結構

spring:cloud:gateway:routes:- id: route_id              # 路由的唯一標識符,必須唯一uri: http://example.com   # 目標服務的URIpredicates:               # 斷言列表,用于匹配請求- Path=/example/**      # 示例斷言:匹配以/example/開頭的路徑filters:                  # 過濾器列表,用于處理請求和響應- StripPrefix=1         # 示例過濾器:去除路徑中的第一層前綴

2. 配置項詳細說明

2.1 路由 (Routes)

routes 是一個路由配置的數組,每個路由包含以下主要屬性:

  • ??id?? (必需): 路由的唯一標識符,用于標識和引用該路由
  • ??uri?? (必需): 請求最終要被轉發的目標地址
    • 可以是普通的 HTTP/HTTPS URL,如 http://example.com
    • 也可以使用服務發現機制,如 lb://SERVICE-NAME (負載均衡)
  • ??predicates?? (可選): 斷言數組,用于判斷請求是否符合路由條件
  • ??filters?? (可選): 過濾器數組,用于在請求轉發前后進行處理
  • ??order?? (可選): 路由的優先級,數字越小優先級越高
2.2 斷言 (Predicates)

斷言用于匹配 HTTP 請求中的各種條件,常用的斷言類型包括:

  1. ??Path?? - 路徑匹配

    predicates:- Path=/api/**           # 匹配以/api/開頭的路徑
  2. ??Method?? - HTTP 方法匹配

    predicates:- Method=GET,POST        # 匹配 GET 或 POST 請求
  3. ??Header?? - 請求頭匹配

    predicates:- Header=X-Request-Id, \d+  # 匹配包含 X-Request-Id 頭且值為數字的請求
  4. ??Query?? - 查詢參數匹配

    predicates:- Query=name, \d+        # 匹配包含 name 參數且值為數字的請求
  5. ??Host?? - 主機名匹配

    predicates:- Host=**.example.com    # 匹配主機名為任意子域名.example.com 的請求
  6. ??Before/After/Between?? - 時間匹配

    predicates:- Before=2023-01-01T00:00:00+08:00[Asia/Shanghai]  # 在指定時間之前匹配- After=2023-01-01T00:00:00+08:00[Asia/Shanghai]   # 在指定時間之后匹配- Between=2023-01-01T00:00:00+08:00[Asia/Shanghai], 2023-12-31T23:59:59+08:00[Asia/Shanghai]
  7. ??Cookie?? - Cookie 匹配

    predicates:- Cookie=chocolate, ch.p  # 匹配包含名為 chocolate 且值匹配正則 ch.p 的 Cookie
2.3 過濾器 (Filters)

過濾器用于在請求轉發前后進行處理,分為兩種類型:

  1. ??GatewayFilter?? - 單個路由的過濾器
  2. ??GlobalFilter?? - 全局過濾器,應用于所有路由

常用過濾器配置:

  1. ??StripPrefix?? - 去除路徑前綴

    filters:- StripPrefix=1           # 去除路徑中的第一層前綴

    例如,請求 /api/service1/test,配置 StripPrefix=1 后,轉發路徑為 /service1/test

  2. ??RewritePath?? - 重寫路徑

    filters:- RewritePath=/api/(?<segment>.*), /$\{segment}  # 將 /api/xxx 重寫為 /xxx
  3. ??AddRequestHeader?? - 添加請求頭

    filters:- AddRequestHeader=X-Request-Foo, Bar  # 添加請求頭 X-Request-Foo: Bar
  4. ??AddResponseHeader?? - 添加響應頭

    filters:- AddResponseHeader=X-Response-Foo, Bar  # 添加響應頭 X-Response-Foo: Bar
  5. ??PrefixPath?? - 添加路徑前綴

    filters:- PrefixPath=/mypath  # 為所有請求路徑添加前綴 /mypath
  6. ??RequestRateLimiter?? - 請求限流

    filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10   # 每秒允許的請求數redis-rate-limiter.burstCapacity: 20   # 每秒最大允許的請求數key-resolver: "#{@userKeyResolver}"    # 限流鍵解析器
2.4 服務發現與負載均衡

當與 Spring Cloud DiscoveryClient (如 Eureka、Nacos) 集成時,可以使用服務發現功能:

spring:cloud:gateway:routes:- id: service_routeuri: lb://SERVICE-NAME       # lb 表示負載均衡,SERVICE-NAME 是注冊的服務名predicates:- Path=/service/**filters:- StripPrefix=1
  • ??lb://SERVICE-NAME??:使用負載均衡器將請求轉發到名為 SERVICE-NAME 的服務實例
  • ??discovery.locator.enabled=true??:啟用服務發現定位器,允許通過服務名動態路由

3. 完整配置示例

下面是一個綜合性的配置示例,展示多種配置組合:

spring:cloud:gateway:# 啟用服務發現discovery:locator:enabled: true           # 啟用服務發現lower-case-service-id: true  # 服務ID使用小寫# 全局CORS配置globalcors:cors-configurations:'[/**]':allowedOrigins: "*"   # 允許所有源allowedMethods: "*"   # 允許所有HTTP方法allowedHeaders: "*"   # 允許所有請求頭# 路由配置routes:# 路由1:靜態路徑路由- id: order_service_routeuri: lb://order-service  # 使用負載均衡轉發到order-servicepredicates:- Path=/api/order/**   # 匹配以/api/order/開頭的路徑filters:- StripPrefix=2        # 去除前兩級路徑,如/api/order/ → /- AddRequestHeader=X-Gateway-Header, GatewayValue  # 添加請求頭# 路由2:基于Header的路由- id: version_routeuri: lb://user-servicepredicates:- Path=/api/user/**- Header=X-API-Version, v1  # 僅當請求頭X-API-Version為v1時匹配filters:- RewritePath=/api/user/(?<segment>.*), /v1/$\{segment}  # 重寫路徑# 路由3:基于查詢參數的路由- id: query_routeuri: http://example.compredicates:- Path=/query/**- Query=token, \d+  # 必須包含token參數且為數字filters:- StripPrefix=1# 路由4:自定義白名單路由(不需要認證)- id: whitelist_routeuri: http://backend-servicepredicates:- Path=/auth/login, /auth/register, /public/**filters:- StripPrefix=1# 自定義白名單配置(可選,通過代碼實現)
ignore:whites:- /auth/login- /auth/register- /**/v2/api-docs- /public/**

4. 通過代碼配置路由

除了通過 YML 文件配置路由,還可以通過 Java 代碼配置,提供更高的靈活性:

@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/get").uri("http://httpbin.org")).route("host_route", r -> r.host("*.myhost.org").uri("http://httpbin.org")).route("rewrite_route", r -> r.host("*.rewrite.org").filters(f -> f.rewritePath("/foo/(?<segment>.*)", "/${segment}")).uri("http://httpbin.org")).route("hystrix_route", r -> r.path("/hystrix").filters(f -> f.hystrix(config -> config.setName("mycmd").setFallbackUri("forward:/fallback"))).uri("http://httpbin.org")).route("custom_filter_route", r -> r.path("/api/test/**").filters(f -> f.rewritePath("/api/test/(?<segment>.*)", "/${segment}").filter(new CustomFilter())).uri("lb://project-test")).build();}// 自定義過濾器示例@Componentpublic static class CustomFilter implements GatewayFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 自定義過濾邏輯System.out.println("Custom Filter executed");return chain.filter(exchange);}}
}

五、高級配置與功能

1. 負載均衡

通過使用 lb://SERVICE-NAME 格式的 URI,Spring Cloud Gateway 可以與服務發現組件(如 Eureka、Nacos)集成,實現負載均衡:

spring:cloud:gateway:routes:- id: service_routeuri: lb://SERVICE-NAMEpredicates:- Path=/service/**

確保在項目中集成了服務發現客戶端,如 Eureka 或 Nacos。

2. 全局過濾器

全局過濾器應用于所有路由,常用于實現全局性的功能,如鑒權、日志記錄等。創建一個全局過濾器:

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在請求處理前執行的邏輯System.out.println("Global Pre Filter executed");return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 在請求處理后執行的邏輯System.out.println("Global Post Filter executed");}));}@Overridepublic int getOrder() {return -1; // 過濾器的執行順序,數值越小優先級越高}
}

3. 限流

使用 RequestRateLimiter 過濾器實現請求限流,通常與 Redis 配合使用:

spring:cloud:gateway:routes:- id: rate_limit_routeuri: http://example.compredicates:- Path=/rate-limit/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10     # 每秒允許的請求數redis-rate-limiter.burstCapacity: 20     # 每秒最大允許的請求數key-resolver: "#{@userKeyResolver}"      # 限流鍵解析器,需在代碼中定義

需要在代碼中定義 key-resolver Bean,例如基于用戶 ID 限流:

@Bean
KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}

4. 熔斷與重試

結合 Resilience4j 或 Hystrix 實現熔斷和重試機制:

spring:cloud:gateway:routes:- id: circuit_breaker_routeuri: http://example.compredicates:- Path=/circuit-breaker/**filters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/fallback

六、日志監控與運維

1. 日志功能

Spring Cloud Gateway 提供了豐富的日志功能,可以記錄請求和響應的詳細信息,幫助進行故障排查和性能優化:

  • ??控制臺日志??:默認情況下,網關會將請求和響應信息輸出到應用日志中
  • ??文件日志??:配置日志框架(如 Logback、Log4j2)將日志輸出到文件
  • ??集成 ELK??:將日志發送到 Elasticsearch、Logstash 和 Kibana 進行集中管理和分析

2. 監控工具

使用監控工具對網關的性能和流量進行實時監控和統計:

  • ??Spring Boot Actuator??:提供健康檢查、指標監控等功能
  • ??Prometheus + Grafana??:集成 Prometheus 收集指標,使用 Grafana 進行可視化展示
  • ??Micrometer??:與應用性能監控系統(如 Atlas、Datadog、New Relic)集成

七、最佳實踐與常見問題

1. 最佳實踐

  1. ??合理設計路由規則??:根據業務需求設計清晰、簡潔的路由規則,避免過于復雜的斷言組合
  2. ??使用服務發現??:與注冊中心集成,實現動態路由和負載均衡,提高系統的彈性和可擴展性
  3. ??實施安全策略??:通過過濾器實現鑒權、防止 SQL 注入、XSS 等安全措施
  4. ??監控與日志??:實施全面的日志記錄和監控,及時發現和解決問題
  5. ??性能優化??:利用緩存、限流和熔斷機制,保障網關的高可用性和高性能

2. 常見問題

  1. ??路由不生效??:檢查路由的 predicates 是否正確匹配請求,確保 id 唯一,配置無誤
  2. ??性能瓶頸??:合理配置線程池和連接數,使用異步非阻塞模型,避免阻塞操作
  3. ??服務不可用??:確保后端服務正常運行,與注冊中心集成正確,負載均衡策略合適
  4. ??跨域問題??:通過 globalcors 配置正確處理跨域請求,或通過過濾器自定義跨域策略

八、總結

Spring Cloud Gateway 作為微服務架構中的重要組件,提供了強大而靈活的路由與過濾功能。通過本教程,您應該已經了解了如何集成 Spring Cloud Gateway、如何配置路由規則以及如何利用其豐富的功能來滿足各種業務需求。

YML 配置文件是配置 Spring Cloud Gateway 路由的主要方式,通過合理配置 routespredicatesfilters,可以實現復雜的路由邏輯和請求處理。同時,結合服務發現、負載均衡、限流、熔斷等高級功能,可以構建高可用、高性能的微服務網關。

在實際項目中,建議根據具體業務需求,結合 Spring Cloud Gateway 的擴展能力,定制適合的路由與過濾策略,并通過監控與日志功能,確保網關的穩定運行與高效性能。

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

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

相關文章

防火墻 只允許信任的幾臺服務器訪問

1. 首先&#xff0c;確保 firewalld 服務正在運行&#xff1a;systemctl start firewalld systemctl enable firewall2. 設置默認拒絕規則&#xff1a;設置默認拒絕所有流量&#xff08;拒絕所有的入站流量&#xff09;&#xff1a;firewall-cmd --zonepublic --add-rejectal…

十三,數據結構-樹

定義樹也是基于節點的數據結構&#xff0c;和鏈表不同的是&#xff0c;樹的節點可以指向多個節點。首先對樹的一些常用術語進行說明&#xff1a;最上面的節點叫做根節點&#xff0c;根位于樹頂&#xff0c;如圖中的節點A&#xff1b;和族譜一樣&#xff0c;節點有后代和祖先&am…

JVM-默背版

1.JVM對sychronized的優化&#xff1a;鎖膨脹、鎖消除、鎖粗化、自適應自旋鎖 &#xff08;1&#xff09;鎖膨脹&#xff1a;從無鎖、偏向鎖、輕量級鎖、重量級鎖的過程叫做鎖膨脹。在JDK1.6以前&#xff0c;sychronized是由重量級鎖實現的&#xff0c;加鎖和解鎖的過程需要從用…

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一鍵安裝)

在 Mac M 系列芯片&#xff08;Apple Silicon/ARM 架構&#xff09;上部署 YOLOv8&#xff0c;有一些注意事項&#xff1a;PyTorch 需要安裝 ARM 原生版本&#xff0c;推理可利用 Metal 后端加速 CPU。本文教你一步步完成環境配置、模型下載、依賴安裝和驗證推理。1?? 環境準…

Python爬蟲實戰:研究Units模塊,構建氣象數據采集和分析系統

1. 引言 1.1 研究背景 隨著信息技術的飛速發展,互聯網已成為全球最大的信息庫,涵蓋氣象、金融、醫療、農業等多個領域的海量數據。這些數據蘊含著巨大的潛在價值,如何有效獲取并深入分析這些數據成為當下研究的熱點。Python 作為一種功能強大的編程語言,憑借其豐富的庫資…

網頁設計模板 HTML源碼網站模板下載

互聯網已成為現代社會不可或缺的一部分&#xff0c;網站則是連接線上與線下世界的橋梁。無論是用于展示個人作品集、推廣商業產品還是提供公共服務信息&#xff0c;一個設計精良且功能完善的網站都能發揮巨大作用。然而&#xff0c;傳統的手工編碼方式不僅耗時費力&#xff0c;…

Flink KeyedProcessFunction為什么能為每個key定義State和Timer?

問題描述 一個常見的開窗邏輯&#xff08;12H 或者 500條&#xff09;&#xff1a; import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初階---函數模版、類模版

&#x1f31f;個人主頁&#xff1a;第七序章 &#x1f308;專欄系列&#xff1a;C&#xff0b;&#xff0b; 目錄 ??前言&#xff1a; &#x1f308;1.泛型編程&#xff1a; &#x1f308;2.函數模板 &#x1f36d;2.1函數模板概念 &#x1f36d;2.2函數模板格式 &am…

查找算法(Java)

目錄 一.定義 二.分類 三.線性查找 原理&#xff1a; 思路分析 代碼實現 例題實踐 1.兩數之和 方法一&#xff1a;暴力窮舉法 思路分析 代碼實現 方法二&#xff1a;創建哈希表 思路分析 代碼實現 2.移動零 思路分析 代碼實現 四.二分查找 原理&#xff1a; …

計算機網絡--四層模型,IP地址和MAC地址

四層模型&#xff1a;分別是應用層&#xff0c;傳輸層&#xff0c;網絡層和鏈路層。應用層&#xff1a;提供了應用程序之間相互通信的接口&#xff0c;允許用戶訪問網絡服務。這一層定義了應用程序如何與底層網絡進行交互。例如HTTP協議。傳輸層&#xff1a;它處理數據的分段、…

解析、創建Excel文件的開源庫OpenXLSX介紹

OpenXLSX是一個C庫&#xff0c;用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源碼地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License為BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 &#xff08;缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字&#xff08;出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

構建Python環境的幾種工具

本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊&#xff0c;無需額外安裝。 ②virtualenv:venv的前身&#xff0c;功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

c#項目編譯時外部依賴文件的同步問題

很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件&#xff0c;需要編譯時同步到bin\debug或bin\release下的&#xff0c;這里面要修改工程文件代碼實現。 比如&#xff0c;我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面&#xff0c;希望編譯的時候…

數學建模常用算法-模擬退火算法

一、模擬退火算法模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后&#xff0c;緩慢冷卻&#xff0c;金屬原子會在熱能作用下自由運動&#xff0c;逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型&#xff1a;“溫度 T”&#xff1a;對應物理中的…

架構很簡單:業務架構圖

緣起業務架構是一個復雜的體系&#xff0c;如何更簡單的表達&#xff0c;并能使用起來呢&#xff1f;所謂&#xff1a;大道至簡。基于此&#xff0c;這篇文章就開始了。業務是一切架構的開始&#xff0c;如果沒有業務&#xff0c;架構又有什么作用呢&#xff1f;所以做架構首先…

【前端埋點】純前端實現 A/B Test

“純前端實現 A/B Test”&#xff0c;意思就是 沒有后端分流、也不依賴流量網關&#xff0c;那么只能靠前端邏輯來做“流量切分”。 &#x1f3af; 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致&#xff08;否則用戶刷新頁面時 A/B 會跳…

Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法&#xff0c;核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器&#xff0c;正確的數據權重減小&#xff0c;錯誤的數據權重增加二…

C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

C#語言入門詳解&#xff08;18&#xff09;傳值、輸出、引用、數組、具名、可選參數、擴展方法一、傳值參數1. 值類型2. 引用類型&#xff0c;并且創建對象3. 引用類型&#xff0c;不創建對象二、引用參數1. 值類型2. 引用類型&#xff0c;創建新對象3. 引用類型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…