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

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

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