go-zero自定義中間件的幾種方式
1.通過 api 文件生成并填入具體邏輯
定義 api
首先你需要在 api 文件中定義你需要的路由位置和中間件的名字:
// test for ping @server ( timeout: 3s middleware: PingMiddleware // 自定義的中間件 ) service userapi-api { @handler Ping get /ping returns (Reply) }
生成對應的模板
接下來通過 goctl 生成對應的模板: goctl api go --api xxx.api --dir .
填充中間件邏輯
然后通過代碼生成,goctl 會在 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 } }
另外也看下 路由注冊部分 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), ) }
完成以上部分,一個自定義的中間件就算完成了。
2.在 server 啟動前完成 中間件 的注冊
用這種方法添加自定義的中間件就更簡單了,你只需要在 internal/middleware/xxxMiddleware.go
定義自己的中間件,然后注冊到 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") } }
注冊到 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)) // 添加控制臺輸出 // register middleware in global scope server.Use(middleware.LogMiddleware) fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port) server.Start() }
以上就是兩種自定義中間件的添加方法,希望對你有用。
到此這篇關于go-zero自定義中間件的幾種方式的文章就介紹到這了,更多相關go-zero自定義中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang如何使用gomobile進行Android開發(fā)
golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關于golang如何使用gomobile進行Android開發(fā)的相關資料,需要的朋友可以參考下2023-01-01Go語言sync.Map實現(xiàn)高并發(fā)場景下的安全映射
當我們面對高并發(fā)場景時,使用普通的map類型會遇到棘手的并發(fā)安全問題,下面就來介紹一下Go語言sync.Map實現(xiàn)高并發(fā)場景下的安全映射,具有一定的參考價值,感興趣的可以了解一下2025-05-05深入了解Go的interface{}底層原理實現(xiàn)
本文主要介紹了Go的interface{}底層原理實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06Go語言基于viper實現(xiàn)apollo多實例快速
viper是適用于go應用程序的配置解決方案,這款配置管理神器,支持多種類型、開箱即用、極易上手。本文主要介紹了如何基于viper實現(xiàn)apollo多實例快速接入,感興趣的可以了解一下2023-01-01