Spring Cloud Gateway 如何將請求分發到各個服務

前言

在微服務架構中,API 網關(API Gateway)扮演著非常重要的角色。它負責接收客戶端請求,并根據預定義的規則將請求路由到對應的后端服務。Spring Cloud Gateway 是 Spring 官方推出的一款高性能網關,支持動態路由、負載均衡、限流等功能。本文將詳細介紹 Spring Cloud Gateway 的工作原理、配置方式以及如何實現請求分發,并附帶源碼和 UML 圖示。


一、Spring Cloud Gateway 的核心概念

1.1 核心組件

  • Route(路由):網關的基本構建塊,包含一個 ID、目標 URI 和一組斷言(Predicate)和過濾器(Filter)。只有當請求滿足斷言條件時,才會被路由到指定的目標服務。
  • Predicate(斷言):用于匹配 HTTP 請求中的特定條件,例如路徑、方法、頭信息等。
  • Filter(過濾器):對請求和響應進行處理,如修改請求頭、添加日志、鑒權等。

1.2 工作流程圖

以下是 Spring Cloud Gateway 的工作流程圖:

客戶端發送請求
Gateway 接收請求
匹配路由規則
執行全局過濾器
轉發請求到目標服務
目標服務處理請求
返回響應到 Gateway
執行后置過濾器
返回響應給客戶端

二、配置 Spring Cloud Gateway

2.1 引入依賴

pom.xml 文件中添加以下依賴:

<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Boot WebFlux --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><!-- Spring Cloud Load Balancer (用于負載均衡) --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies>

2.2 配置路由規則

application.yml 中定義路由規則。以下是一個簡單的示例:

