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自定义中间件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论