Эластичный HTTP-клиент с обновлением разрешения имен и активным мониторингом - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь создать HTTP-клиент на основе java.net.http.HttpClient, и я хотел бы иметь некоторый контроль над IP-адресами, разрешенными под капотом.

Мне нужен такой механизмиспользовать все IP-адреса за хостом запроса. Основная проблема, которую я пытаюсь решить, заключается в том, чтобы как можно скорее отреагировать на недоступность целевого IP. Это можно сделать, выполнив активный мониторинг для каждого IP-адреса и используя только доступные адреса (на уровне TCP, TLS или HTTP) при отправке HTTP-запроса. Я также хотел бы сбалансировать трафик между всеми IP-адресами и активно обнаруживать изменения в разрешении DNS. Я поддерживаю длительное живое соединение с внешней службой HTTPS.

На данный момент только Java-клиент использует только один IP-адрес, и для этого IP-адреса поддерживается пул соединений.

Я создал обходной путь, используя IP-адрес в URL-адресе, предоставленном HTTP-клиенту, и используя специальный диспетчер доверия, соответствующий ожидаемому имени, чтобы сохранить проверку TLS. У этого есть несколько ограничений. В частности, он изменяет HTTP-запрос, который может повлиять на полученный ответ, в зависимости от целевого сервера. Это также заставляет использовать один HTTP-клиент на хосте, на который вы хотите нацелиться. Я создал небольшой GitHub репозиторий , чтобы проиллюстрировать этот обходной путь.

Я немного изучил реализацию HTTP-клиента и до сих пор не нашел способа реализовать такой механизм. В частности, я застрял в jdk.internal.net.http.HttpRequestImpl#getAddress, который является видимым пакетом и предотвращает любое расширение.

Такой механизм существует в HTTP-клиенте Jetty (см. org.eclipse.jetty.util.SocketAddressResolver) или в HTTP-клиенте Apache.

Есть ли какой-нибудь механизм, который я мог бы использовать для правильного решения такой проблемы? Если нет, есть ли способ внести свой вклад или подать запрос на улучшение?

...