获课地址:666it.top/13977/
一、 核心架构预览:Route、Predicate、Filter的三位一体
在深入流程之前,必须理解Gateway的三个核心概念:
Route: 路由信息的主体,包含目标URI、一组断言(Predicate)和一组过滤器(Filter)。
Predicate: Java 8 Predicate接口的实现,用于判断当前的HTTP请求是否匹配该路由。匹配条件可以是路径、方法、Header、时间等。
Filter: Spring Framework GatewayFilter接口的实现,用于在请求发出前或响应返回后,对请求和响应进行修改或增强。
简而言之:一个请求通过Predicate匹配到唯一的Route,然后经过该Route上指定的Filter链进行处理。
二、 请求处理流程源码级拆解
整个处理流程建立在Project Reactor的响应式编程模型之上,我们将其梳理为一条清晰的主线。
第一步:请求入口与网关过滤器的初始化
DispatcherHandler: 作为Spring WebFlux的请求分发器,它是所有请求的入口。它根据请求信息寻找对应的处理器映射器。
RoutePredicateHandlerMapping: 这是Gateway专用的处理器映射器。它的核心工作是getHandlerInternal方法,在这里,它会遍历内存中所有的Route定义,调用每个Route的Predicate进行匹配。
匹配成功: 一旦找到第一个匹配的Route,便会将该Route与一批全局过滤器 以及Route自身配置的路由过滤器 组合起来,构建成一个过滤器链。这个链被封装在一个FilteringWebHandler中,并返回给上层。
第二步:过滤器链的执行精髓 - DefaultGatewayFilterChain
FilteringWebHandler的handle方法是真正执行过滤逻辑的地方。
构建链: 它将全局过滤器和路由过滤器合并、排序,组装成一个DefaultGatewayFilterChain实例。
链式调用: 调用filterChain.filter(exchange)启动整个链条。这里传入的ServerWebExchange是一个非常重要的对象,它封装了请求和响应的上下文信息,在整个处理流程中传递和演变。
“前置”与“后置”逻辑: 这是过滤器设计的精妙之处。一个典型的GatewayFilter实现如下所示:
java
// 伪代码逻辑
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1. 前置处理 Pre-Filtering: 在调用下一个过滤器之前执行
log.info("前置逻辑:修改请求...");
exchange.getRequest().mutate().header("X-Trace-Id", "12345");
// 2. 委托给链中的下一个过滤器
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 3. 后置处理 Post-Filtering: 在下游(包括目标服务)处理完毕,响应返回后执行
log.info("后置逻辑:处理响应...");
exchange.getResponse().getHeaders().add("X-Response-Time", System.currentTimeMillis());
}));
}
chain.filter(exchange)之前是前置处理,用于修改请求。
.then(...)中的逻辑是后置处理,用于修改响应。这是一个响应式编程的典型模式。
第三步:关键过滤器:NettyRoutingFilter与LoadBalancerClientFilter
在众多的过滤器中,有两个至关重要:
LoadBalancerClientFilter(如果使用了负载均衡): 这是一个前置过滤器。它会检查Route的URI,如果是以lb://开头(例如lb://user-service),它就会介入。
它会从URI中提取服务名(user-service)。
调用负载均衡器(默认与Ribbon集成),从服务发现中心获取实例列表,并根据规则(如轮询)选择一个健康的实例。
将原始的lb://user-serviceURI重写为具体的http://192.168.1.10:8080。至此,抽象的服务名被具象化为真实的网络地址。
NettyRoutingFilter: 这是最终发起真实网络请求的过滤器。它接收已经被前面过滤器处理过的exchange,其中包含了最终的目标URL。它使用Netty的HttpClient发起一个真正的异步、非阻塞的HTTP请求到目标服务。
它将请求方法、头、体等信息转发出去。
然后等待目标服务的响应。
收到响应后,将响应信息设置回exchange,然后继续完成过滤器链的后置处理部分。
第四步:响应返回
当NettyRoutingFilter收到响应,并且所有过滤器的后置处理都执行完毕后,这个响应就会通过DispatcherHandler被写回给客户端。
三、 核心设计模式与总结
通过以上源码追踪,我们清晰地看到了:
责任链模式: 过滤器链是这一模式的经典应用,每个过滤器职责单一,通过链条组织,灵活可扩展。
响应式编程: 全程基于Reactor,实现了非阻塞的异步处理,这是Gateway高性能的基石。
配置驱动: 路由、断言、过滤器的定义大多通过配置(或API)完成,体现了“约定优于配置”的思想。
理解了这个流程,当遇到路由失败、过滤器不生效、负载均衡异常等问题时,你就能在心中勾勒出请求的完整流向,从而进行高效的排查。在下一篇文章中,我们将继续深入,探讨Gateway如何动态刷新路由,以及如何编写自定义的过滤器和断言。
有疑问加站长微信联系(非本文作者))
