Go如何讓W(xué)eb工作的

先來(lái)一個(gè)例子吧:

程序運(yùn)行起來(lái),在Postman分別發(fā)送get(http://127.0.0.1:8888/sayHelloWorld?name=我是get請(qǐng)求)、post(http://127.0.0.1:8888/sayHelloWorld,name:我是post請(qǐng)求)請(qǐng)求:

一、Web工作方式的幾個(gè)概念:

1.Request:用戶請(qǐng)求的信息,用來(lái)解析用戶的請(qǐng)求信息,包括post、get、cookie、url等信息。

2.Response:服務(wù)器需要反饋給客戶端的信息。

3.Conn:用戶的每次請(qǐng)求鏈接。

4Handler:處理請(qǐng)求和生產(chǎn)返回信息的處理邏輯。

5.ResponseWriter: 生成Response的接口。

6.ServeMux: 路由,ServeMux也是一種Handler

二、http包執(zhí)行流程

1.創(chuàng)建Listen Socket 監(jiān)聽(tīng)指定的端口,等待客戶端請(qǐng)求到來(lái)。

2.Listen Socket接受客戶端的請(qǐng)求,得到Client Socket,接下來(lái)通過(guò)Client Socket與客戶端通信。

3.處理客戶端的請(qǐng)求,首先從Client Socket 讀取HTTP請(qǐng)求的協(xié)議頭,如果是POST方法,還可以讀取客戶端提交的數(shù) ? ? ? ? ?據(jù),然后交給相應(yīng)的handler處理請(qǐng)求,handle處理完畢準(zhǔn)備好客戶端需要的數(shù)據(jù),通過(guò)Client Socket寫給客戶端。

三、Go代碼執(zhí)行流程(結(jié)合原碼來(lái)看更容易理解)

1、首先調(diào)用http.HandleFunc("/",HandleRequest)

a. 調(diào)用了DefaultServerMux的HandleFunc

b.調(diào)用了DefaultServerMux的Handle

c.往DefaultServeMux的map[string]muxEntry中增加對(duì)應(yīng)的handler和路由規(guī)則

2、其次調(diào)用http.ListenAndServe(":8888",nil)

a. 實(shí)例化Serverserver := &Server{Addr: addr, Handler: handler}

b. 調(diào)用了Server.ListenAndServe()

c. 調(diào)用了net.Listen("tcp", addr) 監(jiān)聽(tīng)端口,底層用TCP協(xié)議搭建了一個(gè)服務(wù),然后監(jiān)聽(tīng)我們?cè)O(shè)置的端口

d. 啟動(dòng)一個(gè)for循環(huán),在循環(huán)體中接受請(qǐng)求

e.對(duì)每個(gè)請(qǐng)求實(shí)例化一個(gè)Conn ?c := srv.newConn(rw)并且開(kāi)啟一個(gè)goroutine為這個(gè)請(qǐng)求進(jìn)行服務(wù)

? ?go c.serve(ctx)

f. 讀取每個(gè)請(qǐng)求的內(nèi)容w, err := c.readRequest(ctx)

g. 判斷handler是否為空,如果沒(méi)有設(shè)置handler,handler就設(shè)置為DefaultServeMux

h. ?根據(jù)request選擇handler 并且進(jìn)入到這個(gè)handler的ServeHttp mux.handler(r).ServeHTTP(w, r)

i. 選擇路由:

1)判斷有沒(méi)有路由滿足這個(gè)request(循環(huán)遍歷ServerMux的muxEntry)

2)如果有路由滿足,調(diào)用這個(gè)路由handler的serveHttp

3)如果沒(méi)有路由滿足,調(diào)用NotFoundHandler的ServeHttp

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

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)、netstat -nat 查看TCP各個(gè)狀態(tài)的數(shù)量2)、lso...
    北辰青閱讀 9,700評(píng)論 0 11
  • 最近在學(xué)習(xí)Python看了一篇文章寫得不錯(cuò),是在腳本之家里的,原文如下,很有幫助: 一、網(wǎng)絡(luò)知識(shí)的一些介紹 soc...
    qtruip閱讀 2,840評(píng)論 0 6
  • 01 朋友云突然給我打來(lái)電話,我有些詫異,說(shuō):“你不是談戀愛(ài)了嗎?怎么突然想到給我打電話呀?” 她無(wú)奈地笑了笑,說(shuō)...
    清荷沐陽(yáng)閱讀 515評(píng)論 18 15
  • 偷偷看里面動(dòng)物園,今天就 讀這個(gè)了,女兒把熊貓的手撕了,我粘好了,她又撕,陪著她看就不會(huì)撕!
    依荷媽媽繪本閱讀大V店閱讀 204評(píng)論 0 0

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