go-zero自定義中間件的幾種方式
1.通過(guò) api 文件生成并填入具體邏輯
定義 api
首先你需要在 api 文件中定義你需要的路由位置和中間件的名字:
// test for ping
@server (
timeout: 3s
middleware: PingMiddleware // 自定義的中間件
)
service userapi-api {
@handler Ping
get /ping returns (Reply)
}
生成對(duì)應(yīng)的模板
接下來(lái)通過(guò) goctl 生成對(duì)應(yīng)的模板: goctl api go --api xxx.api --dir .
填充中間件邏輯
然后通過(guò)代碼生成,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)文章
golang如何使用gomobile進(jìn)行Android開發(fā)
golang可以開發(fā)android,使用golang開發(fā)android需要下載安裝gomobile,下面這篇文章主要給大家介紹了關(guān)于golang如何使用gomobile進(jìn)行Android開發(fā)的相關(guān)資料,需要的朋友可以參考下2023-01-01
Go語(yǔ)言sync.Map實(shí)現(xiàn)高并發(fā)場(chǎng)景下的安全映射
當(dāng)我們面對(duì)高并發(fā)場(chǎng)景時(shí),使用普通的map類型會(huì)遇到棘手的并發(fā)安全問(wèn)題,下面就來(lái)介紹一下Go語(yǔ)言sync.Map實(shí)現(xiàn)高并發(fā)場(chǎng)景下的安全映射,具有一定的參考價(jià)值,感興趣的可以了解一下2025-05-05
深入了解Go的interface{}底層原理實(shí)現(xiàn)
本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Go語(yǔ)言基于viper實(shí)現(xiàn)apollo多實(shí)例快速
viper是適用于go應(yīng)用程序的配置解決方案,這款配置管理神器,支持多種類型、開箱即用、極易上手。本文主要介紹了如何基于viper實(shí)現(xiàn)apollo多實(shí)例快速接入,感興趣的可以了解一下2023-01-01
Go語(yǔ)言如何實(shí)現(xiàn)TCP通信詳解
go里面實(shí)現(xiàn)tcp沒(méi)有像之前寫的C++那些那么麻煩,在C++里面要先創(chuàng)建套接字,然后綁定ip地址,go里面直接就一個(gè)函數(shù)建立套接字,然后在進(jìn)行通信就可以了,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言如何實(shí)現(xiàn)TCP通信的相關(guān)資料,需要的朋友可以參考下2023-01-01
詳解在Go語(yǔ)言單元測(cè)試中如何解決文件依賴問(wèn)題
現(xiàn)如今的?Web?應(yīng)用程序往往采用?RESTful?API?接口形式對(duì)外提供服務(wù),后端接口直接向前端返回?HTML?文件的情況越來(lái)越少,所以在程序中操作文件的場(chǎng)景也變少了,在編寫單元測(cè)試時(shí),文件就成了被測(cè)試代碼的外部依賴,本文就來(lái)講解下測(cè)試過(guò)程中如何解決文件外部依賴問(wèn)題2023-08-08
重學(xué)Go語(yǔ)言之如何開發(fā)RPC應(yīng)用
這篇文章主要為大家詳細(xì)介紹了在Go語(yǔ)言中如何構(gòu)建RPC應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09
golang限流庫(kù)兩個(gè)大bug(半年之久無(wú)人提起)
最近我的同事在使用uber-go/ratelimit[1]這個(gè)限流庫(kù)的時(shí)候,遇到了兩個(gè)大?bug,這兩個(gè)?bug?都是在這個(gè)庫(kù)的最新版本(v0.3.0)中存在的,而這個(gè)版本從?7?月初發(fā)布都已經(jīng)過(guò)半年了,都沒(méi)人提?bug,難道大家都沒(méi)遇到過(guò)么2023-12-12

