如何使用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无论如何都是相当基本的。 OkHttpClientHttpRequestFactory
和HttpComponentsAsyncClientHttpRequestFactory
都允许你传入你自己配置的客户端。
为了您的兴趣,AsyncRestTemplate的不同实现:
SimpleClientHttpRequestFactory – >简单线程池,阻止API,代理支持
OkHttpClient(OkHttp3) – >阻止API,代理支持
CloseableHttpAsyncClient – >非阻塞nio api,代理支持
Netty4ClientHttpRequestFactory – >非阻塞nio api,代理不支持
您可以访问https://github.com/wuxudong/VariousAsyncHttpClientPerformance获取更多详细信息