多个主机的多个 WebClients ( Spring webflux )

XYZ*_*XYZ 6 reactive-programming spring-webflux

在我的应用程序中,我调用 4 个不同的 api(全部位于不同的主机上)。我希望为每个主机和其他参数(例如保持活动状态等)都有一个单独的连接池。我可以使用单个 WebClient 实现此目的还是需要 4 个不同的 WebClient 实例来实现此目的?

另外,为每个主机拥有单独的连接池是否有意义?如果没有,我可以使用单个 WebClient 来实现此目的吗?

Bri*_*zel 5

这实际上取决于 Spring WebFlux 使用的底层 HTTP 库。目前 Spring 支持 Reactor Netty(默认)和 Jetty 客户端。

默认情况下,WebClient将有一个连接池;连接根据主机+端口密钥重用,并且reactor.netty.resources.ConnectionProvider具有弹性,这意味着它将永远不会等待打开新连接。您可以配置自己的并将最大连接数设置为固定值。

据我所知,keepAlive 和所有与 TCP 相关的选项都是在 TCP 级别上使用io.netty.channel.ChannelOption. 我认为您不能在每个主机或每个连接池的基础上更改它们,因为它们属于事件循环资源。

其他客户端(例如 Jetty)可能会提供不同的选项,但我假设您在此处使用默认选项。

我认为没有任何充分的理由为每个主机配备一个连接池。我们通常试图实现的是资源利用率的最大化。例如,在 Spring Boot 中,我们会自动配置一些东西,以便服务器和客户端(在同一应用程序中)重用相同的资源。由于其中一些与 CPU 核心的数量相关,因此重复使用相同的核心可以提高整体效率。

有许多与 TCP 相关的选项,除非您有一个非常具体的问题要解决,否则我认为应该保留默认值,因为在这些选项中投入了很多心思。