Spring Cloud Gateway 完全指南

6 阅读3分钟

1. 概述:什么是 Spring Cloud Gateway?

Spring Cloud Gateway 是 Spring Cloud 生态中的 API 网关,基于 Spring WebFlux + Reactor + Netty 构建,旨在替代 Zuul 1.x,提供更高效、更灵活的网关服务。

主要功能

  • 请求路由与转发
  • 统一鉴权、限流、熔断
  • 日志与监控
  • 跨域、重试、改写等

2. 核心优势:为什么选择 Gateway?

对比点Zuul 1.xSpring Cloud Gateway
底层模型Servlet 阻塞 I/OWebFlux + 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/**
MethodHTTP 方法- Method=GET
Header请求头匹配- Header=X-Request-Id, \d+
Query请求参数匹配- Query=name, jack
CookieCookie 匹配- Cookie=sessionId, \d+
Host主机名匹配- Host=**.example.com
After/Before/Between时间匹配- After=2024-01-01T00:00:00+08:00
RemoteAddrIP 地址匹配- RemoteAddr=192.168.0.0/16

一个路由可以配置多个 Predicate,必须同时满足才会匹配。

3.3 Filter(过滤器)

  • 作用:对请求/响应进行拦截和处理。
  • 分类
    • 按生命周期:Pre(转发前)、Post(响应返回前)
    • 按作用范围:GatewayFilter(局部,作用于特定路由)、GlobalFilter(全局,作用于所有路由)

常用内置 GatewayFilter

  • AddRequestHeader(添加请求头)
  • RewritePath(路径重写)
  • StripPrefix(去掉路径前缀)
  • RequestRateLimiter(限流)
  • Retry(重试)
  • CircuitBreaker(熔断)

常用全局过滤器

  • LoadBalancerClientFilter:负载均衡,解析 lb:// URI
  • NettyRoutingFilter:转发请求到后端服务
  • GatewayMetricsFilter:监控指标收集
  • RemoveCachedBodyFilter:清除缓存请求体

4. 请求流转全过程

当请求到达 Gateway,经过以下步骤:

  1. Netty 服务器接收请求
    Gateway 启动时启动 Reactor Netty 服务端,监听端口。

  2. DispatcherHandler 分发
    WebFlux 的 DispatcherHandler 将请求交给 RoutePredicateHandlerMapping

  3. 路由匹配
    RoutePredicateHandlerMapping 遍历所有路由,使用 Predicate 匹配请求,找到对应的 FilteringWebHandler

  4. 构建过滤器链
    FilteringWebHandler 将全局过滤器与该路由的局部过滤器合并,形成有序的过滤器链。

  5. 执行 Pre 过滤器
    依次执行过滤器链中 chain.filter(exchange) 之前的逻辑(鉴权、限流、请求改写等)。

  6. 负载均衡
    当过滤器链中的 LoadBalancerClientFilter 发现 URI 以 lb:// 开头时,从注册中心获取服务实例,通过负载均衡算法(如轮询)选择一个实例,替换 URI。

  7. 转发请求
    NettyRoutingFilter 利用 Netty 的 HttpClient 非阻塞地转发请求到目标服务,并等待响应。

  8. 执行 Post 过滤器
    收到响应后,过滤器链反向执行 Post 阶段逻辑(日志、响应改写、异常降级)。

  9. 返回客户端
    最终响应由 Netty 服务器写回客户端。