Golang
主页 > 脚本 > Golang >

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

2024-07-31 | 佚名 | 点击:

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

}

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

原文链接:
相关文章
最新更新