背景
公司项目中,需要跨机房通过HTTP协议传输数据,SRE部门在远端通过域名暴露了一个influxdb服务,客户端在异地机房通过该域名写入时序数据。
现象
测试连通性时,使用curl进行如下测试,结果正常,说明网络访问没问题。
curl -i "http://<host_name>/ping"
但使用HttpClient/OkHttpClient进行数据发送时,一直出现connect timeout错误,无论如何调整timeout的大小,都无法成功发送请求。
挖掘
首先在本地尝试连接本地influxdb
可以发现,连接local influxdb没有connnection established的过程。
再次使用curl -v查看连接详情,可以发现经过了http_proxy。
查看/etc/environment,可以发现配置了全局http/https proxy,在curl调用时自动使用了全局proxy,但HttpClient不会加载默认的http proxy,因此使用HttpClient一直连接超时。
解决方案
找到原因之后,就很容易解决问题了,在初始化HttpClient时配置proxy即可。
以下两种方法都可以达到配置proxy的效果
- 配置在RequestConfig中
HttpHost httpProxy = new HttpHost(configUtils.getProxyHost(), configUtils.getProxyPort(), "http");
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(configUtils.getConnectTimeout())
.setConnectTimeout(configUtils.getConnectTimeout())
.setSocketTimeout(configUtils.getSocketTimeout())
.setProxy(configUtils.isUseProxy() ? httpProxy : null)
.build();
closeableHttpClient = HttpClients.custom()
.setRetryHandler(retry)
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(poolingHttpClientConnectionManager)
.build();
- 配置在HttpClient中
HttpHost httpProxy = new HttpHost(configUtils.getProxyHost(), configUtils.getProxyPort(), "http");
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(configUtils.getConnectTimeout())
.setConnectTimeout(configUtils.getConnectTimeout())
.setSocketTimeout(configUtils.getSocketTimeout())
.build();
closeableHttpClient = HttpClients.custom()
.setRetryHandler(retry)
.setDefaultRequestConfig(requestConfig)
.setProxy(httpProxy)
.setConnectionManager(poolingHttpClientConnectionManager)
.build();
重新发布之后,解决问题。