文章目錄
- 1. 概述
- 1.1 API 網關
- 1.1 Spring Cloud Gateway
- 2. 集成案例
- 2.1 入門案例
- 2.2 動態路由
1. 概述
1.1 API 網關
API
網關已經成為了微服務架構的一個標配組件,是系統對外的唯一入口。所有的客戶端都通過統一的網關接入微服務,在網關層處理所有非業務功能。
API
網關的主要作用包括如下幾點:
- 統一對外接口
- 增加系統安全性
- 統一鑒權
- 服務注冊與授權
- 服務限流
- 提升預發能力
- 全鏈路跟蹤
常用網關解決方案:
Netflix Zuul
(已被淘汰)Spring Cloud Gateway
Nginx
+Lua
Kong
Traefik
Orange
1.1 Spring Cloud Gateway
官方文檔
Spring Cloud Gateway
是基于Spring
生態系統之上構建的API
網關,包括Spring 6
、Spring Boot 3
和Project Reactor
。
是Netflix Zuul
的替代方案,不僅提供統一的路由方式,還提供安全、指標度量、限流等方面的功能。 依托于Spring Cloud
生態,Spring Cloud Gateway
已經成為微服務架構中最流行的API
網關。
Spring Cloud Gateway
三大核心概念:
Route
:路由,網關的基本構建塊。它由一個ID
、一個目標URI
、一組謂詞和一組過濾器定義。Predicate
:Java 8
中的函數謂詞,輸入類型為Spring Framework ServerWebExchange
,允許匹配HTTP
請求中的任何內容,例如標頭或參數。如果聚合謂詞為true
,則匹配路由。Filter
:過濾器,Gateway Filter
的實例,由特定工廠構建,可以在發送下游請求之前或之后修改請求和響應。
2. 集成案例
2.1 入門案例
在之前的測試工程中創建一個網關模塊gateway-demo
:
引入spring-cloud-starter-gateway
依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.pearl</groupId><artifactId>nacos-demo</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>gateway-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>gateway-demo</name><description>gateway-demo</description><properties><java.version>17</java.version></properties><dependencies><!--API 網關--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
spring-cloud-starter-gateway
依賴中包含了網關以及WebFlux
:
啟動類:
@SpringBootApplication
public class GatewayDemoApplication {public static void main(String[] args) {SpringApplication.run(GatewayDemoApplication.class, args);}
}
application.yml
添加端口、服務名、路由規則配置:
server:port: 80
spring:application:name: gateway-democloud:gateway:routes:- id: order-demo # 路由唯一IDuri: http://localhost:9001 # 目標URIpredicates: # 斷言,為真則匹配成功- Path=/order/** # 配置規則Path,如果是order開頭的請求,則會將該請求轉發到目標URI
啟動項目查看日志,可以看到底層使用的是Netty
:
首先,我們直接訪問訂單服務中的接口:
然后通過網關地址訪問,可以看到網關根據路由配置進行了轉發:
2.2 動態路由
在上面的案例中,我們的路由都是寫在配置文件中的,在微服務架構中,后臺有很多個,地址也是動態的,這么配置肯定是不現實的,所以Spring Cloud Gateway
提供了基于注冊中心服務發現機制的動態路由。
Spring Cloud Gateway
支持與Eureka
、Nacos
、Consul
等進行整合,根據service ld
自動從注冊中心獲取服務地址并轉發請求,這樣做的好處不僅可以通過單個端點來訪問應用的所有服務,而且在添加或移除服務實例時不用修改網關的路由配置。
首先添加Nacos
和Load Balancer
依賴:
<!-- Nacos 服務發現客戶端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--客戶端負載均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
application.yml
添加Nacos
地址以及動態路由配置:
server:port: 80
spring:application:name: gateway-democloud:nacos:# 服務發現discovery:username: nacospassword: nacos# 命名空間namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec# 服務端地址,默認:127.0.0.1:8848server-addr: 127.0.0.1:8848gateway:discovery:locator:# 開啟服務發現動態路由enabled: true# 是否將服務名稱小寫lower-case-service-id: true
通過以下方式訪問:
# 網關地址/服務注冊名/目標請求路徑
http://localhost/app-service001/app1/test
成功通過服務名,轉發到具體的后臺應用: