繁体   English   中英

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

[英]How to set proxy for Spring AsyncRestTemplate using Netty4ClientHttpRequestFactory?

当我将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了解更多详细信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM