1. 概述
本文将深入探讨Spring Cloud Gateway的核心特性,这是一个基于Spring 6、Spring Boot 3和Project Reactor构建的新API框架。
该工具为微服务架构提供了开箱即用的路由机制,常用于将多个服务隐藏在单一入口门面之后。
关于不依赖Spring Cloud Gateway项目的网关模式实现,可参考我们之前的文章。
2. 路由处理器
Spring Cloud Gateway专注于请求路由,会将请求转发给网关处理器映射(Gateway Handler Mapping),由其决定如何处理匹配特定路由的请求。
下面通过一个简单示例,展示网关处理器如何使用RouteLocator
解析路由配置:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("r1", r -> r.host("**.baeldung.com")
.and()
.path("/baeldung")
.uri("http://baeldung.com"))
.route(r -> r.host("**.baeldung.com")
.and()
.path("/myOtherRouting")
.filters(f -> f.prefixPath("/myPrefix"))
.uri("http://othersite.com")
.id("myOtherID"))
.build();
}
注意我们使用了该API的核心构建块:
- Route:网关的主要API,由唯一标识(ID)、目标地址(URI)以及一组谓词和过滤器定义
- Predicate:Java 8的
Predicate
,用于通过请求头、方法或参数匹配HTTP请求 - Filter:标准的Spring
WebFilter
3. 动态路由
与Zuul类似,Spring Cloud Gateway支持将请求路由到不同服务。
路由配置可通过纯Java(如第2节所示的RouteLocator
)或属性配置实现:
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: baeldung
uri: baeldung.com
- id: myOtherRouting
uri: localhost:9999
4. 路由工厂
Spring Cloud Gateway使用Spring WebFlux的HandlerMapping
基础设施进行路由匹配。
它内置了多种路由谓词工厂(Route Predicate Factories),所有这些谓词匹配HTTP请求的不同属性。多个路由谓词工厂可通过逻辑"与"组合使用。
路由匹配既可通过编程方式实现,也可通过配置属性文件使用不同类型的路由谓词工厂完成。
关于路由工厂的详细内容,可参考我们的文章Spring Cloud Gateway路由谓词工厂。
5. WebFilter工厂
路由过滤器允许修改传入的HTTP请求或传出的HTTP响应。
Spring Cloud Gateway不仅内置了多种WebFilter工厂,还支持创建自定义过滤器。
关于WebFilter工厂的详细内容,可参考我们的文章Spring Cloud Gateway WebFilter工厂。
6. Spring Cloud DiscoveryClient支持
Spring Cloud Gateway可与服务发现和注册库(如Eureka Server和Consul)轻松集成:
@Configuration
@EnableDiscoveryClient
public class GatewayDiscoveryConfiguration {
@Bean
public DiscoveryClientRouteDefinitionLocator
discoveryClientRouteLocator(DiscoveryClient discoveryClient) {
return new DiscoveryClientRouteDefinitionLocator(discoveryClient);
}
}
6.1. LoadBalancerClient过滤器
LoadBalancerClientFilter
会通过ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR
查找交换属性中的URI。
如果URL使用lb
方案(如lb://baeldung-service
),它将使用Spring Cloud的LoadBalancerClient
将服务名(即baeldung-service
)解析为实际的主机和端口。
未修改的原始URL会保存在ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR
属性中。
7. 监控
Spring Cloud Gateway利用了Spring Boot的Actuator API,这是一个知名库,提供了多种开箱即用的应用监控功能。
安装并配置Actuator API后,可通过访问/gateway/
接口查看网关监控特性。
8. 实现示例
现在我们创建一个简单示例,展示如何使用Spring Cloud Gateway作为代理服务器,并基于路径谓词(path predicate)进行路由。
8.1. 依赖项
通过添加spring-cloud-starter-gateway依赖引入项目,它会自动拉取所有必需依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>4.1.0</version>
</dependency>
8.2. 代码实现
在application.yml
中创建简单路由配置:
spring:
cloud:
gateway:
routes:
- id: baeldung_route
uri: http://baeldung.com
predicates:
- Path=/baeldung/
management:
endpoints:
web:
exposure:
include: "*"
网关应用代码如下:
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
9. 总结
本文探讨了Spring Cloud Gateway的部分核心特性与组件。这个新API为网关和代理支持提供了开箱即用的工具,特别适合微服务架构场景。✅
⚠️ 踩坑提示:配置路由时注意谓词和过滤器的顺序,否则可能导致意外行为。简单粗暴的调试方法是启用Actuator的
/gateway/routes
接口实时查看路由状态。