1. 概述:什么是 Spring Cloud Gateway?
Spring Cloud Gateway 是 Spring Cloud 生态中的 API 网关,基于 Spring WebFlux + Reactor + Netty 构建,旨在替代 Zuul 1.x,提供更高效、更灵活的网关服务。
主要功能:
- 请求路由与转发
- 统一鉴权、限流、熔断
- 日志与监控
- 跨域、重试、改写等
2. 核心优势:为什么选择 Gateway?
| 对比点 | Zuul 1.x | Spring Cloud Gateway |
|---|---|---|
| 底层模型 | Servlet 阻塞 I/O | WebFlux + Netty 非阻塞 I/O |
| 并发能力 | 每个请求占用一个线程,高并发下性能下降 | 少量线程处理大量请求,吞吐量高 |
| 编程风格 | 继承 ZuulFilter,命令式 | 响应式 GlobalFilter,函数式 |
| 动态路由 | 支持有限,需额外实现 | 内置 /refresh 端点,易对接配置中心 |
| 生态集成 | 维护状态,社区活跃度低 | Spring 官方主推,与 Cloud 生态无缝集成 |
3. 核心概念:Route、Predicate、Filter
3.1 Route(路由)
- 定义:网关的基本配置单元,包含 id、目标 URI、一组 Predicate、一组 Filter。
- 配置方式:支持 YAML、Java DSL、动态加载。
3.2 Predicate(断言)
- 作用:匹配请求条件,满足条件的请求才会走该路由。
- 常见断言(面试时至少能列举 5-6 个):
| Predicate | 说明 | 示例 |
|---|---|---|
| Path | 路径匹配 | - Path=/user/** |
| Method | HTTP 方法 | - Method=GET |
| Header | 请求头匹配 | - Header=X-Request-Id, \d+ |
| Query | 请求参数匹配 | - Query=name, jack |
| Cookie | Cookie 匹配 | - Cookie=sessionId, \d+ |
| Host | 主机名匹配 | - Host=**.example.com |
| After/Before/Between | 时间匹配 | - After=2024-01-01T00:00:00+08:00 |
| RemoteAddr | IP 地址匹配 | - RemoteAddr=192.168.0.0/16 |
一个路由可以配置多个 Predicate,必须同时满足才会匹配。
3.3 Filter(过滤器)
- 作用:对请求/响应进行拦截和处理。
- 分类:
- 按生命周期:Pre(转发前)、Post(响应返回前)
- 按作用范围:GatewayFilter(局部,作用于特定路由)、GlobalFilter(全局,作用于所有路由)
常用内置 GatewayFilter:
AddRequestHeader(添加请求头)RewritePath(路径重写)StripPrefix(去掉路径前缀)RequestRateLimiter(限流)Retry(重试)CircuitBreaker(熔断)
常用全局过滤器:
LoadBalancerClientFilter:负载均衡,解析lb://URINettyRoutingFilter:转发请求到后端服务GatewayMetricsFilter:监控指标收集RemoveCachedBodyFilter:清除缓存请求体
4. 请求流转全过程
当请求到达 Gateway,经过以下步骤:
-
Netty 服务器接收请求
Gateway 启动时启动 Reactor Netty 服务端,监听端口。 -
DispatcherHandler 分发
WebFlux 的DispatcherHandler将请求交给RoutePredicateHandlerMapping。 -
路由匹配
RoutePredicateHandlerMapping遍历所有路由,使用 Predicate 匹配请求,找到对应的FilteringWebHandler。 -
构建过滤器链
FilteringWebHandler将全局过滤器与该路由的局部过滤器合并,形成有序的过滤器链。 -
执行 Pre 过滤器
依次执行过滤器链中chain.filter(exchange)之前的逻辑(鉴权、限流、请求改写等)。 -
负载均衡
当过滤器链中的LoadBalancerClientFilter发现 URI 以lb://开头时,从注册中心获取服务实例,通过负载均衡算法(如轮询)选择一个实例,替换 URI。 -
转发请求
NettyRoutingFilter利用 Netty 的 HttpClient 非阻塞地转发请求到目标服务,并等待响应。 -
执行 Post 过滤器
收到响应后,过滤器链反向执行 Post 阶段逻辑(日志、响应改写、异常降级)。 -
返回客户端
最终响应由 Netty 服务器写回客户端。