【Spring Cloud 微服務】2.守護神網關Gateway

目錄

1.API網關的作用

2.Spring Cloud Gateway 是什么?

3.核心由來與背景

1. 微服務架構的挑戰:

2. API 網關模式的興起:

3. Zuul 的局限性:

4. Spring Cloud Gateway 的誕生:

4.核心特征:

5.核心概念與工作原理

1. 路由 (Route)

2. 斷言 (Predicate)

3. 過濾器 (Filter)

工作原理流程

6.如何與 Spring Cloud 集成

第一步:創建項目并添加依賴

第二步:配置文件 (application.yml)

第三步:編寫簡單的降級控制器

第四步:主啟動類

7.集成案例:一個簡單的路由

總結


1.API網關的作用

在微服務中,每個模塊都是單獨的服務,每個服務之間通過Fegin或著RPC之間進行通信,那我們客戶端如何與不同服務進行調用呢?

但是帶來以下幾個問題

在我們引入APi網關之后

架構優勢:

  1. 簡化客戶端:客戶端只需知道網關的地址,不需要了解所有微服務的細節
  2. 安全性:可以在網關層面統一實施安全策略
  3. 可觀察性:集中收集日志、指標和追蹤信息
  4. 靈活性:可以在不影響客戶端的情況下重構后端服務

2.Spring Cloud Gateway 是什么?

Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Project Reactor 等技術構建的 API 網關。它的核心是一個建立在 Spring Framework 之上的反向代理,旨在為微服務架構提供一種簡單、有效且統一的方式來路由到 API,并提供跨領域的關注點,如:安全、監控/指標和彈性。

3.核心由來與背景

要理解 Spring Cloud Gateway 的由來,需要先了解微服務架構的演進和其前身。

1. 微服務架構的挑戰:


在微服務架構中,系統被拆分為數十甚至上百個細粒度的服務。客戶端(如 Web 前端、移動 App)如果直接與這些服務通信,會面臨諸多問題:

  • 客戶端復雜性:客戶端需要知道所有服務的網絡位置(IP/域名)。
  • 交叉關切點:每個服務都需要獨立實現認證、授權、日志、限流等功能,造成代碼重復和維護困難。
  • 協議適配:后端微服務可能使用 gRPC、Dubbo 等協議,而外部客戶端通常只接受 HTTP/HTTPS。

2. API 網關模式的興起:

為了解決上述問題,API 網關模式 應運而生。它作為系統的唯一入口,扮演了“門衛”和“路由器”的角色,將所有非業務功能集中處理。Netflix 開源的 Zuul 是這個領域的先驅。

3. Zuul 的局限性:

Spring Cloud 早期整合了 Netflix Zuul 1.x 作為其網關解決方案。

然而,Zuul 1.x 基于 阻塞式 I/O (Servlet API) 模型。在處理大量并發連接或慢速客戶端時,容易阻塞工作線程,成為性能瓶頸,無法很好地應對未來的響應式編程趨勢。

4. Spring Cloud Gateway 的誕生:

為了提供一款現代化、高性能、響應式且與 Spring 生態無縫集成的官方網關,Spring 團隊自己開發了 Spring Cloud Gateway。它的設計目標非常明確:

    • 性能:基于 Netty 和 Project Reactor,提供非阻塞、異步的響應式編程模型,能夠輕松處理高并發場景。
    • 與 Spring 生態深度集成:天生支持通過服務發現(如 Eureka、Nacos)動態路由,與 Spring Cloud CircuitBreaker、Spring Cloud Security 等組件完美配合。
    • 強大的功能:提供簡單而強大的斷言(Predicates)過濾器(Filters) 機制,可以通過配置或編程方式靈活地定義路由和請求處理邏輯。
    • 面向未來:支持 WebSocket、gRPC 等現代通信協議。

簡單來說,Spring Cloud Gateway 是 Spring 官方為了取代老舊的 Zuul 1.x,順應響應式編程潮流而推出的新一代高性能 API 網關

