目錄
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網關之后
架構優勢:
- 簡化客戶端:客戶端只需知道網關的地址,不需要了解所有微服務的細節
- 安全性:可以在網關層面統一實施安全策略
- 可觀察性:集中收集日志、指標和追蹤信息
- 靈活性:可以在不影響客戶端的情況下重構后端服務
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.核心特征:
- 建立在 Spring Framework 5、Project Reactor 和 Spring Boot 2 之上:這意味著它天生支持異步非阻塞(Reactive) 模型,能夠輕松處理高并發請求,資源消耗低,性能強勁。
- 動態路由:能夠與任何服務發現組件(如 Eureka, Nacos, Consul)集成,實現到微服務的動態路由。
- 請求限流:集成 Resilience4j 或 Sentinel 實現限流和熔斷。
- 路徑重寫:可以修改轉發前后的請求路徑。
- 強大的過濾器(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 配置即可完成大部分工作,是構建現代微服務架構不可或缺的組件。