瀏覽器Request到接收Response(后端篇)

Request 和 Response

前言:作為一個web開發工程師,工作中大量時間是和Request和Response打交道,這篇文章是我目前對二者的理解和總結。

問題一:何為Request 和 Response

Request 和 Response 是HTTP協議的一部分,http協議是萬維網服務器傳輸超文本到本地瀏覽器的傳輸協議。HTTP是屬于應用層的面向對象的協議,是現在web世界的基礎

HTTP協議是一種客戶端服務器架構,瀏覽器作為客戶端通過URl向HTTP服務端即Web服務器發送Request。Web服務器接受到請求后,向客戶端發送Response信息。

問題二:Request 和 Response的組成

Request客戶端發送到服務器的請求消息

Request結構.png

  1. 請求行: 以請求方法開頭,以空格作為間隔,后面依次是URL(統一資源定位符,用來標識互聯網上的唯一資源,可以是圖片,HTML等),HTTP協議版本。請求行標識了用什么樣的操作去操作那個資源。
  • 請求頭: 緊接著請求行,后面是請求頭, 用來說明服務器使用的附加信息。這一部分有很多標準信息,像User-Agent,標識瀏覽器信息,Accept-Encoding,標識壓縮格式,Accept-Language,標識語言信息。這一部分是服務器需要的重要信息,有一定標準格式。
  • 空行: 請求頭后面必須跟著空行。
  • 請求體: 可以添加任意數據,這是業務層實現的基礎,與業務相關的數據都會在請求體里面發送給服務器。

Response服務器處理客戶端發過來的請求后會返回一個HTTP相應消息

響應結構.jpg

  1. 狀態行: 包括協議版本,狀態碼,狀態消息三個部分其中狀態碼是客戶端判斷響應狀態的重要標準,依據狀態碼,對信息進行不同處理。
  • 響應頭:與請求頭一樣,告訴客戶端重要信息,如Content-Type告訴瀏覽器返回內容的格式,包括編碼方式。Date 響應生成的時間。
  • 空行: 與請求空行一樣,分隔響應頭與響應體
  • 響應體: 服務器返回給客戶端的文本信息,是業務層的主要實現部分。內容格式要與頭部的Content-Type對應起來。如今前后端分離的RESTful風格,就是Content-Type:application/json,然后響應體中的內容就是JSON格式。

問題三: Python web 服務器的體系結構

下面是我作為一個python web 開發新手,對web 服務器的理解。


web服務器體系結構.jpg

