Ограничить количество соединений TCP для HTTP-клиента Apache (пула) в Spring Resttemplate - PullRequest
0 голосов
/ 11 марта 2019

У нас есть проект интеграции, использующий 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 экземпляров.

Как запретить приложению:

  1. закрыть TCP послезавершение обмена HTTP-сообщениями?
  2. ограничить число открытых TCP до 5?Попытка открыть 6-й, когда любой из 5 находится в процессе закрытия (окончательный ACK не был отправлен или получен)
  3. netstat говорит, что мои соединения находятся в состоянии CLOSE_WAIT.Что это на самом деле означает в этом случае?
...