Прокси в Java HttpClient
Начиная с Java 11, класс java.net.http.HttpClient заменяет устаревший HttpURLConnection для большинства HTTP/2 задач. Прокси NEONPROXY в формате host:port:login:password подключается через ProxySelector и Authenticator. Ниже — минимальные примеры для HTTPS-прокси; для SOCKS5 потребуется JVM с поддержкой или библиотека типа jsocks.
HTTPS-прокси: базовый пример
Ответ JSON должен содержать IP прокси. Сверьте с /tools/myip/.
Системные свойства JVM
С Java 8u111 по умолчанию отключена Basic auth для туннеля — последние два флага её включают. Для production лучше явный HttpClient в коде, а не глобальные system properties.
Асинхронные запросы и пул
Для ротации нескольких прокси NEONPROXY реализуйте custom ProxySelector, возвращающий следующий InetSocketAddress из списка — паттерн как в ротации прокси.
Отладка и SSL
IOException: HTTP/1.1 header parser received status line: HTTP/1.1 407 — неверные credentials. Проверьте прокси в чекере до запуска JVM. Для legacy-кода на Apache HttpClient 4.x синтаксис другой — но принцип тот же: HostConfiguration + CredentialsProvider.
Go- и Node-аналоги — в статьях Go net/http и Node.js Axios.
HttpClient и HTTP/2
HttpClient по умолчанию пробует HTTP/2 — некоторые legacy-прокси ведут себя иначе на h2. При странных ошибках принудите HTTP/1.1:
Spring Boot и RestTemplate
В Spring 6+ рекомендуется WebClient на Reactor Netty. Прокси задаётся через HttpClient.create().proxy(...) в connector. Для RestTemplate используйте SimpleClientHttpRequestFactory с setProxy — но лучше мигрировать на HttpClient API.
Таймауты и connection pool
HttpClient переиспользует соединения — при ротации прокси создавайте отдельный client на каждый ProxySelector или вызывайте client.close() (Java 21+) между сменами. Задайте connectTimeout и ограничьте Executor, чтобы не исчерпать threads при медленном прокси.
Тестируйте интеграцию в CI с реальным NEONPROXY из secrets — mock не поймает 407 и DNS-утечки. Проверка IP: тот же запрос к api.ipify.org и сверка с чекером.
OkHttp как альтернатива
На Android и в legacy-проектах часто встречается OkHttp — прокси задаётся через Proxy и Authenticator аналогично HttpClient. Для единообразия вынесите парсинг host:port:login:password в общий модуль конфигурации.
HttpClient из java.net.http предпочтительнее для новых сервисов на Java 17+ — меньше зависимостей и нативная HTTP/2.
В Kubernetes sidecar-контейнер с tinyproxy может централизовать auth NEONPROXY для всех pod'ов — Java-приложение тогда ходит на localhost:3128 без пароля. Для serverless (Lambda) системные properties JVM не всегда доступны — задавайте HttpClient в static initializer из env SECRET.
Итог: HttpClient.newBuilder().proxy().authenticator() — каноничный способ для Java 11+. Парсите host:port:login:password из конфига и проверяйте egress IP перед деплоем.
Для Kotlin coroutines используйте тот же HttpClient в suspend-обёртках; не создавайте новый client на каждый запрос — переиспользуйте singleton с настроенным ProxySelector и пулом NEONPROXY.
Добавьте integration-тест, который читает NEONPROXY_URL из env, парсит четыре поля host:port:login:password и assert'ит, что api.ipify.org возвращает не localhost — тест ловит misconfiguration до релиза.
Документируйте в README сервиса переменные HTTP_PROXY и формат строки NEONPROXY — onboarding новых разработчиков займёт минуты вместо часов отладки 407.
Сверяйте egress IP после каждого деплоя через /tools/myip/ — misconfigured proxy в production часто остаётся незамеченным до первого инцидента с whitelist.
Прокси для Java-сервисов
Стабильные IPv4 для микросервисов — host:port:login:password, HTTPS и SOCKS5.
Перейти к заказу