首页 > 其他分享 >go-zero 自定义中间件的几种方式

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

时间:2024-07-30 18:18:19浏览次数:16  
标签:http 自定义 middleware 中间件 server zero api go

目录
首先 go-zero 已经为我们提供了很多的中间件的实现,但有时难免有需求需要自定义,这里介绍几种自定义的方法,供参考。

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

定义 api

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

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

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
	}
}

另外也看下 路由注册部分 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),
	)
}

完成以上部分,一个自定义的中间件就算完成了。

2.在 server 启动前完成 中间件 的注册

用这种方法添加自定义的中间件就更简单了,你只需要在 internal/middleware/xxxMiddleware.go 定义自己的中间件,然后注册到 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")

	}
}

注册到 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))  // 添加控制台输出

	// register middleware in global scope
	server.Use(middleware.LogMiddleware)

	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
	server.Start()
}

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

标签:http,自定义,middleware,中间件,server,zero,api,go
From: https://www.cnblogs.com/davis12/p/18333100

相关文章

  • Java使用EasyExcel自定义合并(横纵合并)、自定义行高列宽、自适应行高列宽工具Excel导出
    目录一、自适应行高列宽工具类1、自适应行高2、自适应列宽二、自定义行高列宽工具类1、自定义行高2、自定义列宽三、自定义合并工具类四、自定义样式五、实现Excel的完整代码最近又开始写Excel导出的业务,之前写的自适应行高列宽工具类并不满足现下的需求需求是导出......
  • javaweb面向切面aop编程-实现自定义填充
    实现自定义填充注解@AutoFill创建annotation包,编写注解类点击查看代码/***自定义注解,用于标识某个方法需要进行功能字段自动填充处理*/@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceAutoFill{//数据库操作类型:UPDATEINSE......
  • Docker中使用自定义网络方式实现Redis集群部署与测试流程
    场景Docker中Docker网络-理解Docker0与自定义网络的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140788458参考上面的流程实现自定义网络的实现。下面记录其应用实例,使用Docker的自定义网络实现redis集群部署。注:博客:https://blog.csdn.net/badao_......
  • 小程序如何使用 自定义图标库
    在微信小程序中使用自定义图标库,通常是指使用像阿里巴巴矢量图标库(IconFont)这样的服务。以下是使用自定义图标库的步骤:    优点放大缩小不会失真 可以随意修改颜色        缺点色彩单一只可以设置一个颜色1.注册并选择图标        访问阿里......
  • go-zero 微服务框架如何将日志输出到文件
    在go-zero中,默认日志是输出到控制台的,项目运行起来后,往往都是输出到日志,今天看看go-zero框架的API功能的日志配置。目前网上关于go-zero的配置相对少,找了一圈,没找到更多的资料或者案例,而且官方给的doc又是一笔带过,不多说,下面看看吧。我们直接给出对应的配置:userapi.......
  • Python 缓存工具统计并使用自定义密钥
    我正在寻找一种方法来使用python的cachetools内置缓存库功能,但也支持命中/未命中统计,使用自定义键函数,并且如果可能的话支持无界缓存?不幸的是,我可以只能找到这些方法:如果我想使用未绑定的缓存,并有命中/未命中统计:fromcachetools.funcimportlru_cache......
  • Docker中Docker网络-理解Docker0与自定义网络的使用示例
    场景CentOS7中Docker的安装与配置:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119028701在上面安装好Docker之后。关于对Docker中默认docker0以及自定义网络的使用进行学习。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现理解docker0docker是......
  • 创建中间件后是否可以更新 FastAPI/Starlette SessionMiddleware 中的 max_age ?
    我需要限制某些用户的会话生命周期。问题是,max_age是在创建中间件时设置的,之后似乎无法更新。从中间件代码来看,似乎唯一的解决方案是创建一个具有所需的自定义中间件功能。有更好的解决方案吗?你说的没错,FastAPI/Starlette的SessionMiddleware在创建后不能直接......
  • 如何修复我的 Python Azure Function DevOps Pipeline 上的“找到 1 个函数(自定义)加载
    我正在尝试使用AzureDevOps构建管道将PythonAzureFunction部署到Azure门户。由于某种原因,代码被部署到服务器,但我在尝试访问端点时收到404错误。我收到一个错误,显示1functionsfound(Custom)0functionsloaded,以及在服务器上显示ModuleNotFound......
  • el-slider实现滚动条自定义分段颜色
    <template><el-sliderref="sliderRef"class="!w-80%"style="--el-slider-runway-bg-color:red;--el-slider-main-bg-color:green"v-model="speedRange"range:min="0":s......