- Engine
Engine即gin對應的服務端類(Server類),對應net/http中的ServeMux。編寫gin的服務時,通常有兩種初始化方法:
以上兩種方法都生成一個*Engine例項,只是gin.Default()生成的Engine帶了Logger和Recovery兩個中介軟體。Engine的核心成員如下:
一個Engine的核心功能包括:
·註冊路由
·給某個路由新增中介軟體
·接受新的連線
·當已有連線有資料來臨時,呼叫對應路由下的處理函式(請求處理,此部分開啟了單獨的goroutine處理)
下面我們看一下對應的實現了以上功能的Engine函式。
注:Engine的路由和中介軟體註冊對應在radix tree的新增節點,請求處理中的路由匹配部分對應在radix tree中查詢節點。只要明白了radix tree的原理,這幾個功能很好理解。而接受新的連線和連線到來時,呼叫請求處理函式則是複用了net/http的處理函式,參考上一章第一節部分。因此以下部分只介紹對應的函式和原理,不展示原始碼,以求提綱挈領。
路由註冊和新增路由中介軟體
註冊路由等功能是透過Engine下的RouterGroup實現的,RouterGroup實現了POST, GET,PUT, Group等函式。POST, GET,PUT, DELETE等函式就是在路由樹radix_tree上新增一個路由節點;Group則是新增一個路由組,本質上就是在radix_tree上新增了一個非葉節點的路由節點。理解gin的路由實現,以上函式的原理理解起來就非常容易。中介軟體透過RouterGroup實現的Use函式新增。中介軟體函式的簽名和請求處理函式一致,Use函式就是在RouterGroup.Handlers(HandlerFunc的陣列)中新增一箇中介軟體HandlerFunc。
接受新的連線
Engine的Run函式底層就是一個for迴圈,在迴圈內為每個新到來的連線建立一個goroutine(本質上是利用了net/http的ListenAndServe函式,實現對新連線的處理)
處理請求
Engine實現了ServeHTTP函式,從上一章1.3的分析中,我們知道ServeHTTP是統一的請求處理函式。ServeHTTP的主要作用就是在Engine.trees中找到跟請求路由對應的HandlersChain,並呼叫它們處理請求,回寫結果(即路由匹配->請求處理->結果回寫)。