最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

  • go中的protobuf和grpc使用教程

    go中的protobuf和grpc使用教程

    gRPC 是 Google 公司基于 Protobuf 開發(fā)的跨語言的開源 RPC 框架,這篇文章主要介紹了go中的protobuf和grpc使用教程,需要的朋友可以參考下
    2024-08-08
  • Golang?Template實(shí)現(xiàn)自定義函數(shù)的操作指南

    Golang?Template實(shí)現(xiàn)自定義函數(shù)的操作指南

    這篇文章主要為大家詳細(xì)介紹了Golang如何利用Template實(shí)現(xiàn)自定義函數(shù)的操作,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Go語言特點(diǎn)及基本數(shù)據(jù)類型使用詳解

    Go語言特點(diǎn)及基本數(shù)據(jù)類型使用詳解

    這篇文章主要為大家介紹了Go語言特點(diǎn)及基本數(shù)據(jù)類型使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Go語言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫詳解

    Go語言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫詳解

    這篇文章主要為大家介紹了Go語言實(shí)現(xiàn)的可讀性更高的并發(fā)神庫詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Golang并發(fā)編程之GMP模型詳解

    Golang并發(fā)編程之GMP模型詳解

    傳統(tǒng)的并發(fā)編程模型是基于線程和共享內(nèi)存的同步訪問控制的,共享數(shù)據(jù)受鎖的保護(hù),線程將爭(zhēng)奪這些鎖以訪問數(shù)據(jù)。本文將介紹Go并發(fā)編程中的GMP模型,感興趣的可以了解一下
    2023-03-03
  • Go語言微服務(wù)中實(shí)現(xiàn)鏈路追蹤

    Go語言微服務(wù)中實(shí)現(xiàn)鏈路追蹤

    在微服務(wù)架構(gòu)中,鏈路追蹤技術(shù)可以幫助我們跟蹤請(qǐng)求在各個(gè)服務(wù)之間的傳播路徑,本文就來介紹一下Go語言微服務(wù)中實(shí)現(xiàn)鏈路追蹤,感興趣的可以了解一下
    2024-12-12
  • go Gin安裝及初始化操作示例

    go Gin安裝及初始化操作示例

    這篇文章主要介紹了gin安裝及初始化,修改啟動(dòng)端口,get/post?請(qǐng)求參數(shù),模型綁定shouldbind,自定義驗(yàn)證器/表單驗(yàn)證,等操作步驟,有需要的朋友可以借鑒參考下
    2022-04-04
  • Golang內(nèi)存分配機(jī)制詳解

    Golang內(nèi)存分配機(jī)制詳解

    Go 語言的內(nèi)存分配機(jī)制是理解和優(yōu)化 Go 程序性能的關(guān)鍵,在 Go 中,內(nèi)存管理是自動(dòng)進(jìn)行的,這得益于 Go 的垃圾回收機(jī)制,了解內(nèi)存如何分配和回收,可以幫助我們寫出更高性能的代碼,本文將深入講解下 Go 內(nèi)存分配機(jī)制,需要的朋友可以參考下
    2023-12-12
  • Golang中slice切片的實(shí)現(xiàn)示例

    Golang中slice切片的實(shí)現(xiàn)示例

    Go語言中,切片是對(duì)數(shù)組的抽象,提供了更靈活的動(dòng)態(tài)數(shù)組解決方案,本文就來介紹一下Golang中slice切片的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-09-09
  • Go語言用Gin實(shí)現(xiàn)圖書管理接口的實(shí)現(xiàn)示例

    Go語言用Gin實(shí)現(xiàn)圖書管理接口的實(shí)現(xiàn)示例

    本文主要介紹了Go語言用Gin實(shí)現(xiàn)圖書管理接口的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-08-08

最新評(píng)論

满洲里市| 涞水县| 双牌县| 孟连| 宣汉县| 枞阳县| 沅陵县| 五台县| 肥东县| 佛学| 应城市| 泽库县| 岐山县| 剑阁县| 沧州市| 南皮县| 景泰县| 宜黄县| 剑阁县| 寻甸| 旌德县| 平山县| 丰台区| 明水县| 宁陕县| 南开区| 泽库县| 丰台区| 宜都市| 广灵县| 浦江县| 红原县| 鸡东县| 民勤县| 鸡西市| 昭平县| 吴桥县| 保靖县| 焉耆| 嘉峪关市| 禹州市|