阿里雲簡訊服務使用代理的坑

litGrey發表於2020-10-23

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);

這才是真正的設定阿里呼叫時的代理地址

 

相關文章