首先你需要在 api 文件中定义你需要的路由位置和中间件的名字:
1 2 3 4 5 6 7 8 9 |
// 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 就在里面,然后填充 中间件逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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 中填充你的中间件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 是否加入中间件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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), ) } |
完成以上部分,一个自定义的中间件就算完成了。
用这种方法添加自定义的中间件就更简单了,你只需要在 internal/middleware/xxxMiddleware.go 定义自己的中间件,然后注册到 server 中即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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")
} } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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() } |
以上就是两种自定义中间件的添加方法,希望对你有用。