Spring Cloud Gateway工作原理与过滤器链
请详细介绍Spring Cloud Gateway的架构原理(非阻塞WebFlux、Netty、Route/Predicate/Filter)。Gateway过滤器链的执行顺序是怎样的?与Zuul(1.x)有什么区别?如何实现限流和鉴权?
回答
Yahuda
Spring Cloud Gateway核心概念:
- Route(路由):网关的基本构建块,包含ID、目标URI、Predicate集合、Filter集合
- Predicate(断言):匹配HTTP请求的条件(如路径、请求头、参数、时间等)
- Filter(过滤器):对请求/响应进行修改的拦截器
工作原理:
- 客户端请求到达Gateway
- DispatcherHandler(基于WebFlux)匹配Route(遍历Predicates)
- 匹配成功后,组装Filter链(pre + post)
- 通过Netty转发请求到目标服务
- 返回响应(经过post过滤器)
过滤器执行顺序:
- GatewayFilter(路由级别的过滤器,@Order控制顺序)
- GlobalFilter(全局过滤器,ordered接口控制顺序)
- Pre类型(加自定义请求头、鉴权、限流)→ 转发 → Post类型(修改响应)
Gateway vs Zuul 1.x:
| 对比 | Gateway | Zuul 1.x |
|---|---|---|
| 底层 | Spring WebFlux + Netty | Servlet(阻塞IO) |
| 线程模型 | 事件驱动(非阻塞) | 每个请求一个线程(BIO) |
| 性能 | 高(非阻塞IO) | 一般(线程池inflight受限) |
| 长连接 | 支持WebSocket | 不支持 |
| 限流 | 内置RequestRateLimiter | 需自定义 |
限流实现:
filters:
- name: RequestRateLimiter
args:
key-resolver: "#{@userKeyResolver}"
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
鉴权实现:自定义GlobalFilter,在Chain.filter之前校验Token/JWT。