gin框架中介軟體的實現原理 golang

2021-10-10 04:27:06 字數 2741 閱讀 9164

gin-gonic的中介軟體使用非常簡單,這裡就不多說了,本文主要講講中介軟體的原理以及demo實現。

中介軟體是乙個洋蔥模型,中心為最終處理請求的 handler,稱為 main handler,其他為 middleware handler 。每乙個 middleware handle 可以分為兩部分,隨著 request 的流動,左邊是入,右邊為出,而分割點就是 next 。

next 的作用就是明確在這個地方進入到下乙個 handler ,如果沒有指定,預設是當前 handler 結束後進入下乙個 handler。

由此看出各 middleware handle 都是先進後出的。

deml1:

package main

import

("fmt"

)type context struct

func

(c *context)

next()

func

main()

c.handlers =

make([

]func

(*context),0

)// 註冊中介軟體

c.handlers =

(c.handlers, m1)

c.handlers =

(c.handlers, m2)

c.handlers =

(c.handlers, m3)

// 控制器函式

c.handlers =

(c.handlers, action)

// 啟動

c.handlers[0]

(c)}

func

action

(c *context)

func

m1(c *context)

func

m2(c *context)

func

m3(c *context)

m1, m2, m3 為 middleware handler,action 為 main handler。通過 next 方法實現鏈路,以上程式輸出:

m1 start

m2 start

main handler

m3 end

m2 end

符合預期,但是如果將 m2 的 c.next() 去掉了,整個鏈路就斷了,所以還要實現自動鏈路,思路就是只要鏈路被啟動了,就自動往下執行,而不依靠 next 方法。

修改 next 方法:

func

(c *context)

next()

}

這樣,除了 m1 之外,其他幾個去掉了 next 方法,也能按預期執行了,現在需要將 m1 中的 next 也去掉,則需要修改啟動方式了。

// 啟動

c.handlers[0]

(c)c.

next

()

這樣,所有的 middleware handler 都不用強依賴於 next 也能按預期執行了。

有時候我們需要人為的中斷請求,需要實現鏈路中斷,參考gin中的實現方式,它定義了乙個最大的 handler 索引最為判斷依據,並且在註冊 handler 的時候也做同樣的判斷。

於是,最終**為:

package main

import

("fmt"

"math"

)const abortindex int8

= math.maxint8 /

2type context struct

func

(c *context)

next()

}func

(c *context)

abort()

func

main()

c.handlers =

make([

]func

(*context),0

)// 註冊中介軟體

c.handlers =

(c.handlers, m1)

c.handlers =

(c.handlers, m2)

c.handlers =

(c.handlers, m3)

// 控制器函式

c.handlers =

(c.handlers, action)

// 限制handler個數

iflen

(c.handlers)

>=

int(abortindex)

// 啟動

c.handlers[0]

(c) c.

next()

}func

action

(c *context)

func

m1(c *context)

func

m2(c *context)

func

m3(c *context)

輸出為:

m1 start

m2 start

m2 end

abort方法實現了禁止向下傳播,但是不會影響當前中介軟體的執行。

gin框架中介軟體詳解

gin框架涉及中介軟體相關有4個常用的方法,它們分別是c.next c.abort c.set c.get gin框架中的中介軟體設計很巧妙,我們可以首先從我們最常用的r gin.default 的default函式開始看,它內部構造乙個新的engine之後就通過use 函式註冊了logger中介軟...

gin中介軟體講解

1 想要使用中介軟體必須是乙個 func c gin.context 型別的函式,底層實現了handefunc方法 2 中介軟體是請求和響應的分界點,無論怎麼變換給前端響應的那個動作永遠最後執行 2 use 法的作用是,將中介軟體函式存放到乙個map裡用於後續的執行,只會給c上下 新增 個屬性,並賦...

gin系列 中介軟體

gin框架允許開發者在處理請求的過程中,加入使用者自己的鉤子 hook 函式。這個鉤子函式就叫中介軟體,中介軟體適合處理一些公共的業務邏輯,比如登入認證 許可權校驗 資料分頁 記錄日誌 耗時統計等 定義中介軟體 gin中的中介軟體必須是乙個gin.handlerfunc型別 入門案例 定義乙個中介軟...