curl和HttpClient对于系统代理的处理差异

背景

公司项目中,需要跨机房通过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();

重新发布之后,解决问题。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值