圖片來源

  1. 服務器軟件與應用服務器:

    • web服務器:Nginx Apache 之類的叫做服務器軟件,顧名思義,這是一個軟件,用于運行web 服務的軟件。也常被稱作web服務器, HTTP服務器,其作用是用來處理HTTP協議的,且只能處理靜態內容。也就是把服務器文件系統中的每一個資源對照成URI,然后通過HTTP協議把這些已經存在的資源傳給發起HTTP請求的客戶端。
    • 應用服務器: 僅僅響應靜態內容是不夠的,人們還需要動態的處理內容,返回動態的信息給客戶端。 這就用到了服務器腳本。人們為了統一服務器腳本和web服務器之間的信息交互方式,提出了CGI,統一化標準。Python社區給Python制定了一個官方的類似于GCI的協議,統一Python與web服務器的信息交互。WSGI規定了web服務器與web應用程序之間的標準接口,以確保web應用程序在不同的web服務器之間具有可移植性,在python web開發中,主流的選擇是Gunicorn,uWSGI等實現WSGI的容器。
    • 兩者的區別,web服務器負責處理HTTP協議,應用服務器既可以處理HTTP協議,也能處理其他協議。 web服務器處理靜態頁面內容,動態內容通過WSGI接口交給應用服務器來處理
    • 像flask Django 實現了自帶的web服務器用于開發,但是一般不能用于生產環境
    • web服務器通常會和應用服務器配合一起使用,第一,實現了動靜態資源的分離,動態資源交給應用服務器處理,靜態資源則由web服務器直接返回瀏覽器,這樣就減輕了應用服務器壓力。
      負載均衡,當業務壓力增大時候,可以啟動多個應用服務器進行水平擴展,而web服務器的負載均衡功能可以把請求通過算法分發到各個不同的實例進行處理,保證壓力分配到不同的應用服務器,保證生產環境的穩定。
  2. 選擇Nginx

    • Nginx 是一個開源的高性能的HTTP反向代理服務器
    • 作為web服務器,處理靜態文件,索引文件的效率非常高
    • 可以支持最大50000個并發連接,占用很少的內存
    • 穩定性高
    • 配置簡潔
    • 支持熱部署
    • 強大的反向代理:根據客戶端的請求,從后端服務器上獲取資源,將資源返回給客戶端,代理和服務在一個局域網內,對客戶端是透明的.Nginx,是反向代理的最佳選擇.可以起到緩沖請求,交給后端一個完整的HTTP請求,緩沖響應,減輕后端的壓力.隱藏應用服務器,防范網絡攻擊,增加安全性緩存靜態內容,代理緩存可以滿足大量網站請求,大大降低應用服務器上的負載,支持壓縮,通過壓縮優化網站訪問速度
    • 負載均衡.幫助web服務器合理分配請求,以達到資源的使用效率最佳,吞吐率最大,響應時間最小.
  3. WSGI Werkzeug flask Gunicorn

    • WSGI:Python Web Server Gateway Interface python 定義的web服務器與web應用程序之間的簡單而通用的接口
    • Werkzeng: Werkzeug是Python基于WSGI協議寫的函數庫,它的應用很廣泛.
    • flask: 基于Werkzeng實現的輕量級web框架
    • Gunicorn: wsgi容器,可以用Gunicorn跑用flask等Werkzeng框架實現的程序,這樣就實現了一個應用服務器.

問題四: 從發出Request到返回Response 發生了啥

  1. 瀏覽器發出一個請求,到DNS服務器,將域名解析為IP
  2. 瀏覽器利用IP和端口號和網站服務器建立TCP連接,經過三次握手,TCP連接建立完成.
  3. 瀏覽器組裝好Request發送給WEB服務器
  4. Nginx接受到Request之后根據請求資源類型進行分類,如果請求靜態資源,Nginx會檢索靜態資源,并直接返回,如果是請求動態資源,會交給應用服務器.當然這其中會有請求緩沖,負載均衡等步驟.
  5. 實現了wsgi網管接口的應用服務器接收到http請求后,利用Werkzeng等網絡編程工具實現的python程序(flask框架等)會根據request內容生成Response并返回給Nginx
  6. Nginx緩沖Response,并將其返回給瀏覽器
  7. 瀏覽器解析Response,最終將組織好的內容呈獻給用戶

問題五: 我作為 Python web 工程師的主要工作

  1. 利用web框架實現具體的業務,即上文中拿到一個Request解析,生成Response
  2. Nginx 和 應用服務器的配置與部署
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,828評論 18 139
  • Refer to: www.threemeal.com/blog/12/ 中間件 中間件是一個鉤子框架,它們可以介...
    蘭山小亭閱讀 16,526評論 9 165
  • 談論WEB編程的時候常說天天在寫CGI,那么CGI是什么呢?可能很多時候并不會去深究這些基礎概念,再比如除了CGI...
    __七把刀__閱讀 2,218評論 2 11
  • 依舊夢見曾經的你, 帶有鄉土氣息的, 還記得那田邊的渠...
    伯約閱讀 371評論 0 6
  • 百度垃圾新聞,一時手滑點了。 又是某女星因年輕時的一些問題,大齡未嫁,關鍵是年紀大了還是挺好看的,啊,姑娘,你多美...
    百里晴閱讀 167評論 0 0