go-zero自定義中間件的幾種方式
1.通過 api 文件生成并填入具體邏輯
定義 api
首先你需要在 api 文件中定義你需要的路由位置和中間件的名字:
// test for ping @server ( timeout: 3s middleware: PingMiddleware // 自定義的中間件 ) service userapi-api { @handler Ping get /ping returns (Reply) }
生成對(duì)應(yīng)的模板
接下來通過 goctl 生成對(duì)應(yīng)的模板: goctl api go --api xxx.api --dir .
填充中間件邏輯
然后通過代碼生成,goctl 會(huì)在 project/internal 下生成 middleware 文件夾,你的 pingmiddleware.go 就在里面,然后填充 中間件邏輯:
package middleware import ( "net/http" "github.com/zeromicro/go-zero/core/logx" ) type PingMiddleware struct { } func NewPingMiddleware() *PingMiddleware { return &PingMiddleware{} } // need to implement logic func (m *PingMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { logx.Info("This is pingMiddleware before logic") // 填充邏輯 // Passthrough to next handler if need next(w, r) logx.Info("This is pingMiddleware before logic") // 填充邏輯 } }
另外,你還需要在 svc/servicecontext.go
中填充你的中間件:
package svc import ( "github.com/zeromicro/go-zero/rest" "userapiv1/internal/config" "userapiv1/internal/middleware" ) type ServiceContext struct { Config config.Config PingMiddleware rest.Middleware // manual added } func NewServiceContext(c config.Config) *ServiceContext { return &ServiceContext{ Config: c, PingMiddleware: middleware.NewPingMiddleware().Handle, // manual added } }
另外也看下 路由注冊(cè)部分 handler/routers.go
是否加入中間件:
func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { server.AddRoutes( rest.WithMiddlewares( []rest.Middleware{serverCtx.PingMiddleware}, // auto added by goctl []rest.Route{ { Method: http.MethodGet, Path: "/ping", Handler: PingHandler(serverCtx), }, }..., ), rest.WithTimeout(3000*time.Millisecond), ) }
完成以上部分,一個(gè)自定義的中間件就算完成了。
2.在 server 啟動(dòng)前完成 中間件 的注冊(cè)
用這種方法添加自定義的中間件就更簡(jiǎn)單了,你只需要在 internal/middleware/xxxMiddleware.go
定義自己的中間件,然后注冊(cè)到 server 中即可。
定義中間件:
package middleware import ( "net/http" "github.com/zeromicro/go-zero/core/logx" ) func LogMiddleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { logx.Info("here is LogMiddleware handle before logic") next(w, r) logx.Info("here is LogMiddleware handle after logic") } }
注冊(cè)到 server 中
package main import ( "flag" "fmt" "userapiv1/internal/config" "userapiv1/internal/handler" "userapiv1/internal/middleware" "userapiv1/internal/svc" "github.com/zeromicro/go-zero/core/conf" "github.com/zeromicro/go-zero/rest" ) var configFile = flag.String("f", "etc/userapi-api.yaml", "the config file") func main() { flag.Parse() var c config.Config conf.MustLoad(*configFile, &c) server := rest.MustNewServer(c.RestConf) defer server.Stop() ctx := svc.NewServiceContext(c) handler.RegisterHandlers(server, ctx) // go-zero version >= v1.7.0 //logx.AddWriter(logx.NewWriter(os.Stdout)) // 添加控制臺(tái)輸出 // register middleware in global scope server.Use(middleware.LogMiddleware) fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) server.Start() }
以上就是兩種自定義中間件的添加方法,希望對(duì)你有用。
到此這篇關(guān)于go-zero自定義中間件的幾種方式的文章就介紹到這了,更多相關(guān)go-zero自定義中間件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言學(xué)習(xí)教程之goroutine和通道的示例詳解
這篇文章主要通過A?Tour?of?Go中的例子進(jìn)行學(xué)習(xí),以此了解Go語言中的goroutine和通道,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09Golang中Kafka的重復(fù)消費(fèi)和消息丟失問題的解決方案
在Kafka中無論是生產(chǎn)者發(fā)送消息到Kafka集群還是消費(fèi)者從Kafka集群中拉取消息,都是容易出現(xiàn)問題的,比較典型的就是消費(fèi)端的重復(fù)消費(fèi)問題、生產(chǎn)端和消費(fèi)端產(chǎn)生的消息丟失問題,下面將對(duì)這兩個(gè)問題出現(xiàn)的場(chǎng)景以及常見的解決方案進(jìn)行講解2023-08-08golang 實(shí)現(xiàn)struct、json、map互相轉(zhuǎn)化
這篇文章主要介紹了golang 實(shí)現(xiàn)struct、json、map互相轉(zhuǎn)化,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例
這篇文章主要為大家介紹了Go雪花算法的作用領(lǐng)域及實(shí)現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10GoLand編譯帶有構(gòu)建標(biāo)簽的程序思路詳解
這篇文章主要介紹了GoLand編譯帶有構(gòu)建標(biāo)簽的程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Go?WEB框架使用攔截器驗(yàn)證用戶登錄狀態(tài)實(shí)現(xiàn)
這篇文章主要為大家介紹了Go?WEB框架使用攔截器驗(yàn)證用戶登錄狀態(tài)實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07對(duì)Golang import 導(dǎo)入包語法詳解
今天小編就為大家分享一篇對(duì)Golang import 導(dǎo)入包語法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06