JavaWeb(1)請求過程

現(xiàn)在互聯(lián)網(wǎng)的網(wǎng)絡(luò)架構(gòu)已經(jīng)慢慢從傳統(tǒng)的C/S架構(gòu)轉(zhuǎn)變?yōu)榱烁颖憬莸腂/S架構(gòu),從而大大簡化了用戶使用網(wǎng)絡(luò)應(yīng)用的難度。

B/S架構(gòu)的兩個好處:

1、客戶端使用統(tǒng)一的瀏覽器(Browser)。有效的屏蔽了不同服務(wù)商提供給用戶使用服務(wù)的差異性。

2、服務(wù)端(Server)基于統(tǒng)一的Http協(xié)議。由于使用統(tǒng)一的Http協(xié)議,所以基于Http的服務(wù)器就有很多,如:Apache、IIs、Nginx、Tomcat、JBoss等,這些服務(wù)器不用服務(wù)開發(fā)者單獨(dú)來進(jìn)行開發(fā),可以直接拿來使用。服務(wù)開發(fā)者只需要關(guān)注提供服務(wù)的應(yīng)用邏輯,其他一切平臺和框架都可以直接拿來使用。所以也同樣簡化了服務(wù)提供者的開發(fā)。

B/S架構(gòu)的介紹:

Http采用的是無狀態(tài)的短連接的通信方式,通常情況下,一次請求就完成了一次數(shù)據(jù)的交互,通常也對應(yīng)一個業(yè)務(wù)邏輯,然后這次通信就斷開了。采用這種方式是為了能夠同時服務(wù)更多的用戶。

當(dāng)前互聯(lián)網(wǎng)應(yīng)用每天都要處理上億的用戶請求,所以不可能每個用戶訪問一次之后就一直保持這個連接。

由于現(xiàn)在的架構(gòu)設(shè)計,既要滿足海量用戶的訪問請求,又要保持用戶請求的快速響應(yīng),所以架構(gòu)也就變的越來越復(fù)雜。主要的還是采用下圖的架構(gòu)設(shè)計。


B/S架構(gòu)設(shè)計圖

請求大概過程:當(dāng)一個用戶在瀏覽器輸入:www.taobao.com這個URL(統(tǒng)一資源定位器)時,首先請求DNS(域名服務(wù)器)將這個域名解析成對應(yīng)的IP地址,然后根據(jù)IP找到對應(yīng)的服務(wù)器,向這個服務(wù)器發(fā)送一個GET請求,由這個服務(wù)器決定返回默認(rèn)的數(shù)據(jù)資源給訪問的用戶。

在服務(wù)器端實際上還有一套很復(fù)雜的業(yè)務(wù)邏輯:服務(wù)器可能有很多臺,到底指定哪臺服務(wù)器來處理請求,這時就需要一個負(fù)載均衡設(shè)備來平均分配所有用戶的請求。

還有請求的數(shù)據(jù)時存儲在分布式緩存中,還是一個靜態(tài)文件中,或者是在數(shù)據(jù)庫中。

當(dāng)數(shù)據(jù)返回瀏覽器時,瀏覽器解析數(shù)據(jù)發(fā)現(xiàn)還有一些靜態(tài)資源(如:CSS、JS、IMG)時,又會發(fā)起另外的HTTP請求,而這些請求很可能會在CDN上,那么CDN服務(wù)器又會處理這些HTTP請求。

大體上一個用戶請求會涉及這些基本的流程,每一個都會影響這些請求最終是否會成功。

網(wǎng)絡(luò)架構(gòu)的基本原則:

1、互聯(lián)網(wǎng)上所有的資源都要用到一個URL表示。如果你要發(fā)布一個服務(wù)或者一個資源到互聯(lián)網(wǎng),讓別人能夠訪問到,那么你首先必須要有一個在世界上獨(dú)一無二的URL。

2、必須基于HTTP與服務(wù)端交互。

3、數(shù)據(jù)展示必須在瀏覽器中進(jìn)行。

如何發(fā)起一個請求?

發(fā)起一個HTTP連接其實本質(zhì)上就是建立一個Socket連接的過程。

其中,outputStream.write寫的二進(jìn)制字節(jié)數(shù)據(jù)格式要符合HTTP。瀏覽器在建立Socket連接之前,必須根據(jù)地址欄輸入的URL的域名DNS解析程IP地址,再根據(jù)這個IP地址和默認(rèn)的80端口與遠(yuǎn)程服務(wù)器之間建立Socket連接,然后瀏覽器根據(jù)這個URL組裝程一個GET類型的HTTP請求頭,通過outputStream.write發(fā)送到目標(biāo)服務(wù)器,服務(wù)器等待inputStream.read返回數(shù)據(jù),最后斷開這個連接。

HTTP Header

HTTP Header控制著互聯(lián)網(wǎng)成千上萬的用戶的數(shù)據(jù)的傳輸。最關(guān)鍵的是,它控制著用戶瀏覽器的渲染行為和服務(wù)器的執(zhí)行邏輯。

常見的HTTP請求頭

Accept-Charset:用于指定客戶端接收的字符集;

Accept-Encoding:用于指定可接受的內(nèi)容編碼,如:Accept-Encoding:gzip.deflate

Accept-Language:用于指定一種自然語言,如:Accept-Language:zh-cn

Host:用于指定被請求資源的Internet主機(jī)和端口號

User-Agent:客戶端將它的操作系統(tǒng)、瀏覽器和其他屬性告訴服務(wù)器

Connection:當(dāng)前連接是否保持,如:Connection:Keep-Alive

常見的HTTP響應(yīng)頭

Server:使用的服務(wù)器名稱,如Server:Apache/1.3.6(Unix)

Content-Type:用來指明發(fā)送給接收者的實體正文的媒體類型,如:Content-Type:text/html;charset=GBK

Content-Encoding:與請求報頭Accept-Encoding對應(yīng),告訴瀏覽器服務(wù)端采用的是什么壓縮編碼

Content-Language:描述了資源所用的自然語音,與Accept-Language對應(yīng)

Content-Length:指明了實體正文的長度,用以字節(jié)方式存儲的十進(jìn)制數(shù)字來表示

Keep-Alive:保持連接的時間,如Keep-Alive:timeout=5,max=120

常見的HTTP狀態(tài)碼

200:客戶端請求成功

302:臨時跳轉(zhuǎn),跳轉(zhuǎn)的地址通過Location指定

400:客戶端請求有語法錯誤,不能被服務(wù)器識別

403:服務(wù)器收到請求,但是拒絕提供服務(wù)

404:請求的資源不存在

500:服務(wù)器發(fā)生不可預(yù)期的錯誤

瀏覽器一般可以通過F12調(diào)出開發(fā)人員工具來查看HTTP信息。

題外話:看了一會宋朝小談,五代十國不是真的只有十國,十只不過是一個代數(shù),而五代分別是梁、唐、晉、漢、周。

北方的游牧民族,在各個時代都有不同的種族也可以是不同的稱呼:春秋戰(zhàn)國時期叫戎狄、秦漢時叫匈奴、唐朝時叫突厥、五代十國開始叫契丹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容