Netty/WebClient: как предотвратить неопределенное кэширование разрешения DNS прямого прокси-сервера в приложении Spring JAVA

Программисты JAVA общаются здесь
Anonymous
Netty/WebClient: как предотвратить неопределенное кэширование разрешения DNS прямого прокси-сервера в приложении Spring

Сообщение Anonymous »

Справочная информация
В приложении Spring Boot, использующем WebClient (с Reactor-netty Netty), я настраиваю прямой прокси-сервер HTTP/HTTPS через свойства системы JVM:

Код: Выделить всё

   -Dhttp.proxyHost=my-proxy.internal
-Dhttp.proxyPort=8080
-Dhttps.proxyHost=my-proxy.internal
-Dhttps.proxyPort=8080
Проблема
Netty преобразует имя хоста прокси-сервера в IP-адрес при запуске (или, возможно, при первом использовании), а затем кэширует это разрешение DNS на неопределенный срок. Разрешение DNS прокси-хоста по умолчанию не подвержено какому-либо жизненному циклу.
Это противоречит следующему сценарию:
  • Имя прокси-хоста (например, my-proxy.internal) указывает на балансировщик нагрузки на основе DNS, который взаимодействует с пулом высокой доступности узлов прямого прокси.
  • Балансировщик нагрузки my-proxy.internal периодически меняет IP-адреса — удаляя узлы, которые находятся в автономном режиме или на обслуживании.
  • Поскольку Netty закрепила исходный разрешенный IP-адрес, она продолжает маршрутизировать трафик на устаревший IP-адрес прокси.
  • Сбой не является чистой ошибкой TCP/HTTP — он проявляется в виде тайм-аута HTTP-ответа на прокси-запросы, возможно, создавая другой базовый механизм в Netty (или Webclient) от обнаружения проблемы происходит на уровне прокси.
То, что я пробовал/обдумывал
  • Настройка networkaddress.cache.ttl и networkaddress.cache.negative.ttl в java.security — не имеет значения.
  • Перезапуск приложения — это то, для чего сейчас используется смягчение, а не решение проблемы.
  • Исследовал, есть ли у ProxyProvider в реакторе-netty крючок TTL или повторного разрешения — не удалось его найти.
Что я ищу
  • Есть ли способ настроить Netty или ProxyProvider реактора-нетти для повторного разрешения прокси имя хоста по TTL на основе времени, при каждом новом соединении или при сбое соединения?
  • Существует ли в Spring Webclient перехват жизненного цикла или стратегия ConnectionProvider, которая позволяла бы приложению аннулировать разрешенный адрес прокси при определенных условиях (например, тайм-аут соединения, вытеснение пула)?
  • Если ни один из них не поддерживается изначально, существует ли рекомендуемый шаблон для создания веб-клиента bean-компонент, который обходит это ограничение — например, периодически перестраивая HttpClient или используя собственную AddressResolverGroup?
Среда
  • Spring Boot 3.x
  • Код: Выделить всё

    reactor-netty
    1.x
  • Java 17+
  • Прокси-сервер перенаправления, управляемый балансировщиком нагрузки DNS (на основе циклического перебора/проверки работоспособности)

Вернуться в «JAVA»