如何使用Netty4ClientHttpRequestFactory为Spring AsyncRestTemplate设置代理?

当我使用SimpleRequestFactory和AsyncRestTemplate时,我可以轻松配置一个HTTP代理服务器。

我可以做(Kotlin示例代码):

@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 ))使用SimpleChannelInboundHandler作为通道,不使用代理处理程序。 一切都是私密的,无法在源代码中被覆盖,所以没有办法改变它来支持代理。 你将不得不重写整个事情。

你有其他的异步客户端选项,将很好地工作,并允许您更多的配置选项。 所包含的Netty无论如何都是相当基本的。 OkHttpClientHttpRequestFactoryHttpComponentsAsyncClientHttpRequestFactory都允许你传入你自己配置的客户端。

为了您的兴趣,AsyncRestTemplate的不同实现:

SimpleClientHttpRequestFactory – >简单线程池,阻止API,代理支持

OkHttpClient(OkHttp3) – >阻止API,代理支持

CloseableHttpAsyncClient – >非阻塞nio api,代理支持

Netty4ClientHttpRequestFactory – >非阻塞nio api,代理不支持

您可以访问https://github.com/wuxudong/VariousAsyncHttpClientPerformance获取更多详细信息