Web請求過程
<a href="http://s1.51cto.com/wyfs02/M00/89/81/wKioL1gV7qXBwVPRAAB9ZZ9KIH8858.png" target="_blank"></a>
1. B/S架構的優點
第一,用戶端統一
使用者面對的用戶端---浏覽器是統一的,互動是友好的,并且學習成本低,隻要學會一個網頁應用的操作,那麼其他網頁的應用很容易操作和學習,就是使用者的能力是可繼承的。若基于C/S架構,那麼是不統一的。
第二,服務端統一
B/S互動的橋梁的協定就是統一為HTTP。不會像C/S架構那樣,協定基于應用業務,不會統一。既然是都基于HTTP,那麼會有很多現成的HTTP伺服器以及架構,我們可以直接拿來使用,隻需要專注于業務實作上,友善了開發。
2. 域名到IP轉化
要知道域名到IP的轉化,是會緩存的,那麼既然是緩存,需要知道是有空間和時間的限制的。這裡主要是TTL的限制。本地的域名解析主要在hosts檔案中展現,如果本地無法确定,那麼發送到DNS Server進行解析(一般是網絡配置中指定了nameserver的位址),如果本區域DNS伺服器還無法确定,那麼會通過Root DNS來處理。
3.HTTP協定的要點
無狀态
所謂無狀态,指的是本次HTTP請求和上次HTTP請求沒有關系,在服務端是沒法記錄2次請求的事務性的。但是現實生活中,我們需要一種順序性,比如先加入購物車,然後下單,然後支付等。為了記錄這種狀态,是以才有Cookie和Session的存在。
短連接配接
HTTP1.0預設是短連接配接,HTTP1.1預設是長連接配接。
所謂短連接配接,是指一次HTTP請求後,就用戶端就斷開與服務端的連接配接。而長連接配接是指多次HTTP請求後才斷開連接配接,HTTP請求頭中需要标記Connection:Keep-alive,當然也不會永久保持連接配接,會有一個時間限制。表面上看,長連接配接省去了頻繁建立連接配接,關閉連接配接的步驟,似乎比短連接配接好。但是,其實在很多場景下,短連接配接是有優勢的。比如,在海量的使用者請求下,為每個使用者都保持一個連接配接,這個資源是滿足不了的,這種背景下,很多時候就是采用短連接配接,才能同時滿足海量使用者的請求。
HTTP Header
HTTP協定中最為關鍵的資料就是HTTP Header了,為什麼呢?因為HTTP Header控制着浏覽器Client的渲染行為以及服務端Server的執行邏輯。
編碼相關:
請求頭(Accept-Charset/Accept-Encoding/Accept-Language)
響應頭(Content-Type/Content-Encoding/Content-Language)
連接配接相關:
請求頭(Connection)
響應頭(Keep-Alive)
用戶端資訊相關:
請求頭(Host/User-Agent)
緩存相關:
關于HTTP的緩存,需要明确幾個緩存層次:浏覽器緩存、服務端緩存
要想看到最新的資料,首先得不使用浏覽器緩存,直接向服務端送出請求,其次,服務端接收到請求後,不使用服務端緩存資料。[有些服務端可能使用了HTTP緩存代理伺服器的]
我們使用ctrl+F5為什麼能夠不使用浏覽器緩存,而是直接向伺服器發出了請求最新資料呢?其實本質上,就是在HTTP HEADER中做了些手腳。
Pragma:no-cache
Cache-Control:no-cache
如果我們并沒有在HTTP HEADER中指明不緩存,那麼浏覽器何時不使用浏覽器緩存呢?
Expires:頁面過期時間,超過時間,頁面失效,浏覽器會向伺服器送出請求。
Last-Modified:最後修改時間,如果client和server端的這2個值一緻,那麼顯然用戶端沒有必要請求伺服器最新資源了。
HTTP Status Code
2XX,成功,如200
3XX,比如302重定向臨時跳轉,304用戶端資源是最新的無需服務端傳回資源(Last-Modified)
4XX,用戶端錯誤,比如404資源不存在,403資源禁止通路
5XX,服務端錯誤,比如500
4.從Java的角度來看HTTP協定的本質
比如,使用者在浏覽器中輸入一段URL後回車,實際上是建立了一個Socket連接配接,IP是域名轉化後的結果,端口是預設的80,然後浏覽器根據URL組裝一個HTTP GET請求通過outputStream.write發送出去,然後服務端通過inputStream.read讀到資料後通過輸出流寫回HTTP GET響應到用戶端即可。
總結起來,一句話,一次HTTP請求,就是一次SOCKET通信的過程。
5.curl指令
我們既可以簡單通過浏覽器發出HTTP請求,也可以使用HttpClient這樣的開源工具包發出HTTP請求,還可以通過Linux自帶的指令:curl
比如,有這樣的一個場景:
我們需要和消息隊列MQ通信,通信協定采用HTTP,但是采用了L5負載均衡機制,我們不可以直接通路MQ,需要通過代理來轉發,那麼我們可以通過curl快速測試鍊路:
curl -H "Host: zzz" http://xxx:yy/
xxx:yy是L5下發給我們的IP和端口,而zzz是真正我們需要通路MQ的域名位址。
說明:
-H HTTP協定指定Header頭
-I 檢視HTTP Header頭資訊
6.CDN工作簡介
CDN,即内容分發網絡,在Internet中将網站的内容分發到最接近使用者的地方,讓使用者就近取得所需,提高了使用者通路網站的速度。一般使用者拿到動态資料後,會從CDN上拿取靜态資源,進而加速了網頁資料的下載下傳速度。
7.負載均衡
DNS級别的負載均衡
可以通過DNS解析域名動态得到不同IP,進而實作負載分攤,但是壞處在于使用者是直接同後端服務IP建立了聯系,一旦背景Web Server挂掉,那麼用戶端以及DNS來不及更新的話,後果很嚴重。
硬體級别的負載均衡
通過很昂貴的硬體來實作,一般無法承受價格,而且也有限制。
軟體級别的負載均衡
實際上是通過多層代理轉發來實作的。實際中多采用這種方式來實作。
本文轉自zfz_linux_boy 51CTO部落格,原文連結:http://blog.51cto.com/zhangfengzhe/1870067,如需轉載請自行聯系原作者