Как установить прокси для Spring AsyncRestTemplate с помощью Netty4ClientHttpRequestFactory?

Когда я использую SimpleRequestFactory с моей AsyncRestTemplate, я могу легко настроить HTTP-прокси-сервер.

Я могу либо сделать (пример кода в Котлине):

@Bean open fun asyncRestTemplate(): AsyncRestTemplate { val proxy = Proxy(Proxy.Type.HTTP, InetSocketAddress("127.0.0.1", 8008)) val requestFactory = SimpleClientHttpRequestFactory().apply { this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) this.setProxy(proxy) this.setTaskExecutor(taskExecutor()) } return AsyncRestTemplate(requestFactory) } 

Или я могу просто установить соответствующие системные свойства: -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8008 .

Однако в тот момент, когда я переключаюсь с SimpleClientHttpRequestFactory на Netty4ClientHttpRequestFactory нет очевидного способа напрямую настроить прокси-сервер, и кажется, что этот клиент также не соблюдает системные свойства.

 val requestFactory = Netty4ClientHttpRequestFactory().apply { this.setConnectTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) this.setReadTimeout(TimeUnit.SECONDS.toMillis(10).toInt()) //this.setProxy(proxy) //??? } 

Как только я изменюсь для netty-клиента, я не знаю, как это сделать через прокси-сервер.

Моя заинтересованность в использовании netty-клиента заключалась в том, что я не только хотел выполнить асинхронные запросы, но и хотел, чтобы это было неблокирующим. Надеюсь, я не ошибаюсь.

Кто-нибудь знает, как я могу использовать прокси-сервер при использовании Netty4ClientHttpRequestFactory или, возможно, знать об альтернативном неблокирующем клиенте, поддерживаемом Spring, который я мог бы использовать?

Netty4ClientHttpRequestFactory ( источник ) и связанные с ним классы, такие как Netty4ClientHttpRequest ( source ), используют SimpleChannelInboundHandler для канала и не используют обработчик прокси. Все закрыто и не может быть переопределено внутри источника, поэтому нет способа изменить его для поддержки Proxies. Вам придется почти переписать все это.

У вас есть другие параметры асинхронного клиента, которые будут работать очень хорошо и позволят вам больше параметров конфигурации. Входящий в комплект Netty один довольно простой. OkHttpClientHttpRequestFactory и HttpComponentsAsyncClientHttpRequestFactory позволяют вам передать свой собственный настроенный клиент.

Для вашего интереса, различная реализация AsyncRestTemplate:

SimpleClientHttpRequestFactory -> простой пул потоков, блокирующий api, поддерживаемый прокси

OkHttpClient (OkHttp3) -> блокировка api, поддержка прокси

CloseableHttpAsyncClient -> неблокирующий nio api, поддерживаемый прокси

Netty4ClientHttpRequestFactory -> неблокирующий nio api, прокси не поддерживается

вы можете посетить https://github.com/wuxudong/VariousAsyncHttpClientPerformance для получения дополнительной информации