JavaShuo
欄目
標籤
深刻理解gin framework(二)
時間 2019-12-06
標籤
深刻
理解
gin
framework
简体版
原文
原文鏈接
gin flow 分析
Handler是如何註冊和傳遞的?路由是如何解析的?http方法又是如何處理,使其知足RESTful規範的?這些細節都須要深刻到代碼層面來分析
輔助功能
既然是框架,天然會處理各類項目中共性的問題,好比說404 Not Found。這部分框架的功能不是分析的重點。
啓動http服務
在
深刻理解gin framework(一)
的例子中,由r.Run(":14000")啓動http服務。這裏只能傳入空值或者一個地址,不然會報錯。源碼以下,空值時默認端口爲8080.
啓動http server的Run函數,TLS類似,只不過是加了個證書。其實仍是把address傳給官方標準包http的ListenAndServe函數,此處的engine struct只須要實現Handler接口,也就是實現ServeHTTP函數便可。
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。
當新的http請求過來的時候,調用getValue就能夠找到對應path的handler。爲何沒有對應的get,post方法呢?由於每一個http方法本身一棵樹~
OK。回到handleHTTPRequest函數中來。找到handler以後,把Context交給這個handler就好了,handler爲何可以處理Context呢?是由於這個:
番外:註冊handler
回到咱們的
例子
。
gin.Default()返回了一個Engine,這個engine繼承了RouteGroup,而RouteGroup實現了IRouter接口(Get(),Post()...),因此r.Group("/api")其實調用的是RouteGroup函數
在Group裏邊會整合handlers,計算並記錄絕對路徑。分組以後返回RouteGroup對象,此時,繼續調用POST()函數,將handlerFunc和路徑註冊到對應的tree當中。具體以下:
至此,會生成POST方法對應的tree,當有POST請求進入服務器時,找到POST tree,而後根據path找到對應的handler。再把已經初始化的Context交給相應的handler來處理。
相關文章
1.
深刻理解gin framework(一)
2.
深刻Gin框架內幕(二)
3.
Titan Framework MongoDB深刻理解1
4.
Titan Framework MongoDB深刻理解3
5.
Titan Framework MongoDB深刻理解2
6.
深刻解析Android-Plugin-Framework
7.
深刻理解MyBatis(二)--Mapper
8.
深刻理解TCP(二)
9.
linux uvc深刻理解(二)
10.
深刻理解RunLoop(二)
更多相關文章...
•
Hibernate的二級緩存
-
Hibernate教程
•
SQLite Explain(解釋)
-
SQLite教程
•
算法總結-深度優先算法
•
Docker 清理命令
相關標籤/搜索
深刻理解JVM
深刻理解javascript
深刻理解webpack
深刻理解redis
深刻理解ES6
深刻理解 RPC
深刻理解RocketMQ
深刻理解Spark
深刻理解RPC
深刻理解Nginx
MySQL教程
MyBatis教程
NoSQL教程
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
resiprocate 之repro使用
2.
Ubuntu配置Github並且新建倉庫push代碼,從已有倉庫clone代碼,並且push
3.
設計模式9——模板方法模式
4.
avue crud form組件的快速配置使用方法詳細講解
5.
python基礎B
6.
從零開始···將工程上傳到github
7.
Eclipse插件篇
8.
Oracle網絡服務 獨立監聽的配置
9.
php7 fmp模式
10.
第5章 Linux文件及目錄管理命令基礎
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
深刻理解gin framework(一)
2.
深刻Gin框架內幕(二)
3.
Titan Framework MongoDB深刻理解1
4.
Titan Framework MongoDB深刻理解3
5.
Titan Framework MongoDB深刻理解2
6.
深刻解析Android-Plugin-Framework
7.
深刻理解MyBatis(二)--Mapper
8.
深刻理解TCP(二)
9.
linux uvc深刻理解(二)
10.
深刻理解RunLoop(二)
>>更多相關文章<<