spring:cloud:gateway:routes:- id: user_service_routeuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- AddRequestHeader=X-Gateway-Version, v1.0- id: order_service_routeuri: lb://ORDER-SERVICEpredicates:- Path=/order/**filters:- AddResponseHeader=X-Gateway-Version, v1.0
配置說明:
  • id:路由的唯一標識符。
  • uri:目標服務地址,lb:// 表示使用負載均衡器(Load Balancer)。
  • predicates:定義匹配條件,例如路徑 /user/**
  • filters:定義請求或響應的處理邏輯,例如添加請求頭或響應頭。

三、實現請求分發的核心邏輯

3.1 動態路由匹配

Spring Cloud Gateway 使用 Predicate 來匹配請求。以下是一個基于路徑的分發邏輯示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("user_service_route", r -> r.path("/user/**").filters(f -> f.addRequestHeader("X-Gateway-Version", "v1.0")).uri("lb://USER-SERVICE")).route("order_service_route", r -> r.path("/order/**").filters(f -> f.addResponseHeader("X-Gateway-Version", "v1.0")).uri("lb://ORDER-SERVICE")).build();}
}
代碼解析:
  • RouteLocatorBuilder 用于構建路由規則。
  • .path("/user/**") 匹配以 /user/ 開頭的路徑。
  • .uri("lb://USER-SERVICE") 將請求轉發到注冊中心的服務 USER-SERVICE

3.2 負載均衡

Spring Cloud Gateway 內置了對負載均衡的支持,通過 lb:// 協議可以實現服務發現和負載均衡。

示例場景:

假設有兩個用戶服務實例 USER-SERVICE-1USER-SERVICE-2 注冊到了 Eureka 注冊中心,Gateway 會根據負載均衡策略自動選擇一個實例來處理請求。


3.3 自定義過濾器

除了內置過濾器,您還可以自定義過濾器來實現特定功能,例如鑒權、日志記錄等。

以下是一個自定義過濾器的示例:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;@Component
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {public LoggingFilter() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {System.out.println("請求路徑:" + exchange.getRequest().getPath());return chain.filter(exchange).then(Mono.fromRunnable(() -> {System.out.println("響應狀態碼:" + exchange.getResponse().getStatusCode());}));};}public static class Config {// 可以在這里定義配置參數}
}
使用自定義過濾器:

application.yml 中引用自定義過濾器:

spring:cloud:gateway:routes:- id: user_service_routeuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- LoggingFilter

四、完整示例

以下是一個完整的 Spring Cloud Gateway 示例,包括服務注冊與發現、負載均衡和自定義過濾器。

4.1 項目結構

gateway-service/
├── src/main/java/com/example/gateway/
│   ├── GatewayApplication.java
│   ├── GatewayConfig.java
│   └── LoggingFilter.java
├── src/main/resources/
│   └── application.yml
└── pom.xml

4.2 啟動類

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

4.3 配置文件

server:port: 8080spring:application:name: gateway-servicecloud:gateway:routes:- id: user_service_routeuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- LoggingFilter- id: order_service_routeuri: lb://ORDER-SERVICEpredicates:- Path=/order/**filters:- AddResponseHeader=X-Gateway-Version, v1.0eureka:client:service-url:defaultZone: http://localhost:8761/eureka/

五、總結

通過本文,我們詳細介紹了 Spring Cloud Gateway 的核心概念、配置方式以及如何實現請求分發。以下是關鍵點總結:

  1. 核心組件:Route、Predicate 和 Filter 是 Gateway 的三大核心組件。
  2. 動態路由:通過 Path 斷言實現請求分發。
  3. 負載均衡:結合 Eureka 注冊中心實現服務發現和負載均衡。
  4. 自定義過濾器:擴展 Gateway 功能,實現日志記錄、鑒權等需求。

希望本文能幫助您快速上手 Spring Cloud Gateway,并將其應用到實際項目中。如果您有任何問題或建議,請隨時留言交流!


參考資料

  • Spring Cloud Gateway 官方文檔
  • Spring Cloud Netflix Eureka 文檔

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

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

相關文章

打造高功率、高電流和高可靠性電路板的厚銅PCB生產

厚銅PCB生產是指制作一種具有較厚銅層的PCB&#xff08;Printed Circuit Board&#xff0c;印刷電路板&#xff09;。這種PCB通常用于高功率、高電流和高可靠性的電子設備中。厚銅PCB的生產過程包括以下幾個 主要步驟&#xff1a; 1. 基材準備 厚銅PCB的基材通常采用FR4或CEM-…

軟考高級-系統架構設計師 論文范文參考(一)

文章目錄 論SOA技術的應用論SOA在企業信息化中的應用論UP&#xff08;統一過程方法&#xff09;的應用論分布式數據庫的設計與實現論改進Web服務器性能的有關技術論基于UML的需求分析論基于構件的軟件開發論基于構件的軟件開發(二) 論SOA技術的應用 摘要&#xff1a; ?本人于…

京東平臺關鍵字搜索接口開發指南:Python實現與代碼詳解

一、接口概述 京東關鍵字搜索接口允許開發者通過HTTP請求獲取平臺商品的關鍵字搜索結果&#xff0c;常用于商品比價、數據分析等場景。本文基于Python演示如何調用京東搜索接口&#xff0c;解析返回數據并實現基礎功能。 二、技術實現步驟 接口地址分析? 京東未完全公開API…

淺析鎖的應用與場景

鎖的應用與場景&#xff1a;從單機到分布式 摘要&#xff1a;在多線程和分布式系統中&#xff0c;“鎖”是避免資源競爭、保障數據一致性的核心機制。但你真的了解鎖嗎&#xff1f;什么時候該用鎖&#xff1f;用哪種鎖&#xff1f;本文通過通俗的比喻和代碼示例&#xff0c;帶…

30天通過軟考高項-第三天

30天通過軟考高項-第三天 任務&#xff1a;項目范圍管理 思維導圖閱讀 知識點集錦閱讀 知識點記憶 章節習題練習 知識點練習 手寫回憶ITTO 聽一遍喜馬拉雅關于范圍的內容 范圍管理-背 1. 過程定義 規劃變瘦訂份缺孔 規劃范圍管理&#xff1a;為了記錄如何定…

文字過長使用省略號展示,text-overflow 的使用和不生效場景的解決辦法,flex 布局中文字省略展示的坑

在前端開發過程中【單行文本內容過長使用省略號展示】這是一個特別常見的功能&#xff0c;大家都知道要使用 text-overflow 這個 css 屬性。 關于這個屬性&#xff0c;我們可以先看一下官方文檔怎么說。 text-overflow CSS 屬性用于確定如何提示用戶存在隱藏的溢出內容。其形式…

(二)讀寫分離架構、冷熱分離架構

文章目錄 讀寫分離架構什么是讀寫分離結構架構模型優缺點優點缺點 技術案例寫情況讀情況 冷熱分離架構什么是冷熱分離架構?架構模型優缺點優點 缺點技術案例讀數據寫數據 讀寫分離架構 什么是讀寫分離結構 讀寫分離架構針對于數據庫。數據庫原本負責讀寫兩個功能。 讀寫分離架…

windows中kafka4.0集群搭建

參考文獻 Apache Kafka windows啟動kafka4.0&#xff08;不再需要zookeeper&#xff09;_kafka壓縮包-CSDN博客 Kafka 4.0 KRaft集群部署_kafka4.0集群部署-CSDN博客 正文 注意jdk需要17版本以上的 修改D:\software\kafka_2.13-4.0.0\node1\config\server.properties配置文…

無線通信網

注意區分CA&#xff08;無線&#xff09;和CD&#xff08;有線&#xff09; 無線局域網擴頻技術 FHSS/DSSS 無線頻譜和信道&#xff1a;2.4G/5GHz,2.4GHz共13個信道&#xff0c;3個不重疊信道 CSMA/CA&#xff0c;隱藏節點 MANET 無線安全&#xff1a;WEP、WPA、WPA2、AES/TP…

嵌入式開發:基礎知識介紹

一、嵌入式系統 1、介紹 以提高對象體系智能性、控制力和人機交互能力為目的&#xff0c;通過相互作用和內在指標評價的&#xff0c;嵌入到對象體系中的專用計算機系統。 2、分類 按其形態的差異&#xff0c;一般可將嵌入式系統分為&#xff1a;芯片級&#xff08;MCU、SoC&am…

uv包管理器如何安裝依賴?

uv包管理器如何安裝依賴? 輸入 uv pip install 包名 uv pip install python-docx

大模型驅動智能服務變革:從全流程賦能到行業縱深落地

大模型技術的快速發展&#xff0c;正深刻改變著人工智能的研發與應用模式。作為"軟硬協同、開箱即用"的智能化基礎設施&#xff0c;大模型一體機通過整合計算硬件、部署平臺和預置模型&#xff0c;重構了傳統AI部署方式&#xff0c;成為推動AI普惠化和行業落地的重要…

【MQ篇】RabbitMQ之簡單模式!

目錄 引言一、 初識 RabbitMQ 與工作模式二、 簡單模式 (Simple Queue) 詳解&#xff1a;最直接的“點對點快遞” &#x1f4ee;三、 Java (Spring Boot) 代碼實戰&#xff1a;讓小兔子跑起來&#xff01; &#x1f430;&#x1f3c3;?♂?四、 深入理解&#xff1a;簡單模式的…

Lua 第7部分 輸入輸出

由于 Lua 語言強調可移植性和嵌入性 &#xff0c; 所以 Lua 語言本身并沒有提供太多與外部交互的機制 。 在真實的 Lua 程序中&#xff0c;從圖形、數據庫到網絡的訪問等大多數 I/O 操作&#xff0c;要么由宿主程序實現&#xff0c;要么通過不包括在發行版中的外部庫實現。 單就…

【開源】STM32HAL庫移植Arduino OneWire庫驅動DS18B20和MAX31850

項目開源鏈接 github主頁https://github.com/snqx-lqh本項目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo作者 VXQinghua-Li7 &#x1f4d6; 歡迎交流 如果開源的代碼對你有幫助&#xff0c;希望可以幫我點個贊&#x1f44d;和收藏 項目說明 最近在做一個項目…

【合新通信】浸沒式液冷光模塊與冷媒兼容性測試技術報告

一、測試背景與核心挑戰 行業需求驅動 隨著800G/1.6T光模塊功耗突破30W/端口&#xff0c;傳統風冷已無法滿足散熱需求&#xff0c;浸沒式液冷成為超算/AI數據中心的主流方案。冷媒兼容性是系統可靠性的關鍵指標&#xff0c;涉及材料腐蝕、光學性能、長期穩定性等維度。 核心…

Pandas中的日期時間date處理

Pandas提供了強大的日期和時間處理功能&#xff0c;這對于時間序列分析至關重要。本教程將介紹Pandas中處理日期時間的主要方法。包括&#xff1a; 日期時間數據的創建和轉換日期時間屬性的提取時間差計算和日期運算重采樣和頻率轉換時區處理基于日期時間的索引操作 Pandas中…

Vue3文件上傳組件實戰:打造高效的Element Plus上傳解決方案,可以對文件進行刪除,查看,下載功能。

在現代Web開發中,文件上傳功能是許多應用的核心需求之一。無論是企業管理系統、內容管理系統還是醫療信息系統,上傳附件的功能都至關重要。本文將分享一個基于 Vue3 和 Element Plus 實現的文件上傳組件,結合父子組件的協作,展示如何構建一個功能強大、用戶體驗友好的文件上…

AI 工程師崛起:科技浪潮下的新興力量

在當今科技迅猛發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;無疑是最熱門的領域之一。隨著基礎模型的涌現和開源 / API 的普及&#xff0c;一種新興的職業 ——AI 工程師&#xff0c;正逐漸嶄露頭角。他們在 AI 技術的應用和開發中扮演著關鍵角色&#xff0c;其崛…

人工智能與機器學習:Python從零實現邏輯回歸模型

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…