当前位置: 代码网 > it编程>前端脚本>Golang > go-zero自定义中间件的几种方式

go-zero自定义中间件的几种方式

2024年09月06日 Golang 我要评论
1.通过 api 文件生成并填入具体逻辑定义 api首先你需要在 api 文件中定义你需要的路由位置和中间件的名字:// test for ping@server (timeout: 3smid

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

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com