Spring Cloud Gateway
This content is not available in your language yet.
Spring Cloud Gateway 把请求接入、路由选择、跨切面处理和下游代理组合成一条 WebFlux 链。阅读重点不是配置项,而是 ServerWebExchange 如何携带路由状态并穿过有序过滤器。
本册问题地图
Section titled “本册问题地图”Spring Cloud Gateway 的核心是把“请求是否属于某条路由、经过哪些过滤器、最终如何转发”变成 Reactor 链:
- WebFlux 的非阻塞执行模型如何约束 Gateway 过滤器?
- Route、Predicate 和 Filter 如何从配置变成可执行链?
- 全局过滤器、路由过滤器和排序如何共同决定请求顺序?
- URL 重写、负载转发和响应提交分别发生在哪个阶段?
- Redis 限流和熔断 fallback 如何处理异步失败与资源释放?
| 项 | 值 |
|---|---|
| 仓库 | spring-cloud/spring-cloud-gateway |
| 本地路径 | E:\source\java\spring\spring-cloud-gateway |
| 分支 | main |
| Commit | b0d6a5228cbc517002cd64010486e94ed9eb9bf5(2026-08-11) |
| 最近 tag | v5.0.2 |
本册坐标均基于上述 commit,上游演进后行号可能漂移。
它解决什么问题
Section titled “它解决什么问题”- 把“请求是否属于某个路由”和“请求如何被改写、限流、转发”拆成可组合扩展点。
- 用响应式
Mono/Flux支撑高并发代理,避免每个下游连接占用阻塞线程。 - 允许全局过滤器、路由过滤器和外部
RouteLocator共同参与一次请求。
| 模块 | 职责 | 关键类 |
|---|---|---|
spring-cloud-gateway-server-webflux |
WebFlux 网关核心 | GatewayAutoConfiguration、RoutePredicateHandlerMapping |
route |
路由模型与路由来源 | Route、RouteDefinitionRouteLocator |
handler |
路由匹配与过滤器执行 | FilteringWebHandler、AsyncPredicate |
filter |
URL 转换、Netty 代理、全局过滤器 | RouteToRequestUrlFilter、NettyRoutingFilter |
filter.factory |
配置驱动的路由过滤器 | RequestRateLimiterGatewayFilterFactory |
读码入口顺序
Section titled “读码入口顺序”GatewayAutoConfiguration:确认 Bean 装配和 WebFlux 入口。RouteDefinitionRouteLocator#convertToRoute:看配置如何变成路由对象。RoutePredicateHandlerMapping#lookupRoute:看异步 predicate 如何选路由。FilteringWebHandler#handle:看过滤器如何合并排序。RouteToRequestUrlFilter→NettyRoutingFilter:看目标 URI 和下游代理。
- 整体架构:组件关系、启动装配与请求主流程
- Reactor 与 WebFlux 基础:响应式链、背压与
ServerWebExchange - Route 与 Predicate:路由构建、异步匹配和权重选择
- GatewayFilter 链:全局过滤器、路由过滤器和代理转发
- 限流与熔断:Redis 令牌桶与响应式熔断回退
- 面试专题:源码级回答与排障题
| 对象 | 相似点 | 关键差异 |
|---|---|---|
| Spring Security | 都以有序过滤器链承载横切逻辑 | Gateway 围绕路由和代理;Security 围绕认证授权 |
| Netty | 都以事件循环承载网络 IO | Gateway 把 Netty 封装成 WebFlux/Exchange 抽象 |
| Nginx | 都可做反向代理和流量治理 | Gateway 的路由与过滤器可由 Spring Bean 组合 |
面试锚点
- Gateway 如何从
RouteDefinition找到目标路由?- 全局过滤器和路由过滤器如何合并、排序?
RouteToRequestUrlFilter与NettyRoutingFilter为什么要分开?