【Spring Cloud Gateway 實戰系列】基礎篇:路由、斷言、過濾器、負載均衡深度解析

一、引言

在微服務架構中,API網關是流量的統一入口,承擔著路由轉發、流量管控、安全防護等核心職責。Spring Cloud Gateway作為Spring官方推薦的第二代網關,基于Spring 5.0、Spring Boot 2.0和Project Reactor構建,提供了高性能的響應式編程模型和豐富的擴展能力。相比 Zuul 1.x,它采用響應式編程模型,能夠更高效地處理高并發場景。
本文將從基礎入手,深入講解路由、斷言、過濾器、負載均衡及與Nacos的集成,幫助讀者快速掌握Gateway的核心技術。

二、核心概念與基礎架構

Spring Cloud Gateway 是 Spring Cloud 生態中基于 WebFlux 構建的高性能響應式 API 網關,定位為替代傳統的 Zuul 網關。其核心價值在于提供統一的路由管理、流量控制、安全防護等功能,成為微服務架構的 “統一入口”。

2.1 核心組件

Spring Cloud Gateway的核心由三大組件構成:

  • 路由(Route):路由是網關的基本單元,包含ID、目標URI、斷言和過濾器。
  • 斷言(Predicate):用于匹配請求條件(如路徑、參數、時間等),決定請求是否匹配當前路由。
  • 過濾器(Filter):分為全局過濾器(GlobalFilter)和局部過濾器(GatewayFilter),用于請求/響應的預處理和后處理。

2.2 核心功能

  • 路由轉發:根據請求規則將請求分發到不同微服務
  • 負載均衡:集成 Spring Cloud LoadBalancer 實現動態負載均衡
  • 過濾鏈:通過 Filter 鏈實現請求預處理和響應后處理
  • 動態配置:支持配置中心動態更新路由規則
  • 安全防護:集成 Spring Security 實現認證授權

2.3 核心優勢

  • 高性能:基于WebFlux的非阻塞IO模型,吞吐量比傳統網關提升30%以上。
  • 動態路由:支持從Nacos、Redis等動態加載路由規則,無需重啟服務。
  • 豐富的生態:內置30+開箱即用的過濾器,支持插件化擴展。

三、路由與斷言:網關的核心邏輯

3.1 路由配置基礎

路由配置通常在application.yml中定義,示例如下:

spring:cloud:gateway:routes:- id: user-service-routeuri: lb://user-service # 負載均衡服務名predicates:- Path=/api/user/** # 路徑匹配filters:- StripPrefix=1 # 移除路徑前綴

3.2 斷言(Predicate)詳解

斷言是路由匹配的核心條件,Spring Cloud Gateway提供了多種內置斷言工廠。
在這里插入圖片描述

