本文總結(jié)自《深入分析Java Web技術(shù)內(nèi)幕》一書馋贤。全篇內(nèi)容大致先從一個面試經(jīng)常問及的問題說起,然后再介紹各個主要過程。
一個面試問題
輸入一個網(wǎng)址端蛆,到看到頁面,經(jīng)歷了哪些過程酥泛?
這個問題大致可以回答這幾點:DNS域名解析今豆、發(fā)起HTTP請求、負載均衡柔袁、緩存呆躲、CDN等。
下面是書里的一段話捶索,我覺得能夠很好地回答這個問題了:
首先會請求DNS把這個域名解析出對應(yīng)的IP地址插掂,然后根據(jù)這個IP地址在互聯(lián)網(wǎng)上找到對應(yīng)的服務(wù)器,向這個服務(wù)器發(fā)起一個get請求情组,由這個服務(wù)器決定返回默認的數(shù)據(jù)資源給訪問的用戶燥筷。在服務(wù)器端實際上還有很復(fù)雜的業(yè)務(wù)邏輯:服務(wù)器可能有很多臺,到底指定哪臺服務(wù)器來處理請求院崇,這需要一個負載均衡設(shè)備來平均分配所有用戶的請求肆氓;還有請求的數(shù)據(jù)是存儲在分布式緩存里還是一個靜態(tài)文件中,或者是在數(shù)據(jù)庫里底瓣;當數(shù)據(jù)返回瀏覽器時谢揪,瀏覽器解析數(shù)據(jù)發(fā)現(xiàn)還有一些靜態(tài)資源(如CSS、JS或者圖片)時又會發(fā)起另外的HTTP請求捐凭,而這些請求很可能會在CDN上拨扶,那么CDN服務(wù)器又會處理這個用戶的請求。
發(fā)起HTTP請求
發(fā)起HTTP請求就是建立一個Socket連接茁肠,瀏覽器在建立Socket連接之前患民,必須根據(jù)地址欄里輸入的URL的域名DNS解析出IP地址,再根據(jù)這個IP地址和默認的80端口與遠程服務(wù)器建立Socket連接垦梆,然后瀏覽器根據(jù)這個URL組裝成一個get類型的HTTP請求頭匹颤,通過outputStream.write發(fā)送到目標服務(wù)器仅孩,服務(wù)器等待inputStream.read返回數(shù)據(jù),最后斷開這個連接印蓖。
總結(jié):發(fā)起一個HTTP請求的過程就是建立一個Socket通信的過程辽慕。
DNS域名解析
- 瀏覽器會檢查緩存中有沒有這個域名對應(yīng)的解析過的IP地址,如果緩存中有赦肃,這個解析過程就將結(jié)束溅蛉。瀏覽器緩存域名是有限制的,不僅瀏覽器緩存大小有限制他宛,而且緩存的時間也有限制船侧,域名被緩存的時間限制可以通過TTL屬性來設(shè)置。
- 如果用戶的瀏覽器緩存中沒有厅各,瀏覽器會查找操作系統(tǒng)緩存中是否有這個域名對應(yīng)的DNS解析結(jié)果勺爱。
- 如果在本機中仍然無法完成域名的解析,就會真正請求域名服務(wù)器來解析這個域名讯检。在這一步中琐鲁,操作系統(tǒng)會把這個域名發(fā)送給LDNS,即本地區(qū)的域名服務(wù)器人灼。這個域名解析服務(wù)器一般都會緩存域名解析結(jié)果围段,80%的域名解析都到這里就能夠完成,所以LDNS主要承擔了域名的解析工作投放。
- 如果LDNS仍然沒有命中奈泪,再到Root Server域名服務(wù)器請求解析。
- 根域名服務(wù)器返回給本地域名服務(wù)器一個所查詢域的主域名服務(wù)器(gTLD Server)地址灸芳。
- 本地域名服務(wù)器(Local DNS Server)再向上一步返回的gTLD服務(wù)器發(fā)送請求涝桅。
- 接受請求的gTLD服務(wù)器查找并返回此域名對應(yīng)的Name Server域名服務(wù)器的地址,這個Name Server通常就是你注冊的域名服務(wù)器烙样。
- Name Server域名服務(wù)器會查詢存儲的域名和IP的映射關(guān)系表冯遂。
- 返回該域名對應(yīng)的IP和TTL值,Local DNS Server會緩存這個域名和IP的對應(yīng)關(guān)系谒获,緩存時間由TTL值控制蛤肌。
- 把解析結(jié)果返回給用戶,域名解析過程結(jié)束批狱。
DNS域名解析圖如下(省略第一裸准、二步在本機完成的過程):
CDN
CDN就是內(nèi)容分布網(wǎng)絡(luò)(Content Delivery Network)。其目的是通過在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu)赔硫,將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)“邊緣”炒俱,使用戶可以就近取得所需的內(nèi)容,提高用戶訪問網(wǎng)絡(luò)的響應(yīng)速度。
CDN都以緩存網(wǎng)站中的靜態(tài)數(shù)據(jù)為主权悟,如CSS恼蓬、JS、圖片和靜態(tài)頁面等數(shù)據(jù)僵芹,用戶在從主站服務(wù)器請求到動態(tài)內(nèi)容后,再從CDN上下載這些靜態(tài)數(shù)據(jù)小槐,從而加速網(wǎng)頁數(shù)據(jù)內(nèi)容的下載速度拇派。
拿到DNS解析結(jié)果,用戶就直接去這個CDN節(jié)點訪問這個靜態(tài)文件了凿跳,如果這個節(jié)點中所請求的文件不存在件豌,就會再回到源站去獲取這個文件,然后再返回給用戶控嗜。
負載均衡
負載均衡(Load Balance)就是對工作任務(wù)進行平衡茧彤、分攤到多個操作單元上執(zhí)行,如圖片服務(wù)器疆栏、應(yīng)用服務(wù)器等曾掂,共同完成工作任務(wù)。它可以提高服務(wù)器響應(yīng)速度及利用效率壁顶,避免軟件或者硬件模塊出現(xiàn)單點失效珠洗,解決網(wǎng)絡(luò)擁塞問題,實現(xiàn)地理位置無關(guān)性若专,為用戶提供較一致的訪問質(zhì)量许蓖。通常有三種負載均衡架構(gòu),分別是鏈路負載均衡调衰、集群負載均衡和操作系統(tǒng)負載均衡膊爪。