在我的应用程序中,我正在调用4个不同的api(均在不同的主机上)。我想为每个主机和其他参数有一个单独的连接池(例如,保持活动状态等)。我可以使用单个WebClient来实现这一目标,还是需要4个不同的WebClient实例?
此外,为每个主机设置一个单独的连接池是否有意义?如果没有,我可以使用单个WebClient来实现吗?
答案 0 :(得分:1)
这实际上取决于Spring WebFlux使用的基础HTTP库。现在,Spring支持Reactor Netty(默认)和Jetty客户端。
默认情况下,WebClient
将有一个连接池;基于主机+端口密钥的连接将被重用,并且reactor.netty.resources.ConnectionProvider
将具有弹性,这意味着它将永远不会等待打开新的连接。您可以配置自己的连接并将最大连接数设置为固定值。
据我所知,keepAlive和所有与TCP相关的选项都是使用io.netty.channel.ChannelOption
在TCP级别处理的。我认为您不能在每个主机或每个连接池的基础上进行更改,因为它们属于事件循环资源。
其他客户端(例如Jetty)可能提供不同的选项,但我认为您在这里使用默认选项。
我没有任何明显的理由为每个主机建立一个连接池。我们通常试图实现的是最大程度地利用资源。例如,在Spring Boot中,我们正在自动配置事物,以便服务器和客户端(在同一应用程序中)重用相同的资源。由于其中一些与CPU内核的数量有关,因此重复使用相同的内核可以提高整体效率。
有许多与TCP相关的选项,除非您有一个非常具体的问题要解决,否则我认为应保留默认值,因为有很多想法被考虑在内。