一、引言
在微服務架構中,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 服務注冊與發現
- 引入依賴:
<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>
- 配置Nacos:
spring:cloud:nacos:discovery:server-addr: localhost:8848 # Nacos服務地址gateway:discovery:locator:enabled: true # 啟用服務發現路由lower-case-service-id: true # 服務名小寫
- 路由配置:
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 動態路由配置
- 在Nacos控制臺創建配置文件:
# Data ID: gateway-routes.yaml
spring:cloud:gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/api/product/**filters:- StripPrefix=1
- 在網關服務中加載配置:
spring:cloud:config:import: "optional:nacos:gateway-routes.yaml"
- 動態刷新路由:
curl -X POST http://localhost:8080/actuator/gateway/refresh
6.2 動態服務發現
網關會自動從Nacos獲取服務實例列表,實現動態負載均衡:
uri: lb://product-service # 自動發現服務實例