广告位联系
返回顶部
分享到

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

Golang 来源:互联网 作者:佚名 发布时间:2024-07-31 21:23:49 人浏览
摘要

1.通过 api 文件生成并填入具体逻辑 定义 api 首先你需要在 api 文件中定义你需要的路由位置和中间件的名字: 1 2 3 4 5 6 7 8 9 // test for ping @server ( timeout: 3s middleware: PingMiddleware // 自定义的中间件

1.通过 api 文件生成并填入具体逻辑

定义 api

首先你需要在 api 文件中定义你需要的路由位置和中间件的名字:

1

2

3

4

5

6

7

8

9

// 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 就在里面,然后填充 中间件逻辑:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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 中填充你的中间件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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 是否加入中间件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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 中即可。

定义中间件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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 中

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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

}

以上就是两种自定义中间件的添加方法,希望对你有用。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 使用Go语言实现基于泛型的Jaccard相似度算法

    使用Go语言实现基于泛型的Jaccard相似度算法
    基本原理 跳表: jaccard相似度: jaccard相似度的代码实现: 时间复杂度分析: 快速jaccard算法: 代码实现,这个要求两个集合都是有序的:
  • go-zero自定义中间件的几种方式
    1.通过 api 文件生成并填入具体逻辑 定义 api 首先你需要在 api 文件中定义你需要的路由位置和中间件的名字: 1 2 3 4 5 6 7 8 9 // test for ping @
  • Go中gin框架的*gin.Context参数常见实用方法
    梗概: *gin.Context是处理HTTP请求的核心。ctx代表context(上下文),它包含了处理请求所需的所有信息和方法,例如请求数据、响应构建器、
  • Python实现图像添加水印的方法
    在日常图像处理中,为图片添加水印是一项常见任务。有多种方法和工具可供选择,而今天我们将专注于使用Python语言结合PIL库批量添加水
  • go的defer和return的执行顺序介绍
    go的defer和return的执行顺序 go的defer和return是golang中的两个关键字,return用于返回函数的返回值,也可以参与一定的流程控制,比如下面代码
  • 使用go语言实现Redis持久化的代码
    redis是一个内存数据库,如果你把进程杀掉,那么里面存储的数据都会消失,那么这篇文章就是来解决redis持久化的问题 我们在redis.conf文件
  • Go中的Timer和Ticker介绍
    一:简介 在日常开发中,我们可能会遇到需要延迟执行或周期性地执行一些任务。这个时候就需要用到Go语言中的定时器。 在Go语言中,定
  • Golang在gin框架中使用JWT鉴权
    什么是JWT JWT,全称 JSON Web Token,是一种开放标准(RFC 7519),用于安全地在双方之间传递信息。尤其适用于身份验证和授权场景。JWT 的设计
  • Golang使用Redis与连接池方式
    Golang使用Redis与连接池 使用下载go的redis包go get github.com/gomodule/redigo/redis 如果网不好的话就很费劲了 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2
  • Golang使用embed引入静态文件的代码
    Go 语言从 1.16 版本开始引入了一个新的标准库embed,可以在二进制文件中引入静态文件 指令:/go:embed 通过一个简单的小实例,来演示将静态
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计