HTTPDNS 提供了通過 HTTP API 實現網域名稱解析的能力。針對無法直接整合官方 SDK 的情境,開發人員可以自訂接入方式。本指南圍繞可用性、效能、解析品質和安全性等關鍵方面,提供專業化建議,協助開發人員最佳化 HTTP API 的使用效果。
1. 可用性最佳化
情境:HTTPDNS 部分服務節點不可用
背景
在某些極端情況下,如自然災害、電訊廠商封鎖或網路故障,HTTPDNS單個服務入口可能出現停用風險,導致對網域名稱解析產生影響。
解決方案
啟動 IP 冗餘機制
應用內嵌入多個啟動 IP 或網域名稱,確保始終與HTTPDNS服務保持連通性。
請求失敗時,自動切換使用下一個啟動 IP。
服務 IP 動態更新
通過向啟動 IP 發起請求來擷取服務 IP,更新服務IP的流程如下圖所示:
有關調度介面的詳細資料,請參閱調度服務介面。
建議在下列描述的情境中更新並儲存服務IP列表:
建議在App冷啟動時進行更新。
建議在切換網路環境時進行更新。
建議每8小時至少更新一次。
當服務IP列表經過重試發現都無法解析時,立即更新。
容錯移轉策略
使用解析服務時,採用IP輪轉機制,某個IP訪問不通時輪轉到下一個進行重試,避免某個服務IP無法使用時受到影響。在向服務端發起解析請求時,會從全域服務IP列表中擷取一個可用的服務IP,只要當前IP可以解析,那麼整個SDK生命週期都會使用這個IP解析,如果當前服務IP解析失敗,則會切換全域服務IP列表中的下個IP重試一次。如果仍然失敗則返回空,並且再次切換服務IP。
遊標是全域的,並且建議將遊標持久化儲存在本地。
服務IP列表只有出現解析失敗的情況才會動態更新,通常是保持全域不變的。
服務IP列表最好是動態可配置,這樣可以減少覆蓋生效的時間,縮小影響。
若所有 HTTPDNS 服務 IP 均請求失敗,降級使用 Local DNS(即作業系統原生DNS鏈路)。如果是Android端使用了 OkHttp 網路程式庫進行接入,降級使用 Local DNS 解析的方法如下:
List<InetAddress> result = okhttp3.Dns.SYSTEM.lookup(host);val result: List<InetAddress> = Dns.SYSTEM.lookup(host)如果是iOS端,只要不進行Host替換或者請求攔截即可,保持原有請求如下:
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 發送請求
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"error: %@", error);
} else {
NSLog(@"response: %@", response);
}
}];
[task resume];var request = URLRequest(url: url)
// 發送請求
let session = URLSession.shared
let task = session.dataTask(with: request) { (data, response, error) in
if let error = error {
print("error: \(error)")
} else {
print("response: \(response?.description ?? "")")
}
}
task.resume()避免阻塞解析
訪問HTTPDNS服務時請做非同步化處理,避免業務主流程同步等待網路解析過程。
2. 效能最佳化
情境:頻繁查詢導致效能瓶頸
背景
如果每次網路請求需要網域名稱解析時,都向 HTTPDNS 服務發起請求,會顯著增加業務耗時和頻寬消耗。考慮到網域名稱解析結果是有 TTL 緩衝時間的,您可以基於這個值進行緩衝。
解決方案
本機快取
根據DNS標準RFC104,可以按照TTL時間對解析結果進行緩衝。
TTL的值為HTTP API響應報文中的ttl欄位。
當緩衝未命中或者已經到期時,則需要發起解析請求,並更新緩衝。
預解析
在緩衝即將到期時(如 TTL 的 80%)提前解析相關網域名稱並緩衝到本地。在應用啟動時,預解析常用網域名稱並緩衝結果。預解析能降低業務訪問的延遲,但會增加一定的解析請求,建議只對熱點網域名稱使用該功能。
串連複用
開啟HTTP用戶端的串連複用特性可以降低TCP串連建立的耗時,進而降低HTTPDNS的解析延遲。
持久化緩衝
可以把上一次解析到的結果進行持久化緩衝,在 App 重啟後,可以優先從持久層載入解析結果,這樣可以提升首次載入速度。
存在第一次使用的IP為到期IP(TTL到期,大多數情況下該IP依然可以正常使用)的可能性。
持久化緩衝會影響“初次開機/網路切換”後網域名稱解析結果,後續解析仍會請求HTTPDNS伺服器,並更新本機快取。
3. 解析品質最佳化
情境:跨電訊廠商解析導致訪問延遲
背景
在使用CDN網域名稱,或網域名稱配置了智能線路解析等情境,如果用戶端根據 TTL 緩衝了網域名稱解析結果IP ,當網路環境發生變化(如4G切換到WIFI,或者WIFI切換到4G),新的網路環境和緩衝的 IP 線路不匹配時,則可能導致業務網路請求效能問題。
解決方案
網路環境監聽
監測用戶端網路變化(如從 Wi-Fi 切換到移動資料)。
主動重新整理本機快取,確保解析結果適配當前網路環境。
重新整理所有網域名稱的解析結果會產生一定流量消耗。
測速排序:
使用 ICMP 或 TCP 非同步測試對解析結果排序,優先選擇響應最快的 IP。
此方法會影響原有商務服務器的負載平衡策略。
4. 安全性最佳化
情境:解析請求被劫持或泄露
背景
未使用鑒權機制的解析介面存在安全隱患,可能被第三方盜刷流量產生費用。
解決方案
鑒權解析
解析介面建議使用鑒權解析,您可以在控制台設定開啟/關閉非鑒權解析請求。
需要使用鑒權解析的secretKey進行鑒權產生加密串,然後將產生的加密串攜帶在請求中,而secretKey無需在請求中攜帶,所以secretKey不會暴露,安全層級較高,確保解析請求中不暴露敏感資訊。
實現方式參考:實現鑒權訪問。
HTTPS 安全通訊
如果使用HTTPS協議,需要自訂認證校正,統一校準為 203.107.1.1 或者resolvers-cn.httpdns.aliyuncs.com。
Android 端實現方式參考:Android端HTTPDNS+HttpURLConnection最佳實務。
iOS 端實現方式參考:iOS SDK接入。
5. 問題排查建議
為了更高效地定位問題,您可以在 App 啟動時,產生一個用於標識單個App生命週期的會話ID,在向HTTPDNS 發起請求時,附帶該會話ID,則發生問題後,HTTPDNS 支援人員可以根據您提供的會話ID進行問題排查。會話ID格式定義為:[a-zA-Z0-9]{12} 。
例如:http://203.107.xxx.xxx/{accountId}/sign_d?host=www.aliyun.com&t=1573XXXX&s=60c7XXXXXX&sid=1234567890ab
6. 總結
通過遵循上述最佳化方案,開發人員可以通過 API 在複雜網路環境中實現高可用、低延遲和安全的 HTTPDNS 接入,同時有效解決潛在問題,提升整體解析品質。