3.2.1 路徑匹配斷言(Path)
  • 語法Path=/path/**
  • 示例:匹配以/api/user/開頭的所有路徑
predicates:- Path=/api/user/**
3.2.2 參數匹配斷言(Query)
  • 語法Query=param[,regex]
  • 示例:匹配包含token參數且值以Bearer_開頭的請求
predicates:- Query=token,Bearer_.*
3.2.3 IP段匹配斷言(RemoteAddr)
  • 語法RemoteAddr=192.168.1.0/24
  • 示例:僅允許來自192.168.1.0/24網段的請求
predicates:- RemoteAddr=192.168.1.0/24
3.2.4 時間范圍斷言(Between)
  • 語法Between=startTime,endTime
  • 示例:僅在2023-01-01至2023-12-31之間的請求生效
predicates:- Between=2023-01-01T00:00:00+08:00,2023-12-31T23:59:59+08:00
3.2.5 組合斷言(邏輯運算符)
  • 語法:使用()組合多個斷言
  • 示例:匹配路徑為/api/user且請求方法為POST的請求
predicates:- (Path=/api/user && Method=POST)
3.2.6 流量分配斷言(Weight)
  • 語法Weight=group,weight
  • 示例:將80%的流量轉發到weighthigh.org,20%轉發到weightlow.org
routes:- id: weight_highuri: https://weighthigh.orgpredicates:- Weight=group1,8- id: weight_lowuri: https://weightlow.orgpredicates:- Weight=group1,2

四、過濾器:請求與響應的精細化控制

4.1 過濾器分類

  • 全局過濾器(GlobalFilter):對所有路由生效,需實現GlobalFilter接口。
  • 局部過濾器(GatewayFilter):僅對當前路由生效,通過配置文件定義。
  • 默認過濾器(default-filters):對所有路由生效,配置在spring.cloud.gateway.default-filters中。

4.2 內置過濾器示例

4.2.1 添加請求頭(AddRequestHeader)
filters:- AddRequestHeader=X-Request-Id,${random.uuid}
4.2.2 移除路徑前綴(StripPrefix)
filters:- StripPrefix=1 # 移除第一個路徑段
4.2.3 限流過濾器(RequestRateLimiter)
filters:- name: RequestRateLimiterargs:key-resolver: "#{@remoteAddrKeyResolver}" # 基于IP限流redis-rate-limiter.replenishRate: 10 # 每秒生成10個令牌redis-rate-limiter.burstCapacity: 20 # 令牌桶容量

4.3 自定義全局過濾器

@Component
@Order(-1) // 優先級:數值越小,執行越早
public class AuthFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (token == null || !token.startsWith("Bearer ")) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange); // 放行請求}
}

五、負載均衡:與Nacos的深度集成

5.1 服務注冊與發現

  1. 引入依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置Nacos
spring:cloud:nacos:discovery:server-addr: localhost:8848 # Nacos服務地址gateway:discovery:locator:enabled: true # 啟用服務發現路由lower-case-service-id: true # 服務名小寫
  1. 路由配置
routes:- id: user-serviceuri: lb://user-service # 負載均衡服務名predicates:- Path=/api/user/**

5.2 負載均衡策略配置

默認使用輪詢策略,可通過@LoadBalancerClient指定其他策略:

@Configuration
public class LoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,ServiceInstanceListSupplier supplier) {return new RandomLoadBalancer(environment, supplier); // 隨機策略}
}@LoadBalancerClient(name = "user-service", configuration = LoadBalancerConfig.class)
public interface UserClient {// Feign客戶端接口
}

六、與Nacos的動態路由集成

6.1 動態路由配置

  1. 在Nacos控制臺創建配置文件
# Data ID: gateway-routes.yaml
spring:cloud:gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/api/product/**filters:- StripPrefix=1
  1. 在網關服務中加載配置
spring:cloud:config:import: "optional:nacos:gateway-routes.yaml"
  1. 動態刷新路由
curl -X POST http://localhost:8080/actuator/gateway/refresh

6.2 動態服務發現

網關會自動從Nacos獲取服務實例列表,實現動態負載均衡:

uri: lb://product-service # 自動發現服務實例

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

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

相關文章

基于springboot的鄉村旅游在線服務系統/鄉村旅游網站

管理員&#xff1a;登錄&#xff0c;個人中心&#xff0c;用戶管理&#xff0c;景點類型管理&#xff0c;旅游景點管理&#xff0c; 酒店信息管理&#xff0c;旅游線路管理&#xff0c;門票預訂管理&#xff0c;酒店預訂管理&#xff0c;旅游攻略管理&#xff0c;社區互動&…

JavaWeb筆記12

登錄的問題&#xff1a;用戶兩次登錄后會生成新舊兩個令牌&#xff0c;此時舊的不應該生效要使舊的失效&#xff1a;令牌主動失效機制 登錄成功后&#xff0c;給瀏覽器響應令牌的同時&#xff0c;把該令牌存儲到redis中 LoginInterceptor攔截器中&#xff0c;需要驗證瀏覽器攜帶…

算法牢籠與思想飛地:在人工智能時代守衛靈魂的疆域

當手指在鍵盤上敲下“幫我寫一篇關于XX的文章”&#xff0c;當屏幕上的“智能助手”瞬間輸出結構完整、引經據典的文字&#xff0c;當算法為我們精準推送“你可能感興趣”的一切——我們正被一種前所未有的認知便利所包圍。然而&#xff0c;在這層包裹著效率與舒適的華麗外衣之…

WebAssembly瀏覽器指紋識別技術——實驗評估與應用展望(下篇)

引言 在上篇文章中,我們詳細闡述了基于WebAssembly的瀏覽器指紋識別技術的理論基礎和核心方法。本文將進一步展示該技術在實際應用中的表現,通過大規模的實驗驗證其有效性,并深入探討相應的防護策略。同時,我們也將客觀分析該技術的應用前景與潛在風險,為相關領域的研究和…

kafka--基礎知識點--5.4--max.in.flight.requests.per.connection

一、參數定義 max.in.flight.requests.per.connection 是 Kafka 生產者客戶端配置參數&#xff0c;用于控制生產者與單個 Broker 連接中未確認請求的最大數量。簡單來說&#xff0c;它限制了生產者在等待之前發送的消息確認&#xff08;ACK&#xff09;時&#xff0c;可以同時向…

【Spring AI 0基礎教程】1、基礎篇 環境搭建 - 智能天氣預報助手

基礎篇 | 環境搭建 - 智能天氣預報助手 一、什么是 Spring AI Spring AI (https://spring.io/projects/spring-ai)]是 Spring 官方于 2023 年推出的 AI 應用開發框架&#xff0c;它如同 AI 世界的"Spring 生態連接器"&#xff0c;致力于簡化開發集成了 AI 功能的應…

深入淺出MyBatis緩存:如何讓數據庫交互飛起來

深入淺出MyBatis緩存&#xff1a;如何讓數據庫交互飛起來你是否遇到過這樣的場景&#xff1a;系統在高并發下響應緩慢&#xff0c;數據庫監控顯示CPU飆升&#xff0c;日志里充斥著大量重復SQL&#xff1f;作為開發者&#xff0c;我曾親眼目睹一個簡單的配置查詢拖垮整個系統。今…

【計算機考研(408)- 數據結構】緒論

緒論 基本概念&#xff08;理解即可&#xff09; 數據是信息的載體&#xff0c;是描述客觀事物屬性的數、字符及所有能輸入到計算機中并被計算機程序識別 和處理的符號的集合。數據是計算機程序加工的原料。&#xff08;For Example : 聲音/圖像/字符串等&#xff09; 數據元…

嵌入式學習-土堆PyTorch(9)-day25

進入尾聲&#xff0c;一個完整的模型訓練 &#xff0c;點亮的第一個led#自己注釋版 import torch import torchvision.datasets from torch import nn from torch.utils.tensorboard import SummaryWriter import time # from model import * from torch.utils.data import Dat…

Java變量詳解:局部變量、成員變量、類變量區別及使用場景

作為Java開發者&#xff0c;深入理解不同變量的特性是寫出高質量代碼的基礎。本文將為你全面解析三種核心變量類型&#xff0c;并通過實戰案例展示它們的正確使用方式。一、變量類型概覽 1. 局部變量&#xff08;Local Variable&#xff09; 定義&#xff1a;在方法、構造方法或…

【收集電腦信息】collect_info.sh

收集電腦信息 collect_info.sh #!/bin/bashoutput"info.txt" > "$output"# 1. OS Version echo " 操作系統名稱及版本 " >> "$output" lsb_release -d | cut -f2- >> "$output" echo -e "\n" >…

服務器清理空間--主要是conda環境清理和刪除

1.查看空間情況 (base) zhouy24RL-DSlab:~/zhouy24Files$ df -h Filesystem Size Used Avail Use% Mounted on udev 252G 0 252G 0% /dev tmpfs 51G 4.9M 51G 1% /run /dev/nvme0n1p3 1.9T 1.7T 42G 98% / tmpfs 252G …

UE5多人MOBA+GAS 26、為角色添加每秒回血回藍(番外:添加到UI上)

文章目錄添加生命值和藍量的狀態標簽創建無限GE并應用監聽添加和去除標簽每秒回復配上UI添加生命值和藍量的狀態標簽 添加新的標簽 CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Full)CRUNCH_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(Stats_Health_Empty)CRUNCH_API U…

MetaGPT源碼剖析(三):多智能體系統的 “智能角色“ 核心實現——Role類

每一篇文章都短小精悍&#xff0c;不啰嗦。今天我們來深入剖析Role類的代碼實現。在多智能體協作系統中&#xff0c;Role&#xff08;角色&#xff09;就像現實世界中的 "員工"&#xff0c;是執行具體任務、參與協作的基本單位。這段代碼是 MetaGPT 框架的核心&#…

【項目經驗】小智ai MCP學習筆記

理論 1、什么是MCP MCP(Model Context Protocol&#xff0c;模型上下文協議)是一種開放式協議&#xff0c;它實現了LLM與各種工具的調用。使LLM從對話、生成式AI變成了擁有調用三方工具的AI。用官方的比喻&#xff0c;MCP就是USB-C接口&#xff0c;只要實現了這個接口&#x…

Matlab學習筆記:矩陣基礎

MATLAB學習筆記:矩陣基礎 作為MATLAB的核心,矩陣是處理數據的基礎工具。矩陣本質上是一個二維數組,由行和列組成,用于存儲和操作數值數據。在本節中,我將詳細講解矩陣的所有知識點,包括創建、索引、運算、函數等,確保內容通俗易懂。我會在關鍵地方添加MATLAB代碼示例,…

技術演進中的開發沉思-38 MFC系列:關于打印

打印程序也是MFC開發中不能忽視的一個環節&#xff0c;現在做打印開發so easy。但當年做打印開發還是挺麻煩。在當年的桌面程序里就像拼圖的最后一塊&#xff0c;看著簡單&#xff0c;實則要把屏幕上的像素世界&#xff0c;準確映射到打印機的物理紙張上。而MFC 的打印機制就像…

Apache Ignite 長事務終止機制

這段內容講的是 Apache Ignite 中長事務終止機制&#xff08;Long Running Transactions Termination&#xff09;&#xff0c;特別是關于分區映射交換&#xff08;Partition Map Exchange&#xff09;與事務超時設置&#xff08;Transaction Timeout&#xff09;之間的關系。下…

網絡編程---TCP協議

TCP協議基礎知識TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;是互聯網核心協議之一&#xff0c;位于傳輸層&#xff08;OSI第4層&#xff09;&#xff0c;為應用層提供可靠的、面向連接的、基于字節流的數據傳輸服務。它與IP協議共同構成…

K 近鄰算法(K-Nearest Neighbors, KNN)詳解及案例

K近鄰算法&#xff08;K-Nearest Neighbors, KNN&#xff09;詳解及案例 一、基本原理 K近鄰算法是一種監督學習算法&#xff0c;核心思想是“物以類聚&#xff0c;人以群分”&#xff1a;對于一個新樣本&#xff0c;通過計算它與訓練集中所有樣本的“距離”&#xff0c;找出距…