緣起:無線時代,網絡穩定性差,應用流量敏感,APP與server之間每次HTTP請求都需要DNS解析,有沒有優化方法呢?
一、PC時代,HTTP請求處理過程

(1)浏覽器、或者PC用戶端通路DNS伺服器,由域名拿到IP(一般來說是個nginx的IP)
(2)浏覽器、或者PC用戶端用IP通路nginx
(3)nginx将請求分發給實際處理HTTP請求的web-server
二、無線APP時代的特點
(1)DNS解析的時間不能忽略
(2)一旦DNS被劫持,整個APP就挂了(還記得N年前baidu的域名被劫持的事情麼?)
三、一種不需要DNS解析的HTTP請求優化方案
(1)第一次通路時,先拉取server的ip-list儲存到本地,通路過程與普通HTTP通路過程相同
(2)未來通路時,用戶端直接使用ip-list中的IP來通路server,不再需要DNS
(3)如果DNS被劫持,直接嘗試使用ip-list中的IP通路
四、潛在的問題
(1)雖然少了一步DNS查詢和一步nginx中轉,那怎麼做負載均衡呢?
答:APP随機通路ip-list中的IP
(2)使用nginx可以友善的增加後端的服務,不使用nginx如何做水準擴充呢?
答:直接在ip-list中增加ip即可
(3)每次通路都要通路ip-list,還是挺廢流量的,還有其他優化方案麼?
答:增加一個版本号,第一次拉取ip-list時,不但把ip-list放到APP本地,并把版本号也拿到。未來不用每次都拿ip-list,而是先拿版本号,如果版本号不變,直接使用本地的ip-list。隻有版本号變化時,才需要重新拉取ip-list
(4)還有其他什麼好處?
答:使用nginx不好做異構伺服器的負載均衡,即難以根據後端服務的處理能力來配置設定負載。使用ip-list,隻要加上一個權重參數,即可實作異構伺服器的負載均,例如:
192.168.1.1, 10
192.168.1.2, 10
192.168.1.3, 20
可以看到,第三個後端服務的處理能力是前兩個的兩倍,APP做負載均衡時考慮上第二個參數即可
五、再次總結這種方案的好處
(1)不需要每次請求做DNS解析,節省時間
(2)不需要每次請求做nginx轉發,節省時間
(3)不需要每次拉取拉取ip-list,節省流量
(4)DNS被劫持時仍可以使用本地ip