GatewayFilter 与 GlobalFilter 全操作
GatewayFilter 与 GlobalFilter 📖 前置阅读:本文假设读者已掌握 Route 和 Predicate 的配置方式。如果还不熟悉,建议先阅读 Spring Cloud Gateway 核心概念与快速上手 和 Predicate 与路由规则全解。 一、⚡ 路由转发了——但在转发前后你还想做很多事 Predicate 决定了请求走哪条路——但路上你还要做很多事: 请求 → 网关 → 后端 —— 转发过程中: ① 把 /api/users/1 转成 /1(去掉前缀) ② 自动加上 Header(X-Request-Id、X-Source) ③ 限制每个 IP 每秒只能调 10 次 ④ 请求失败时自动重试 3 次 ⑤ 把用户信息写入 Header(后端不用自己解析 JWT) ⑥ 后端 3 次失败后熔断——直接降级返回 这些全都靠 Filter 实现。Gateway 的 Filter 分两种——GatewayFilter(针对特定路由)和 GlobalFilter(针对所有路由)。 二、🧩 Filter 的执行模型——Pre Filter 和 Post Filter 一个 Filter 可以在两个阶段做事: public class DemoFilter implements GatewayFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // ===== Pre Filter:转发到后端之前执行 ===== System.out.println("① 请求进来了——做鉴权、限流、加 Header"); return chain.filter(exchange) // ← 转发到后端(或者说交给下一个 Filter) .then(Mono.fromRunnable(() -> { // ===== Post Filter:后端返回后执行 ===== System.out.println("⑤ 后端响应了——做日志、修改响应体"); })); } } 时间线: ① Pre Filter(鉴权) ② 下一个 Filter 的 Pre(限流) ③ 转发到后端 ④ 后端返回响应 ⑤ 当前 Filter 的 Post(修改响应) ⑥ 上一个 Filter 的 Post(记录日志) 这个链式结构是 WebFlux 的 Mono.then() 实现的——不是阻塞等待,而是注册回调。 ...