Spring Cloud Gateway:新一代微服务网关详解
Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代网关组件,旨在替代 Zuul,基于 Spring 5、Spring Boot 2 和 Project Reactor 构建,采用非阻塞响应式编程模型,具备高性能、动态路由、熔断限流等核心能力,是微服务架构中连接客户端与后端服务的理想入口。
Gateway 的核心优势
相比第一代网关 Zuul,Gateway 具有以下显著优势:
- 响应式编程:基于 Netty 和 WebFlux,采用非阻塞 IO 模型,性能远超 Zuul 的同步阻塞模型,适合高并发场景;
- 功能丰富:内置动态路由、断言(Predicate)、过滤器(Filter)、负载均衡、熔断、限流等功能;
- 无缝集成:与 Spring Cloud 生态(如 Eureka、Consul、Hystrix、Sentinel)深度融合;
- 可扩展性:支持自定义断言和过滤器,灵活满足业务需求。
Gateway 的核心概念
Gateway 的核心功能围绕路由(Route)、断言(Predicate) 和过滤器(Filter) 三个组件展开,三者共同构成了网关的基本工作单元。
路由(Route)
路由是网关的基本转发规则,由以下部分组成:
- ID:路由唯一标识(如
user-service-route
); - URI:目标服务地址(如
lb://user-service
,lb
表示启用负载均衡); - Predicate 集合:断言规则,匹配请求后才会触发路由;
- Filter 集合:路由前后执行的过滤逻辑。
示例:当请求路径为 /user/**
时,转发到名为 user-service
的微服务。
断言(Predicate)
断言是路由的 “匹配条件”,基于 HTTP 请求的属性(如路径、方法、头信息、时间等)进行判断,返回 true
则匹配路由。
Gateway 内置多种断言工厂,常用的包括:
断言工厂 | 示例配置 | 功能说明 |
---|---|---|
PathPredicateFactory |
- Path=/dept/** |
匹配请求路径(支持通配符 * 和 ** ) |
MethodPredicateFactory |
- Method=GET,POST |
匹配 HTTP 方法(如 GET、POST) |
HeaderPredicateFactory |
- Header=X-Request-Id, \d+ |
匹配请求头(支持正则表达式) |
QueryPredicateFactory |
- Query=id, \d+ |
匹配请求参数(如 id 为数字) |
AfterPredicateFactory |
- After=2024-01-01T00:00:00+08:00 |
匹配指定时间之后的请求 |
示例:仅允许 GET 方法且路径为 /dept/**
的请求通过:
1 | predicates: |
过滤器(Filter)
过滤器用于在请求路由前后执行自定义逻辑(如修改请求 / 响应、日志记录、权限校验),分为全局过滤器(对所有路由生效)和路由过滤器(仅对特定路由生效)。
常用内置过滤器:
AddRequestHeaderFilter
:添加请求头;RewritePathFilter
:重写请求路径;HystrixGatewayFilter
:集成 Hystrix 实现熔断;RequestRateLimiterGatewayFilter
:请求限流。
示例:路由前添加 X-Request-Source
头信息:
1 | filters: |
Gateway 快速集成
1. 引入依赖
在 Spring Boot 项目中添加 Gateway 依赖(需排除 Spring MVC 依赖,避免冲突):
1 | <dependency> |
2. 启动类配置
通过 @EnableEurekaClient
注册到服务中心,无需额外注解启用 Gateway:
1 |
|
3. 核心配置
(1)静态路由配置
直接指定目标服务的固定地址(适用于非微服务场景):
1 | spring: |
(2)动态路由配置(推荐)
结合服务发现(如 Eureka),通过服务名动态获取地址并启用负载均衡:
1 | spring: |
访问示例:
请求 http://localhost:9527/dept/get/1
会被转发到 springcloud2-provider
服务的 /dept/get/1
接口,自动实现负载均衡。
高级功能配置
1. 路径重写
通过 RewritePath
过滤器修改请求路径,例如隐藏服务内部路径:
1 | routes: |
2. 集成 Hystrix 熔断
当后端服务故障时,返回降级响应:
1 | routes: |
降级接口实现:
1 |
|
3. 请求限流
基于 RequestRateLimiter
过滤器限制请求频率(使用 Redis 实现分布式限流):
1 | spring: |
与 Zuul 的对比
特性 | Spring Cloud Gateway | Zuul 1.x |
---|---|---|
底层架构 | 基于 Netty + WebFlux(非阻塞响应式) | 基于 Servlet(同步阻塞) |
性能 | 高(支持每秒数万请求) | 中(同步模型限制并发) |
功能完整性 | 内置动态路由、熔断、限流等 | 需依赖第三方组件扩展 |
扩展性 | 支持自定义断言和过滤器 | 过滤器扩展复杂 |
生态集成 | 与 Spring Cloud 无缝集成 | 需适配 Spring Cloud 生态 |
长连接支持 | 支持 WebSocket | 不支持(基于 Servlet 2.5) |
结论:Gateway 是微服务架构的首选网关,尤其适合高并发场景;Zuul 1.x 已停止更新,仅推荐用于维护旧系统。
总结
Spring Cloud Gateway 作为新一代网关,凭借响应式架构、丰富功能和良好的生态集成,成为微服务架构的核心组件。其核心通过路由、断言和过滤器实现请求的转发与处理,支持动态路由、负载均衡、熔断限流等关键能力,能有效简化微服务的入口管理
v1.3.10