gin框架handler注冊流程原理

什么是gin框架

gin框架是一個用于構建 Web 應用程序的 Go 語言框架热凹。它旨在提供一種簡單,快速的方式來構建 Web 應用程序油航。Gin 使用了一種名為底層感知(low-level awareness)的技術但荤,可以最大化應用程序的性能。Gin 還具有豐富的中間件(middleware)庫确买,可以方便地擴展應用程序的功能。

git地址

https://github.com/gin

如何使用gin框架

如何在項目中使用該命令:go get -u github.com/gin-gonic/gin
如果下載超時 可以使用代理解決 查看上一篇文章http://www.reibang.com/p/b6cdab0b852f

代碼

package main

import (
    "github.com/gin-gonic/gin"
)

func main() {
    //1.創(chuàng)建  engine對象
    engine := gin.Default()
    engine.Use(middleware)
    //2.設置請求路徑
    engine.GET("/hello", func(ctx *gin.Context) {
        ctx.JSON(200, gin.H{"data":"hello"})
    })

    //3. 設置端口啟動
    if err := engine.Run(":8081"); err != nil {
        recover()
    }

}

通過上述代碼片段服務已經可以使用纱皆,可以訪問http:127.0.0.1:8088/hello即可獲得服務端返回的數據湾趾。

原理解讀

注冊engine

我們從上述代碼中可以看出使用gin.Default()方法創(chuàng)建engine對象,大致原理為:

func Default() *Engine {
    //...
    engine := New()
    //...
    return engine
}

我們可以看出來Default方法中使用New()方法創(chuàng)建engine對象派草,具體的詳情如下展示:

func New() *Engine {
     // ...
    //創(chuàng)建engine 實例
    engine := &Engine{
        RouterGroup: RouterGroup{
            Handlers: nil,
            basePath: "/",
            root:     true,
        },
        // ...
        // 9 棵路由壓縮樹搀缠,對應9種http方法
        trees:                  make(methodTrees, 0, 9),
        // ...  
    }
    engine.RouterGroup.engine = engine
    // engine.Context 對象池
    engine.pool.New = func() any {
        return engine.allocateContext(engine.maxParams)
    }
    return engine
}

我們大概可以看出,在創(chuàng)建engine實例近迁,中可以看到有9種壓縮樹對應的http的9種請求方式艺普。

注冊middleware

通過engine.Use()方法可以實現中間件的注冊,會將注冊的middleware添加RouterGroup.handles中鉴竭。后續(xù)RouterGroup下注冊的handle都會在前綴中拼上這部分group公共的handles歧譬。

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
    engine.RouterGroup.Use(middleware...)
    //...
    return engine
}
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
    group.Handlers = append(group.Handlers, middleware...)
    return group.returnObj()
}

handler注冊流程

圖1.png

我們以http Get請求為例子handler的注冊流程為先調用handle方法,然后通過3步驟:第一步主要判斷注冊的路徑屬于哪個路由組搏存,路由組下有部分的公共的參數被該路由組所公用瑰步,在該路由組下選擇對應的basepath,作為公共的前綴,根據公共淺醉拼接上自身的路徑可以得到一個完整的路徑璧眠。第二步主要是將注冊的handles鏈時缩焦,先獲取到routeGroup組中公用的中間件獲取到兵钮,拼接到注冊的handles, 形成一個完整的handles鏈舌界。第三步,會選擇對應的壓縮前綴樹檢索泰演,如果有節(jié)點就復用呻拌,如果沒有就創(chuàng)建。

前綴樹

Trie樹睦焕,即字典樹藐握,又稱單詞查找樹或鍵樹,是一種樹形結構垃喊,是一種哈希樹的變種猾普。
典型應用是用于統(tǒng)計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計本谜。
它的優(yōu)點是:利用字符串的公共前綴來減少查詢時間初家,最大限度地減少無謂的字符串比較。

如圖2所示該圖就是一個前綴樹乌助。


圖2

壓縮前綴樹

壓縮前綴樹是在前綴樹的基礎上多了一個條件某個子節(jié)點是其父節(jié)點的唯一孩子溜在,則與父節(jié)點進行合并

如圖3所示,我們在樹種插入ABC他托,ABCD掖肋,BCD,壓縮樹在進行壓縮的時候首先根據我們上面將的規(guī)則進行壓縮赏参,某個子節(jié)點是其父節(jié)點的唯一孩子志笼,則與父節(jié)點進行合并 可以看到壓縮后將 BCD進行了壓縮,有人會問為什么不能將CD進行壓縮把篓,因為如果將CD壓縮為一個節(jié)點纫溃,那么ABC就失效了。

圖3

gin框架也采用了壓縮前綴樹的數據結構

采用壓縮前綴樹相對于map結構是有幾點優(yōu)勢的:
第一:壓縮前綴樹更容易處理處理通配韧掩,例如:/ping/,/user/*皇耗,
第二:壓縮前綴樹相對于map更加的節(jié)省空間
第三:map檢索和數量量有關系,前綴樹和數據長度有關
通過這3點可以看出壓縮前綴樹在該場景下更加有優(yōu)勢揍很。

gin框架還對壓縮前綴樹做了策略調整郎楼,將鏈路相對較長的鏈路放到樹的最左邊,方便檢索窒悔。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末呜袁,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子简珠,更是在濱河造成了極大的恐慌阶界,老刑警劉巖虹钮,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異膘融,居然都是意外死亡芙粱,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門氧映,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春畔,“玉大人,你說我怎么就攤上這事岛都÷梢蹋” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵臼疫,是天一觀的道長择份。 經常有香客問我,道長烫堤,這世上最難降的妖魔是什么荣赶? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鸽斟,結果婚禮上讯壶,老公的妹妹穿的比我還像新娘。我一直安慰自己湾盗,他們只是感情好伏蚊,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著格粪,像睡著了一般躏吊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帐萎,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天比伏,我揣著相機與錄音,去河邊找鬼疆导。 笑死赁项,一個胖子當著我的面吹牛,可吹牛的內容都是我干的澈段。 我是一名探鬼主播悠菜,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼败富!你這毒婦竟也來了悔醋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤兽叮,失蹤者是張志新(化名)和其女友劉穎芬骄,沒想到半個月后猾愿,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡账阻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年蒂秘,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淘太。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姻僧,死狀恐怖,靈堂內的尸體忽然破棺而出琴儿,到底是詐尸還是另有隱情,我是刑警寧澤嘁捷,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布造成,位于F島的核電站,受9級特大地震影響雄嚣,放射性物質發(fā)生泄漏晒屎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一缓升、第九天 我趴在偏房一處隱蔽的房頂上張望鼓鲁。 院中可真熱鬧,春花似錦港谊、人聲如沸骇吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燥狰。三九已至,卻和暖如春斜筐,著一層夾襖步出監(jiān)牢的瞬間龙致,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工顷链, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留目代,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓嗤练,卻偏偏與公主長得像榛了,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子煞抬,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內容