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-адрес один раз — при запуске или при первом использовании — а затем кэширует это разрешение на неопределенный срок. В отличие от разрешения целевого хоста (на которое могут влиять TTL и стандартные настройки кэширования DNS), разрешение хоста прокси-сервера не подлежит одному и тому же жизненному циклу обновления.
Это становится серьезной проблемой надежности в следующем сценарии:
  • Имя хоста прокси (

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

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

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

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