当前位置: 首页 > news >正文

Spring Cloud Gateway 的执行链路详解

Spring Cloud Gateway 的执行链路详解


🎯 核心目标

明确 Spring Cloud Gateway 的请求处理全过程(从接收到请求 → 到转发 → 到返回响应),方便你在合适的生命周期节点插入你的逻辑。


🧱 核心执行链路图(执行顺序)

┌──────────────┐
│ 客户端请求   │
└────┬─────────┘↓
┌────┴─────────────┐
│ Netty HttpServer │ ←→ Reactor Netty(非阻塞)
└────┬─────────────┘↓
┌────┴────────────┐
│ HttpRoutePredicateEvaluator │ 路由匹配
└────┬────────────┘↓
┌────┴────────────┐
│ GlobalFilter Chain       │ ← 【你做定制的核心入口】
│  ├── GlobalFilter (Ordered)
│  ├── CustomFilter
│  └── FilterChain
└────┬────────────┘↓
┌────┴────────────┐
│ WebClient 调用目标服务  │(负载均衡、路由转发)
└────┬────────────┘↓
┌────┴────────────┐
│ 响应处理(过滤器链倒序) │
└────────────┬────┘↓客户端收到响应

🔄 Gateway 核心处理流程分阶段讲解


🔹 1. 请求接入:Netty 接收

  • Gateway 使用 Reactor Netty 构建 Server,所有请求是异步 + 非阻塞处理。
  • 请求通过 HttpServer 被接收并封装成 ServerWebExchange 对象(封装 request + response + 路由信息 + 上下文等)。

🔹 2. Route 匹配阶段(断言匹配)

配置文件中的路由定义,如:

spring:cloud:gateway:routes:- id: user_routeuri: http://user-servicepredicates:- Path=/api/user/**

这一步是通过 RoutePredicateHandlerMapping 完成:

✅ 判断当前请求路径是否匹配配置中的 predicates

📌 你可以实现 RoutePredicateFactory 来定制更复杂的匹配规则,例如 IP、请求头、时间段等


🔹 3. 全局过滤器链(GlobalFilter)执行阶段

这是你进行自定义操作的核心切入点

内置常用过滤器有:
过滤器类名作用顺序(order)
RemoveRequestHeaderGatewayFilter删除请求头-1
AddRequestHeaderGatewayFilter添加请求头0
RetryGatewayFilter自动重试-2
RequestRateLimiterGatewayFilter限流(结合 Redis)-10
HystrixGatewayFilter熔断降级-100

你也可以实现自己的 GlobalFilterGatewayFilterFactory

示例:自定义 GlobalFilter
@Component
@Order(-1) // 顺序越小越先执行
public class AuthGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (!StringUtils.hasText(token) || !checkToken(token)) {// 拦截请求,返回 401exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange); // 放行}
}

🔹 4. 网关调用下游服务(转发阶段)

  • 实际调用目标服务(通过 WebClient 发出请求)
  • 如果配置了 lb:// 前缀,会使用 Spring Cloud LoadBalancer 做负载均衡(Nacos、Eureka 都支持)
uri: lb://order-service

🔹 5. 响应返回时的处理(倒序执行 Filter)

在响应返回时,全局过滤器链会逆序执行,可以在这里做一些响应增强:

  • 添加响应头
  • 日志记录(返回码、耗时)
  • 数据脱敏
  • 响应体改写(结合缓存)

示例:记录响应耗时

@Component
@Order(1)
public class TimeLogFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {long start = System.currentTimeMillis();return chain.filter(exchange).then(Mono.fromRunnable(() -> {long cost = System.currentTimeMillis() - start;System.out.println("接口请求耗时:" + cost + "ms");}));}
}

🔧 常见自定义操作建议位置对照表

功能推荐实现方式说明
请求日志记录GlobalFilter获取 request 信息,记录 URI/参数/IP
参数校验(如签名)GlobalFilter拦截非法请求
JWT 鉴权GlobalFilter可选使用 Reactor 模式解析 token
限流(IP/QPS)Redis + 自定义 Filter或使用 Spring 官方限流 Filter
熔断降级Resilience4j/Hystrix可集成入 Gateway Filter
黑名单拦截GlobalFilter + Redis校验 IP 是否在黑名单
响应体改写RewriteResponseBodyFilter需要缓存响应流
请求体改写RewriteRequestBodyFilter非常规操作,需 cache request body

📌 注意事项:Netty + 响应式陷阱

Spring Cloud Gateway 是响应式编程,与传统 Servlet 不一样:

注意点说明
Request Body 只能读取一次需要使用 CachedBodyOutputMessage 缓存
Response 体也只能写一次修改响应需用 BodyInserter
操作是异步链式的推荐使用 Mono.defer()then() 等操作链
使用 @Order 控制顺序值越小越早执行,如认证应在最前面执行

🎁 Bonus:完整请求链源码入口参考(Spring Cloud Gateway)

模块类名说明
spring-cloud-gatewayGatewayAutoConfiguration自动装配
RoutePredicateHandlerMapping匹配路由
FilteringWebHandler核心过滤链执行器
GlobalFilter全局过滤器接口
GatewayFilterFactory局部路由过滤器工厂接口

相关文章:

  • 炫云平台全面支持Blender4.4云渲染
  • 【质量管理】质量管理的核心是什么?
  • blender关联复制与Three.js网格和材质共享验证
  • 有哪些哲学流派适合创业二
  • C/C++ 通用代码模板
  • Linux驱动开发1 - Platform设备
  • 搭建axure cloud私有化平台
  • 文件上传漏洞学习
  • 理解 results = model(source, stream=True) 的工作原理和优势
  • 利用pnpm patch给第三方库打补丁
  • 2025年K8s最新高频面试题
  • Excel自定义函数取拼音首字母
  • 在线终端(一个基于 Spring Boot 的在线终端模拟器,实现了类 Linux 命令行操作功能)
  • Spark-SQL核心编程实战:自定义函数与聚合函数详解
  • Spring Cache与Redis集成原理
  • 【iOS】UITableView性能优化
  • 【网络安全】谁入侵了我的调制解调器?(一)
  • vue3 文件下载(excel/rar/zip)
  • SQL Server中OPENJSON + WITH 来解析JSON
  • unity使用内建组件给刚体增加重力
  • b2c网站后台/腾讯朋友圈广告怎么投放
  • asp网站首页模板/抖音seo推广
  • 桂林疫情最新消息确诊19例/石家庄百度快照优化
  • 阆中做网站/网站编辑
  • 长沙民企人才网/sem和seo区别与联系
  • 哪里学网站开发/河南百度推广代理商