無線時代,網(wǎng)絡(luò)穩(wěn)定性差,應(yīng)用流量敏感,App與Server之間每次HTTP請求都需要進行DNS解析,有沒有可能直接使用IP來提速呢?
典型HTTP請求處理過程如何?

第一步,客戶端訪問DNS服務(wù)器,由域名拿到Nginx的外網(wǎng)IP;
第二步,客戶端使用外網(wǎng)IP訪問Nginx;
第三步,Nginx將請求分發(fā)給實際處理HTTP請求的Web-server;
移動時代APP的訪問特點如何?
(1)網(wǎng)絡(luò)慢,DNS解析的時間不能忽略;
(2)一旦DNS被劫持,整個APP就掛了;
APP能夠把Web-server的ip-list內(nèi)置,從而跳過DNS解析,跳過Nginx中轉(zhuǎn),直接通過IP訪問后端的Web-server么?
不行,Web-server的擴展性較差,增加IP時APP沒辦法得到通知。
畫外音:Nginx可以保證Web-server的高可用,去掉Nginx后,需要APP重試,或者Web-server做高可用。
如何進行優(yōu)化呢?

不要將ip-list內(nèi)置在APP里,而是通過HTPP請求來拉取:
(1)APP第一次訪問時,先拉取Web-server的ip-list保存到APP本地;
畫外音:使用域名拉取ip-list,只1次訪問。
(2)未來訪問時,客戶端直接使用ip-list中的IP來訪問server,不再需要DNS;
畫外音:使用IP訪問業(yè)務(wù)Web-server,所有業(yè)務(wù)請求。
跳過了Nginx,如何對Web-server怎么做負載均衡呢?
APP隨機訪問ip-list中的IP。
跳過了Nginx,如何對Web-server做水平擴展呢?
直接在ip-list中增加IP即可。
新的問題又來了,在ip-list里增加了IP,新的用戶能訪問到新的IP,舊的APP已經(jīng)將ip-list拉取到APP本地了,此時如何更新本地的ip-list呢?
版本號,是架構(gòu)設(shè)計中,減少拉取流量的同時,又能保證數(shù)據(jù)隨時更新的好辦法:
(1)ip-list增加一個版本號,每次拉取ip-list時,同時拿到版本號;
(2)如果版本號與本地ip-list版本號一致,則直接使用本地ip-list;
畫外音:節(jié)省流量,不用每次拉取文件。
(3)版本號變化時,重新拉取ip-list保存到本地;
畫外音:保證數(shù)據(jù)能夠得到更新。
總結(jié)
無線時代,可使用“IP直通車”來加速APP訪問:
- 不需要每次請求做DNS解析,節(jié)省時間,避免DNS劫持
- 不需要每次請求做Nginx轉(zhuǎn)發(fā),節(jié)省時間
- 不需要每次拉取ip-list,節(jié)省流量
- 通過ip-list可以對Web-server做水平擴展
- 通過版本號可以保證ip-list的數(shù)據(jù)一致性