多个主机的多个 WebClients ( Spring webflux )
Multiple WebClients ( Spring webflux ) for multiple hosts
在我的应用程序中,我调用了 4 个不同的 API(都在不同的主机上)。我想为每个主机和其他参数(例如保持活动等)有一个单独的连接池。我可以使用单个 WebClient 实现此目的,还是为此需要 4 个不同的 WebClient 实例?
此外,为每个主机设置一个单独的连接池有意义吗?如果没有,我可以使用单个 WebClient 实现吗?
这实际上取决于 Spring WebFlux 使用的底层 HTTP 库。现在 Spring 支持 Reactor Netty(默认)和 Jetty 客户端。
默认情况下,WebClient
将有一个连接池;连接根据主机+端口键重用,reactor.netty.resources.ConnectionProvider
将是弹性的,这意味着它永远不会等待打开新连接。您可以自己配置,将最大连接数设置为固定值。
据我所知,keepAlive 和所有与 TCP 相关的选项都是在 io.netty.channel.ChannelOption
的 TCP 级别处理的。我不认为您可以基于每个主机或每个连接池更改它们,因为它们属于事件循环资源。
其他客户端,如 Jetty,可能会提供不同的选项,但我假设您在这里使用的是默认选项。
我看不出有任何强有力的理由让每个主机都有一个连接池。我们通常试图实现的是最大限度地利用资源。例如在 Spring Boot 中,我们会自动配置一些东西,以便服务器和客户端(在同一个应用程序中)重用相同的资源。由于其中一些与 CPU 内核的数量相关,因此重复使用相同的内核可以提高整体效率。
有许多与 TCP 相关的选项,除非您有非常具体的问题要解决,否则我认为应该保留默认值,因为在这些选项中考虑了很多。
在我的应用程序中,我调用了 4 个不同的 API(都在不同的主机上)。我想为每个主机和其他参数(例如保持活动等)有一个单独的连接池。我可以使用单个 WebClient 实现此目的,还是为此需要 4 个不同的 WebClient 实例?
此外,为每个主机设置一个单独的连接池有意义吗?如果没有,我可以使用单个 WebClient 实现吗?
这实际上取决于 Spring WebFlux 使用的底层 HTTP 库。现在 Spring 支持 Reactor Netty(默认)和 Jetty 客户端。
默认情况下,WebClient
将有一个连接池;连接根据主机+端口键重用,reactor.netty.resources.ConnectionProvider
将是弹性的,这意味着它永远不会等待打开新连接。您可以自己配置,将最大连接数设置为固定值。
据我所知,keepAlive 和所有与 TCP 相关的选项都是在 io.netty.channel.ChannelOption
的 TCP 级别处理的。我不认为您可以基于每个主机或每个连接池更改它们,因为它们属于事件循环资源。
其他客户端,如 Jetty,可能会提供不同的选项,但我假设您在这里使用的是默认选项。
我看不出有任何强有力的理由让每个主机都有一个连接池。我们通常试图实现的是最大限度地利用资源。例如在 Spring Boot 中,我们会自动配置一些东西,以便服务器和客户端(在同一个应用程序中)重用相同的资源。由于其中一些与 CPU 内核的数量相关,因此重复使用相同的内核可以提高整体效率。
有许多与 TCP 相关的选项,除非您有非常具体的问题要解决,否则我认为应该保留默认值,因为在这些选项中考虑了很多。