B/S架構
最常見的架構方式。
優點:
1.客戶端使用統一(此處的統一主要指實現原理統一)的瀏覽器,不需要特殊的網路配置。
2.服務端基於統一的HTTP協議。基於此協議的伺服器有很多,如Tomcat,Nginx,JBoss。這些伺服器可以直接拿來用。
請求發生的完整過程
HTTP最大的特點就是無狀態的短連線的通訊方式,通常情況下一次請求就完成了一次資料互動,通常也對應一次業務邏輯。然後這次通訊就斷開了。
採用這種方式是為了能夠同時服務更多的使用者,防止由於一個使用者獨佔連線而造成阻塞的現象。
下面主要介紹使用者在瀏覽器輸入網址之後發生的整個完整過程。
1.使用者輸入URL,也就是網址。如www.google.com。
2.DNS域名伺服器會將其轉換成IP地址。
3.使用者端根據IP地址向伺服器發起請求。
4.伺服器端可能會有負載均衡裝置來平均分配所有的使用者請求。在請求到達伺服器後,會經過一些複雜的業務邏輯來處理使用者請求。請求的資料可能在三個地方:
分散式快取系統,檔案系統或者資料庫中。從其中取出資料返回給瀏覽器。
5.資料返回後,瀏覽器解析資料發現還有一些靜態的資源(CSS,JS或者圖片),然後再次發起請求。這些靜態資源很有可能是在CDN上,如果在的話CDN伺服器會再次處理使用者的請求。
6.最終在瀏覽器端看到完整的網頁。
以上就是大致的請求資料的過程。
不管架構如何變化,有三個原則是始終不變的:
1)網際網路上的所有資源都要用一個URL表示。
2)必須基於HTTP與服務端互動。
3)資料展示必須在瀏覽器中進行。
如何發起請求
發起請求實質上就是建立一個Socket連線,但是這是一個特殊的Socket連線。
瀏覽器在建立Socket之前,必須根據位址列裡輸入的URL的域名DNS解析出IP地址,在根據這個IP地址和預設的80埠與遠端伺服器建立Socket連結,然後瀏覽器根據這個URL組裝成一個get型別的HTTP請求頭,通過outPutStream.write 傳送到目標伺服器,伺服器等待inputString.read返回資料,最後斷開這個連線
埠號:80
所以完全可以自己模擬瀏覽器發起一個HTTP請求。專門有個處理HTTP請求的開源工具包,叫HttpClient。
在linux中通過curl+URL可以簡單地發起一個HTTP請求。如:curl "www.google.com"
請求的解析
HTTP請求的最重要的部分就是HTTP的頭部。
HTTP請求頭:
Accept-Charset 用於指定客戶端接受的字符集
Accept-Encoding 可接受的內容編碼
Accept-Language 自然語言 比如zh-cn
Host 指定被請求資源的Internet主機和埠號
User-Agent 客戶端將它的作業系統、瀏覽器和其他屬性告訴伺服器
Connection 當前連線是否保持。
HTTP響應頭:
Server 使用的伺服器名稱
Content-type 指明傳送給接受者的實體正文的媒體型別,如Content_Type:text/html;charset = GBK
Content-Encoding: 告訴瀏覽器服務端採用的壓縮編碼
Content-Language: 描述了資源所用的自然語言
Content-Length : 指明實體正文的長度
Keep-Alive : 保持連線的時間
常見的狀態嗎:
200 客戶端請求成功
302 臨時跳轉,跳轉的地址通過Location
400 客戶端請求語法有錯誤,不能被伺服器識別
404 請求資源不存在
403 伺服器收到請求,但是拒絕提供服務
500 服務端發生不可預期的錯誤
瀏覽器的快取設定
在瀏覽器端Ctrl+F5可以重新發起請求而不使用快取資料。發出報文的請求頭裡面相關欄位告訴伺服器,不要快取要最新的資料。
這兩個欄位是:Pragma:no-cache Cache-Control:no-cache
public:所有內容都將被快取,在響應頭中設定
private:內容只快取到私有快取中,在響應頭中設定
no-cache:所有內容都不會被快取,在請求頭和響應頭中設定
no-store:所有內容都不會被快取到快取或Internet臨時檔案中,在響應頭中設定
must-revalidation/proxy-revalidation:如果快取的內容失效,請求必須傳送到伺服器/代理以重新驗證,在請求頭中設定
max-age=xxx:快取的內容將在XXX秒後失效,只在HTTP1.1可用,在請求頭中設定
Cache-Control和Expires同時出現時,Cache-Control會覆蓋其他欄位
Expires:一般後面跟一個日期時間,超過這個時間設定之後,快取內容將失效,也就是瀏覽器在發出請求之前檢查這個頁面的這個欄位,看頁面是否過期了,過期了就重新向瀏覽器發起服務
Last-Modified:一般表示伺服器上資源最後修改時間,根據這個修改時間可以判斷當前請求的資源是否是最新的,如果是最新的,伺服器就返回304狀態碼告知瀏覽器
Etag:伺服器給每個頁面分配一個唯一的編號,然後區分編號判斷頁面內容是否是最新的
DNS域名解析過程
1.使用者輸入URL,瀏覽器檢查自身有沒有快取該域名的IP地址。
2.如果沒有,瀏覽器檢查作業系統快取中是否有這個DNS解析結果。
3.如果快取中還沒有,則作業系統會把這個域名傳送給LDNS(Local DNS)即本地域名伺服器。
4.如果LDNS中還沒有,則只能去Root Server域名伺服器中請求解析了。這樣的情況比較罕見,因為全球只有13臺左右這樣的伺服器。
5.根域名伺服器會返回一個本地域名伺服器所查域的主域名伺服器(gTLD Server)地址。gTLD是國際頂級域名伺服器地址,如.com、.cn、.org,全球只有13臺
6.LDNS向gTLD傳送請求。
7.gTLD接受此請求,返回一個此域名對應的Name Server域名伺服器的地址。這個Name Server通常就是你註冊的域名伺服器。
8.Name Server返回該域名對應的IP和TTL值,然後Local DNS Server會快取這個對應關係,快取時間由TTL控制。
9.解析結果返回使用者。使用者根據TTL值快取在本地系統快取此對應關係。
TTL是域名解析的生命週期,TTL值全稱是“生存時間(Time To Live)”,簡單的說它表示DNS記錄在DNSf伺服器上的快取時間。
清除快取域名
Local DNS的快取由TTL來控制,很難人工介入。但是本地機器的快取可以用以下命令來清除:
Windows: ipconfig /flushdns
Linux: /etc/init.d/nscd restart
幾種域名的解析方式
域名解析記錄主要分為:A 記錄、MX記錄、CNAME 記錄、NS記錄和 TXT記錄
A記錄:A 代表的是Address,用來指定域名對應的IP地址。域名可以多對一但是不能一對多。
MX記錄:Mail Exchange,就是講某個域名下的郵件伺服器指向自己的Mail Server。
CNAME記錄:別名解析。將一個域名設定一個或者多個別名。
NS記錄:為某個域名指定DNS解析伺服器。
TXT記錄:為某個主機名或者域名設定文字說明。
CDN
工作機制
CDN即內容分發網路。通過現有的Internet中增加一層新的網路架構,將網站的內容釋出到最接近使用者的網路邊緣,使使用者可以就近取得所需要的內容,提高使用者網站的響應速度。
負載均衡
對工作任務進行平衡、分攤到多個操作單元上去,共同完成任務。
三種架構:
1.鏈路負載均衡
由DNS解析來完成負載均衡,使用者直接訪問目標伺服器,而不需要經過其他的代理伺服器,通常訪問速度會更快。
缺點:一旦某臺伺服器掛掉,由於使用者本地和Local DNS都有DNS快取,快取沒有及時更新,則造成使用者無法訪問這個域名。
2.叢集負載均衡
硬體負載均衡:由一臺專門的硬體裝置負責轉發請求,太貴一般公司用不起,但是效能很好(一分錢一分貨啊)
軟體負載均衡:由多臺代理伺服器組成。網路延時較長。
3.作業系統負載均衡
利用作業系統級別的軟中斷或者硬體中斷來完成。
動態加速
在CDN的DNS解析過程中,通過動態鏈路探測來尋找回源最好的一條路徑,然後通過DNS排程將所有請求排程到選定這條路徑上回源,從而加速使用者訪問的效率。
回源:有使用者訪問某一個URL的時候,如果被解析到的那個CDN節點沒有快取響應的內容,或者是快取已經到期,就會回源站去獲取。如果沒有人訪問,那麼CDN節點不會主動去源站拿的。