1. 需求與問題
在互聯(lián)網(wǎng)企業(yè)中絕大多數(shù)都是使用域名來給用戶提供服務,但是在有中國特色的互聯(lián)網(wǎng)環(huán)境中遭遇到各種域名被緩存、用戶跨網(wǎng)訪問緩慢等問題的情況或多或少的無法避免。
所以如何提高域名解析成功率成為關注的重點。
2. Android端解決方案
目前在實踐Android端的解決方案為:
- 初次從服務端拉取域名對應的IP列表,并緩存到本地,知道下次啟動應用時再次拉取;
- 優(yōu)先使用IP進行接口訪問,在請求失敗之后重走默認的域名訪問;
- 解決Https請求是證書的檢驗。
3. 具體實現(xiàn)
- 假如服務端返回數(shù)據(jù)中包含如下ip字段,客戶端解析之后將域名對應的ip保存
{
"www.baidu.com":[
"192.168.212.195",
"192.168.212.196"
],
"www.json.cn":[
"192.168.212.197",
"192.168.212.198"
]
}
- 需要在請求頭中為設置host為對應的域名,需要考慮到多域名、多ip的情況
//這里使用的是okhttp3,以map形式向請求頭中設置參數(shù),不同的框架按照自己的形式設置
headsMap.put("Host", "你的域名");
-
對于使用Https方式的需要設置對證書的不校驗,可以參考 :
OkHttp使用https,忽略證書驗證
但是對于域名這個部分我們需要增加一個校驗,來判斷HTTPDNS返回的源站IP與Session攜帶的IP信息是否一致。
/*
* 關于這個接口的說明,官方有文檔描述:
* This is an extended verification option that implementers can provide.
* It is to be used during a handshake if the URL's hostname does not match the
* peer's identification hostname.
*
* 使用HTTPDNS后URL里設置的hostname不是遠程的主機名(如:m.taobao.com),與證書頒發(fā)的域不匹配,
* Android HttpsURLConnection提供了回調(diào)接口讓用戶來處理這種定制化場景。
* 在確認HTTPDNS返回的源站IP與Session攜帶的IP信息一致后,您可以在回調(diào)方法中將待驗證域名替換為原來的真實域名進行驗證。
*
*/
HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return HttpsURLConnection.getDefaultHostnameVerifier().verify("你使用的域名", session);
}
};
- 對于什么情況下使用域名、什么情況下使用ip,還是需要依據(jù)項目本身的需求來配置的,我這邊在項目中增加了一個配置,來控制整個項目是否使用域名或ip
4. 價值參考
切換ip進行請求,必須要服務端支持,否則也是白忙活。
動手前可以參考如下文章或開源項目:
1. HTTPS(含SNI)業(yè)務場景“IP直連”方案說明