У нас есть проект интеграции, использующий Spring Boot + Resttemplate + Apache HTTP CLient, где нам нужно отправлять сообщения HTTP GET и POST.В конце разработки поставщик услуг, к которому мы подключаемся, установил ограничение на максимальное число открытых сокетов TCP * 5 .Я не могу перейти к программированию сокетов (так как система все еще полагается на HTTP), и мы не можем «заставить» поставщика услуг не ограничивать количество соединений TCP.
У меня есть эта конфигурация Resttemplate + HTTP Clientв моем приложении Spring Boot (только соответствующая часть):
HTTP-клиент:
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(https)
.setConnectionReuseStrategy(new DefaultConnectionReuseStrategy())
.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) {
return Integer.MAX_VALUE;
}
})
.setConnectionManager(httpClientConnectionManager)
.setDefaultSocketConfig(SocketConfig.custom()
.setSoKeepAlive(true)
.setTcpNoDelay(true)
.build())
.build();
Пул HTTP-клиента:
PoolingHttpClientConnectionManager manager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); // socketFactoryRegistry = SSL socket factory for reading the JKS with certs
manager.setDefaultMaxPerRoute(5);
manager.setMaxTotal(5);
manager.setValidateAfterInactivity(60000);
manager.setDefaultSocketConfig(SocketConfig.custom()
.setSoKeepAlive(true)
.setTcpNoDelay(true)
.build());
Но, используя приведенный выше код / конфигурацию и выполняя дамп Wireshark, мы видим, что у нас есть 5 CONNECTION_ESTABLISHED (информация / терминология netstat), и программа по-прежнему пытается открыть 6-йодин.Это многопоточное приложение, в котором потоки отправляют HTTP-сообщения через @ Autowired Resttemplate экземпляров.
Как запретить приложению:
- закрыть TCP послезавершение обмена HTTP-сообщениями?
- ограничить число открытых TCP до 5?Попытка открыть 6-й, когда любой из 5 находится в процессе закрытия (окончательный ACK не был отправлен или получен)
- netstat говорит, что мои соединения находятся в состоянии CLOSE_WAIT.Что это на самом деле означает в этом случае?