如何使用 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 (source) and related classes such as Netty4ClientHttpRequest (source) use SimpleChannelInboundHandler 为通道,不使用代理处理程序。一切都是私有的,无法在源代码中被覆盖,因此无法更改它以支持代理。你几乎不得不重写整个事情。

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

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

SimpleClientHttpRequestFactory -> 简单线程池,阻塞api,支持代理

OkHttpClient (OkHttp3) -> 阻止 api,支持代理

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

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

您可以访问https://github.com/wuxudong/VariousAsyncHttpClientPerformance了解更多详情