前言

我们知道 Spring Cloud Gateway 最终一定会将请求路由到后端的真实服务上,那么你知道 Spring Cloud Gateway 是在哪里调用的后端服务吗?

源码之下无秘密,让我们一起从源码中寻找答案。

源码分析

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

上图是来自Spring Cloud Gateway 官网的一个整体工作流程展示,可以明确看到在Filter链在最后调用了真实服务,也就是Proxied Service

DefaultGatewayFilterChain 中断点调试,我们可以看到最后两个 Filter 分别是 ForwardRoutingFilterNettyRoutingFilter

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

我们先看下 ForwardRoutingFilter 的源码,发现其是用来处理 forward 用的,不是我们要找的地方。

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

那么我们继续再看看 NettyRoutingFilter 的源码。

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

源码中可以非常清晰的看到 getHttpClientrequest,也就是获取HttpClient发起请求操作

结论

所以最终的结论就是:

Spring Cloud Gateway 是在 NettyRoutingFilter 中调用的后端真实服务

扩展

我们知道了 Spring Cloud Gateway 是在 NettyRoutingFilter 中使用 HttpClient 发起了对后端真实服务的调用,那么这个 HttpClient 是哪里来的呢?

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

源码告诉我们 httpClientNettyRoutingFilter 的成员变量,由 NettyRoutingFilter 构造函数传入。

查看 NettyRoutingFilter 构造函数的调用关系,可以发现 NettyRoutingFilter 是在 GatewayAutoConfiguration 中自动配置的。

【源码】Spring Cloud Gateway 是在哪里调用后端真实服务的?-LMLPHP

也就是说 HttpClient 是在 GatewayAutoConfiguration 这里通过构造函数的方式注入到 NettyRoutingFilter 当中的。

04-27 14:56