深刻理解gin framework(二)

gin flow 分析

  • Handler是如何註冊和傳遞的?路由是如何解析的?http方法又是如何處理,使其知足RESTful規範的?這些細節都須要深刻到代碼層面來分析

輔助功能

  • 既然是框架,天然會處理各類項目中共性的問題,好比說404 Not Found。這部分框架的功能不是分析的重點。

啓動http服務

  • 深刻理解gin framework(一)的例子中,由r.Run(":14000")啓動http服務。這裏只能傳入空值或者一個地址,不然會報錯。源碼以下,空值時默認端口爲8080.

    clipboard.png

  • 啓動http server的Run函數,TLS類似,只不過是加了個證書。其實仍是把address傳給官方標準包http的ListenAndServe函數,此處的engine struct只須要實現Handler接口,也就是實現ServeHTTP函數便可。

    clipboard.png

    clipboard.png

  • engine struct中的pool就是sync.Pool,代碼中能夠看出來,每處理一個http請求,都會從鏈接池裏邊取出一個Context,把請求參數傳遞給這個Context,處理完以後,再把這個Context放回去。

處理http請求

  • 從上邊的源碼能夠看出來,全部的http請求都會走到handleHTTPRequest函數中去處理。
  • handleHTTPRequest處理的第一步是初始化Context的參數,前面有說到,Context結構體封裝了處理http請求的全部數據。初始化參數就是將Context裏面的數據更新爲這次http請求的數據,方便接下來對Context進行處理。
  • 想要理解接下來handleHTTPRequest的處理邏輯,須要先岔開到tree.go文件當中去。git

    • 肯定某次http請求怎麼處理,須要明確審什麼?三件事情,path,method,handler!
    • 在tree文件當中,以基數樹的結構存儲了path,及其該path對應的handler。
      clipboard.png
    • 當新的http請求過來的時候,調用getValue就能夠找到對應path的handler。爲何沒有對應的get,post方法呢?由於每一個http方法本身一棵樹~
      clipboard.png
  • OK。回到handleHTTPRequest函數中來。找到handler以後,把Context交給這個handler就好了,handler爲何可以處理Context呢?是由於這個:
    clipboard.png

番外:註冊handler

  • 回到咱們的例子

    clipboard.png
    clipboard.png
    clipboard.png

  • gin.Default()返回了一個Engine,這個engine繼承了RouteGroup,而RouteGroup實現了IRouter接口(Get(),Post()...),因此r.Group("/api")其實調用的是RouteGroup函數
    clipboard.png
  • 在Group裏邊會整合handlers,計算並記錄絕對路徑。分組以後返回RouteGroup對象,此時,繼續調用POST()函數,將handlerFunc和路徑註冊到對應的tree當中。具體以下:
    clipboard.png
    clipboard.png
    clipboard.png
    clipboard.png
  • 至此,會生成POST方法對應的tree,當有POST請求進入服務器時,找到POST tree,而後根據path找到對應的handler。再把已經初始化的Context交給相應的handler來處理。
相關文章
相關標籤/搜索