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

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

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

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如何使用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)景下的安全映射

    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)

    本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go語(yǔ)言學(xué)習(xí)筆記之反射用法詳解

    Go語(yǔ)言學(xué)習(xí)筆記之反射用法詳解

    這篇文章主要介紹了Go語(yǔ)言學(xué)習(xí)筆記之反射用法,詳細(xì)分析了Go語(yǔ)言中反射的概念、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • Go語(yǔ)言基于viper實(shí)現(xiàn)apollo多實(shí)例快速

    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語(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)題

    詳解在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
  • GoLang?channel底層代碼分析詳解

    GoLang?channel底層代碼分析詳解

    Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過(guò)與select,cancel,timer等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來(lái),我們就要梳理一下GoLang?channel底層代碼實(shí)現(xiàn)
    2022-10-10
  • 重學(xué)Go語(yǔ)言之如何開發(fā)RPC應(yīng)用

    重學(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ú)人提起)

    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

最新評(píng)論