阿里云短信服务使用代理的坑

1. 初始配置

在springboot 启动时候配置了系统参数

其中的http 和 https 分别做好代理了

prop.setProperty("https.proxyHost", "192.168.0.1");
prop.setProperty("https.proxyPort", "8888");

就等价于 -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort = 8888 ,但是这种设置有一个限制,那就是只对 JDK 自带的 HttpURLConnection 有效

2. 阿里配置

阿里的SDK会通过 System.getenv("HTTPS_PROXY") 和 System.getenv("HTTP_PROXY") 来判断系统的环境中是否有如下两个变量。有的话就设置到 HttpClientConfig 中,没有的话则直接 return

2.1 获取默认profile

2.2 取用的是默认的HttpClientConfig

2.3 默认的代理为空

2.4 阿里取出的代理配置

结论:阿里取用的代理并不是我们第一步中设置的代理,所以我们要重新设置! 所以这个取出的默认代理并不是我们之前所设置的

3. 解决办法

解决办法 将HTTPS_PROXY 或者 HTTP_PROXY 设置为系统环境变量(可以生效,但是不推荐) 在 buildClient 方法里面,可以发现只有当 HttpClientConfig 为空的情况下才会创建默认的 config,那么我们可以在 IClientProfile 里面,手动的将 HttpClientConfig 设置进去,从而避免创建默认的HttpClientConfig。 用 JDK 的 HttpURLConnection 发请求,通过 System.setProperty 设置代理。

在获取profile的时候设置如下代码,

设置如下,添加代理

HttpClientConfig config = HttpClientConfig.getDefault();
 config.setHttpProxy("http://10.26.x.x:8888");
 config.setHttpsProxy("http://10.26.x.x:8888");
 profile.setHttpClientConfig(config);

这才是真正的设置阿里调用时的代理地址

经验分享 程序员 微信小程序 职场和发展