4.核心特征:

  1. 建立在 Spring Framework 5、Project Reactor 和 Spring Boot 2 之上:這意味著它天生支持異步非阻塞(Reactive) 模型,能夠輕松處理高并發請求,資源消耗低,性能強勁。
  2. 動態路由:能夠與任何服務發現組件(如 Eureka, Nacos, Consul)集成,實現到微服務的動態路由。
  3. 請求限流:集成 Resilience4j 或 Sentinel 實現限流和熔斷。
  4. 路徑重寫:可以修改轉發前后的請求路徑。
  5. 強大的過濾器(Filter):提供了豐富的、功能各異的過濾器,用于在請求轉發前(Pre) 和接收響應后(Post) 執行各種邏輯(如修改請求頭、添加參數、認證鑒權、記錄日志等)。

5.核心概念與工作原理

要理解 Gateway,必須先掌握它的三個核心概念:路由(Route)斷言(Predicate)過濾器(Filter)

1. 路由 (Route)

路由是網關最基礎的部分。它由一個 ID、一個目標 URI、一組斷言和一組過濾器組成。如果斷言為真,則匹配該路由,請求就會被轉發到目標 URI。

  • id:路由的唯一標識。
  • uri:最終要轉發到的目標地址。可以是 lb://SERVICE-NAME(lb 代表從注冊中心負載均衡)或一個具體的 http://host:port
  • predicates:斷言數組,決定什么時候使用這個路由。
  • filters:過濾器數組,用于在發送下游請求之前或之后修改請求和響應。

2. 斷言 (Predicate)

