实际上,Spring
Boot不会泄漏连接。您在这里看到的是Linux内核(以及每个主要OS)的标准行为。从机器上关闭的所有插座都会在
TIME_WAIT一段时间内进入状态。这是为了防止使用该临时端口的下一个套接字接收实际上打算用于该端口上一个套接字的数据包。您看到的两者之间的差异是每个人采用的连接池方法的结果。
更具体地说,默认情况下
RestTemplate不
使用连接池。这意味着每个rest调用都会打开一个新的本地临时端口和一个到服务器的新连接。如果您的服务速度非常快,它将立即在可用的本地端口范围内爆炸。使用Apache
HttpClient,您可以利用连接池。这将防止您的应用程序看到您描述的问题。但是,鉴于您的服务能够比Linux内核从中取出套接字更快地做出响应
TIME_WAIT,因此无论您做什么,连接池都会使您的客户端变慢(如果它没有使任何事情变慢,那么您就用光了本地临时端口)。
尽管可以在Linux内核中启用TCP重用,但这样做可能会很危险(数据包可能会延迟,并且临时端口可能会收到他们不了解的随机数据包,这可能会导致各种问题)。这里的解决方案是使用连接池,就像在第二个示例中一样,使用足够大的数量来达到接近您想要的性能。
为了帮助您调整连接池,您需要调整
maxConnPerRoute和
maxConnTotal参数。
maxConnPerRoute限制将对单个IP:Port对
maxTotal建立的连接数,并限制将永远打开的总连接数。在您的情况下,由于似乎所有请求都发送到同一位置,因此可以将它们设置为相同(较高)值。



