前言
我们知道 Spring Cloud Gateway 最终一定会将请求路由到后端的真实服务上,那么你知道 Spring Cloud Gateway 是在哪里调用的后端服务吗?
源码之下无秘密,让我们一起从源码中寻找答案。
源码分析
上图是来自Spring Cloud Gateway 官网的一个整体工作流程展示,可以明确看到在Filter
链在最后调用了真实服务,也就是Proxied Service
。
在 DefaultGatewayFilterChain
中断点调试,我们可以看到最后两个 Filter
分别是 ForwardRoutingFilter
和 NettyRoutingFilter
。
我们先看下 ForwardRoutingFilter
的源码,发现其是用来处理 forward
用的,不是我们要找的地方。
org.springframework.cloud.gateway.filter.ForwardRoutingFilter
那么我们继续再看看 NettyRoutingFilter
的源码。
org.springframework.cloud.gateway.filter.NettyRoutingFilter
源码中可以非常清晰的看到 getHttpClient
和 request
,也就是获取HttpClient
和 发起请求操作。
结论
所以最终的结论就是:
Spring Cloud Gateway 是在 NettyRoutingFilter
中调用的后端真实服务。
扩展
我们知道了 Spring Cloud Gateway 是在 NettyRoutingFilter
中使用 HttpClient
发起了对后端真实服务的调用,那么这个 HttpClient
是哪里来的呢?
源码告诉我们 httpClient
是 NettyRoutingFilter
的成员变量,由 NettyRoutingFilter
构造函数传入。
查看 NettyRoutingFilter
构造函数的调用关系,可以发现 NettyRoutingFilter
是在 GatewayAutoConfiguration
中自动配置的。
org.springframework.cloud.gateway.config.GatewayAutoConfiguration
也就是说 HttpClient
是在 GatewayAutoConfiguration
这里通过构造函数的方式注入到 NettyRoutingFilter
当中的。