這是 Java 8 中的 Predicate 函數式接口。它接收一個 ServerWebExchange 對象,可以訪問到請求的所有信息(如路徑、方法、頭、參數等),并返回布爾值。

  • 作用:定義匹配條件。例如:“如果請求路徑是 /api/user/**” 或 “如果請求方法是 GET 并且包含一個 X-Token 頭”。
  • 常見斷言Path, Method, Header, Host, Query, Cookie, After, Before 等。

3. 過濾器 (Filter)

這是 Gateway 的核心功能組件,基于 Spring Framework 的 GatewayFilter 工廠構建。

  • 作用:在請求被轉發前(pre)收到響應后(post) 執行特定操作。
  • 種類
    • Gateway Filter:作用于單個路由。
    • Global Filter:作用于所有路由,實現 GlobalFilter 接口,常用于全局鑒權、日志等。
  • 常見過濾器AddRequestHeader, AddRequestParameter, AddResponseHeader, StripPrefix, PrefixPath, RewritePath, Retry, RequestRateLimiter, Hystrix (已不推薦,用 Resilience4j)。

工作原理流程

一個請求到達 Spring Cloud Gateway 后的處理流程,清晰地展示了其基于反應式編程模型的核心組件如何協同工作:路由定位、斷言判斷及過濾器鏈處理。


6.如何與 Spring Cloud 集成

集成非常簡單,主要通過 spring-cloud-starter-gateway 依賴和配置文件即可完成。

第一步:創建項目并添加依賴

創建一個新的 Spring Boot 項目,在 pom.xml 中添加以下依賴:

<dependencies><!-- Spring Cloud Gateway 核心依賴 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- 與服務發現組件集成(以Nacos為例) --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 如果需要限流等功能,引入Resilience4j --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-circuitbreaker-reactor-resilience4j</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><!-- Spring Cloud 版本管理 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.8</version> <!-- 請使用最新穩定版 --><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba 版本管理 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.5.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

第二步:配置文件 (application.yml)

這是最核心的集成部分,展示了如何配置路由、與服務發現集成、配置過濾器等。

server:port: 8080 # 網關端口spring:application:name: api-gatewaycloud:gateway:discovery:locator:enabled: true # 開啟根據服務名自動創建路由的功能(可選)lower-case-service-id: true # 服務名小寫routes:# 路由1: 用戶服務路由- id: user-service-routeuri: lb://user-service # lb:// 表示從注冊中心負載均衡發現服務predicates:- Path=/api/user/**   # 斷言:路徑匹配- Method=GET,POST     # 斷言:請求方法匹配filters:- StripPrefix=1       # 過濾器:去掉路徑的第一部分(/api),再轉發給user-service- AddRequestHeader=X-Request-color, blue # 過濾器:添加請求頭- name: RequestRateLimiter # 過濾器:請求限流args:redis-rate-limiter.replenishRate: 10 # 每秒允許的請求數redis-rate-limiter.burstCapacity: 20 # 每秒最大處理的請求數key-resolver: "#{@userKeyResolver}" # 限流策略(需自己定義Bean)# 路由2: 訂單服務路由- id: order-service-routeuri: lb://order-servicepredicates:- Path=/api/order/**- After=2023-01-20T17:42:47.789-07:00[America/Denver] # 在此時間之后生效filters:- StripPrefix=1- name: CircuitBreaker # 斷路器過濾器 (Resilience4j)args:name: myCircuitBreakerfallbackUri: forward:/fallback/orderServiceDown # 降級URI# 全局默認過濾器,會對所有路由生效default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue# Nacos 服務發現與注冊配置nacos:discovery:server-addr: localhost:8848# 配置限流使用的Redis(如果使用了RequestRateLimiter過濾器)redis:host: localhostport: 6379

第三步:編寫簡單的降級控制器

當觸發熔斷時,需要一個本地的 fallback 端點來返回托底信息。


@RestController
@RequestMapping("/fallback")
public class FallbackController {@GetMapping("/orderServiceDown")public ResponseEntity<String> orderServiceFallback() {return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body("訂單服務暫時不可用,請稍后再試。");}
}

第四步:主啟動類

主啟動類非常簡單,只需添加 @EnableDiscoveryClient 注解即可與 Spring Cloud 集成。

@SpringBootApplication
@EnableDiscoveryClient // 啟用服務發現客戶端
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class, args);}
}

7.集成案例:一個簡單的路由

假設你有兩個服務:

  • user-service (注冊到 Nacos,實例地址為 localhost:8081)
  • order-service (注冊到 Nacos,實例地址為 localhost:8082)

配置網關路由后

  • 當你訪問 http://localhost:8080/api/user/1 (網關地址)
  • Gateway 的 Path 斷言匹配到 /api/user/**
  • StripPrefix=1 過濾器會將路徑中的第一部分 /api 去掉
  • 最終,網關會將請求負載均衡地轉發到 user-service/user/1 這個接口上。
  • 對于客戶端來說,它只和網關交互,完全不知道后端微服務的具體地址,實現了解耦和統一入口。

總結

Spring Cloud Gateway 通過 路由 + 斷言 + 過濾器 的組合,提供了一個強大而靈活的方式來管理微服務API的入口流量。它與 Spring Cloud 生態系統的其他組件(如服務發現、熔斷器)無縫集成,通過簡單的 YAML 配置即可完成大部分工作,是構建現代微服務架構不可或缺的組件。

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

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

相關文章

解讀商業智能BI,數據倉庫中的元數據

之前的文章討論過數據分析、數據治理、數據倉庫等等&#xff0c;即使是非業內人員從字面意思&#xff0c;也是可以了解一二的&#xff0c;但是&#xff0c;很多人對于元數據可能就比較陌生了。那么&#xff0c;今天我們就來聊一聊元數據管理。數據倉庫要說元數據&#xff0c;那…

3 種無誤的方式刪除 Itel 手機上的短信

如果你希望釋放存儲空間、保護隱私&#xff0c;或者準備出售或轉讓手機&#xff0c;刪除 Itel 手機上的短信是一個實用的步驟。無論是收件箱中充斥著垃圾短信、過時的對話還是敏感內容&#xff0c;刪除不需要的短信可以讓你的消息體驗更加干凈和安全。本文將向你介紹 3 種簡單且…

【學習筆記】網絡安全專用產品類別與參考標準

一、基本標準 1.1 關鍵設備 網絡關鍵設備認證依據的強制標準為 GB 40050-2021。 1.2 專用產品 網絡安全專用產品認證依據的強制標準為 GB 42250-2022。 二、數據備份與恢復產品標準 相關標準&#xff1a; GB/T 29765-2021《信息安全技術 數據備份與恢復產品技術要求與測試評…

Pytho“張量”(Tensor)和 Java的“向量”(Vector)區別和聯系

在Python和Java中&#xff0c;“張量”&#xff08;Tensor&#xff09;和“向量”&#xff08;Vector&#xff09;是兩個不同語境下的概念&#xff0c;它們的設計目標、功能和應用場景存在顯著差異&#xff0c;但也存在一定的共性。以下從區別和聯系兩方面詳細說明&#xff1a;…

Ubuntu部署K8S集群

Ubuntu部署K8S集群 本例以三臺Ubuntu24.04為例,1master節點2worker節點 環境準備 修改hostname,三臺服務器分別執行 hostnamectl set-hostname k8s-master01hostnamectl set-hostname k8s-worker01hostnamectl set-hostname k8s-worker02 配置靜態ip(不同系統修改方法略微差…

openEuler系統安裝Ascend Docker Runtime的方法

在openEuler系統中使用NPU前一定要安裝Ascend Docker Runtime,也是在安裝CANN和mis-tei前的必備工作。 使用容器化支持、整卡調度、靜態vNPU調度、動態vNPU調度、斷點續訓、彈性訓練、推理卡故障恢復或推理卡故障重調度的用戶,必須安裝Ascend Docker Runtime。 下面是具體的安…

控制對文件的訪問:Linux 文件系統權限管理總結

在 Linux 系統中&#xff0c;文件權限是保障系統安全和數據完整性的核心機制。紅帽企業 Linux 9.0通過一套靈活且精細的權限控制體系&#xff0c;讓用戶能夠精確管理文件和目錄的訪問范圍。本章將系統梳理 Linux 文件系統權限的核心概念、管理方法及高級應用&#xff0c;為系統…

ansible中roles角色是什么意思?

文章目錄一、介紹二、Ansible Roles目錄編排三、創建role四、playbook調用角色五、roles中tags使用免費個人運維知識庫&#xff0c;歡迎您的訂閱&#xff1a;literator_ray.flowus.cn 一、介紹 角色是ansible自1.2版本引入的新特性&#xff0c;用于層次性、結構化地組織playbo…

pytorch 網絡可視化

1.torchsummary在 Anaconda prompt 中進入自己的 pytorch 環境&#xff0c;安裝依賴包。 bash pip install torchsummary 2.tensorboardX 3. graphviz torchviz 4.Jupyter Notebook tensorwatch 5.netron 6.hiddenlayer 7.PlotNeuralNet

可以一鍵生成PPT的AI PPT工具(最新整理)

在當今快節奏的職場環境中&#xff0c;高效制作專業PPT已成為一項必備技能。傳統PPT制作流程耗時費力&#xff0c;從構思大綱、搜集資料、撰寫內容到設計排版&#xff0c;往往需要數小時甚至數天時間。AI生成PPT工具的興起徹底改變了這一局面&#xff0c;讓職場人士能夠專注于內…

數倉核心概念闡述

數倉核心概念闡述一、數據倉庫建模模型二、數據處理架構三、流批處理架構演進**為什么需要流批融合&#xff1f;****1. Lambda 架構&#xff08;雙引擎護航&#xff09;****2. Kappa 架構&#xff08;流處理一統江湖&#xff09;****關鍵概念對照表****實際案例理解****演進趨勢…

Spring Boot 自動配置全流程深度解析

在 Spring Boot 的世界里&#xff0c;“約定優于配置” 理念通過自動配置機制展現得淋漓盡致。從一個簡單的SpringBootApplication注解開始&#xff0c;背后隱藏著一套精妙的自動配置加載流程。本文將從SpringBootApplication出發&#xff0c;逐步拆解自動配置類是如何被發現、…

AI:業務驅動與技術賦能:企業智能化應用的雙向進化深度指南

一、業務與技術的雙螺旋進化模型 1.1 從單向適配到雙向驅動的認知轉變 傳統的信息化建設往往遵循"業務提需求、技術做實現"的線性模式&#xff0c;這種模式在穩定的業務環境中確實有效&#xff0c;但在當前快速變化的數字化時代已經顯露出明顯的局限性。真正的數字化…

2721. 【SDOI2010】外星千足蟲

2721. 【SDOI2010】外星千足蟲 題解 題目描述 題目描述 公元2089年6月4日&#xff0c;在經歷了17年零3個月的漫長旅行后&#xff0c;“格納格魯一號”載人火箭返回艙終于安全著陸。此枚火箭由美國國家航空航天局&#xff08;NASA&#xff09;研制發射&#xff0c;行經火星、…

[RestGPT] RestGPT智能體

第3章&#xff1a;RestGPT智能體 歡迎回來&#x1f43b;??? 在第1章&#xff1a;配置與環境中&#xff0c;我們為RestGPT配備了必要的"鑰匙和密碼"&#xff1b;在第2章&#xff1a;OpenAPI規范(OAS)中&#xff0c;我們為它提供了與在線服務對話的"使用說明…

筆記本電腦Windows+Ubuntu 雙系統,Ubuntu無法掛載Windows的硬盤 報錯問題解決

目錄 一、前情提要 二、解決方案步驟 第一步&#xff1a;進入Windows進行修復和檢查。這是最關鍵的一步&#xff0c;目的是讓Windows來檢查和修復它自己的文件系統。 第二步&#xff1a;回到Ubuntu驗證掛載 三、總結與預防 一、前情提要 網上找到許多解決方案&#xff0c…

加密貨幣與區塊鏈:六大刑事重災區

高鵬律師&#xff08;首席數據官&#xff09;數字經濟團隊創作&#xff0c;AI輔助在數字貨幣的世界里&#xff0c;一夜暴富的傳說屢見不鮮&#xff0c;但頃刻間失去所有的悲劇也時有發生&#xff0c;現在&#xff0c;我將為您剖析加密貨幣與區塊鏈領域的六大刑事風險重災區&…

Spring Ai 1.0.1中存在的問題:使用MessageChatMemoryAdvisor導致System未被正確的放在首位

使用MessageChatMemoryAdvisor導致System未被正確的放在首位 如下是使用Spring Ai實現多輪對話的官方例子&#xff08;文檔地址&#xff1a;https://docs.spring.io/spring-ai/reference/api/chat-memory.html&#xff09;&#xff1a;AutowiredChatMemoryRepository chatMemor…

全景式綜述|多模態目標跟蹤全面解析:方法、數據、挑戰與未來

【導讀】 目標跟蹤&#xff08;Visual Object Tracking, VOT&#xff09;一直是計算機視覺領域的核心問題之一&#xff0c;廣泛應用于自動駕駛、無人機監控、人機交互等場景。隨著單模態方法在復雜環境下逐漸遇到瓶頸&#xff0c;多模態視覺目標跟蹤&#xff08;Multi-Modal V…

怎么用pytorch訓練一個模型,并跑起來

MNIST 手寫數字識別 任務描述 MNIST 手寫數字識別是機器學習和計算機視覺領域的經典任務&#xff0c;其本質是解決 “從手寫數字圖像中自動識別出對應的數字&#xff08;0-9&#xff09;” 的問題&#xff0c;屬于單標簽圖像分類任務&#xff08;每張圖像僅對應一個類別&#x…