欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go-zero自定義中間件的幾種方式

 更新時(shí)間:2024年07月31日 08:31:29   作者:進(jìn)擊的ddd  
首先 go-zero 已經(jīng)為我們提供了很多的中間件的實(shí)現(xiàn),但有時(shí)難免有需求需要自定義,這里介紹幾種自定義的方法,文中通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下

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)文章

最新評(píng)論