最流行的 Web 框架 Gin 源碼閱讀

前言

最近公司大部分項目開始往golang換, api的框架選定使用gin, 於是將 gin的源碼看了一遍, 會用幾篇文章將gin的流程及流程做一個梳理, 下面進入正題.

gin框架預覽

在這裏插入圖片描述

上圖大概是 gin裏面比較重要的模塊. 從 gin的官方第一個demo入手.
在這裏插入圖片描述
r.Run()的源碼:
在這裏插入圖片描述
然後看到開始調用的是 http.ListenAndServe(address,engine), 這個函數是 net/http的函數. 然後請求數據就在 net/http開始流轉.

所以, gin源碼閱讀系列就是要弄明白以下幾個問題:

  1. request數據是如何流轉的
  2. gin框架到底扮演了什麼角色
  3. 請求從gin流入net/http, 最後又是如何回到gin中
  4. gin的context爲何能承擔起來複雜的需求
  5. gin的路由算法
  6. gin的中間件是什麼
  7. gin的Engine具體是個什麼東西
  8. net/http的requeset, response都提供了哪些有用的東西

request數據是如何流轉的

先不使用 gin, 直接使用 net/http來處理http請求
在這裏插入圖片描述
在瀏覽器中輸入 localhost:8000, 會看到 HelloWorld. 下面利用這個簡單demo看下 request的流轉流程.

HTTP是如何建立起來的

簡單的說一下http請求是如何建立起來的(需要有基本的網絡基礎, 可以找相關的書籍查看, 推薦看 UNIX網絡編程卷1:套接字聯網API)
在這裏插入圖片描述
在 TCP/IP五層模型下, HTTP位於 應用層, 需要有 傳輸層來承載 HTTP協議. 傳輸層比較常見的協議是 TCP, UDP, SCTP等. 由於 UDP不可靠, SCTP有自己特殊的運用場景, 所以一般情況下 HTTP是由 TCP協議承載的(可以使用wireshark抓包然後查看各層協議)

使用 TCP協議的話, 就會涉及到 TCP是如何建立起來的. 面試中能夠常遇到的名詞 三次握手, 四次揮手就是在這裏產生的. 具體的建立流程就不在陳述了, 大概流程就是圖中左半邊

所以說, 要想能夠對客戶端http請求進行迴應的話, 就首先需要建立起來TCP連接, 也就是 socket. 下面要看下 net/http是如何建立起來 socket?

net/http是如何建立 socket的

從圖上可以看出, 不管server代碼如何封裝, 都離不開 bind, listen, accept這些函數. 就從上面這個簡單的demo入手查看源碼.

在這裏插入圖片描述
註冊路由
在這裏插入圖片描述
這段代碼是在註冊一個路由及這個路由的handler到 DefaultServeMux中
在這裏插入圖片描述
可以看到這個路由註冊太過簡單了, 也就給 gin, iris, echo等框架留下了擴展的空間, 後面詳細說這個東西

服務監聽及響應

上面路由已經註冊到 net/http了, 下面就該如何建立socket了, 以及最後又如何取到已經註冊到的路由, 將正確的響應信息從handler中取出來返回給客戶端
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
這基本是整個過程的代碼了. 基本上是:

  1. ln,err:=net.Listen(“tcp”,addr)做了 初試化了socket, bind, listen的操作.
  2. rw,e:=l.Accept()進行accept, 等待客戶端進行連接
  3. go c.serve(ctx) 啓動新的goroutine來處理本次請求. 同時主goroutine繼續等待客戶端連接, 進行高併發操作
  4. h,_:=mux.Handler® 獲取註冊的路由, 然後拿到這個路由的handler, 然後將處理結果返回給客戶端

從這裏也能夠看出來, net/http基本上提供了全套的服務.

爲什麼會出現很多go框架

在這裏插入圖片描述
從這段函數可以看出來, 匹配規則過於簡單, 當能匹配到路由的時候就返回其對應的handler, 當不能匹配到時就返回 /. 所以 net/http的路由匹配無法滿足複雜的需求開發. 所以基本所有的go框架乾的最主要的一件事情就是重寫 net/http的route

所以我們直接說 gin就是一個httprouter也不過分, 當然 gin也提供了其他比較主要的功能, 後面會一一介紹

還有一個go框架要實現的東西是 http.ResponseWriter

綜述, net/http基本已經提供 http服務的70%的功能, 那些號稱賊快的go框架, 基本上都是提供一些功能, 讓我們能夠更好的處理客戶端發來的請求.

文獻

https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651439018&idx=2&sn=175265bb7dd91ca8f543abb87d23e633&chksm=80bb6158b7cce84eead3f627765d5cf6e68d60cad4688a2d71fea7a1dd64d5a346dfbea3596c&scene=21#wechat_redirect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章