GoZero微服务个人探究之路(七)添加中间件、自定义中间件

2024-01-21 07:44

本文主要是介绍GoZero微服务个人探究之路(七)添加中间件、自定义中间件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说在前面

官方已经自己实现了很多中间件,我们可以方便的直接使用,不用重复造轮子了

开启方式可以看官方文档

中间件 | go-zero Documentation

实现自定义的中间件

在业务逻辑中,我们需要实现自定义功能的中间件

------这里我们以实现跨源访问的中间件(详情可见这篇文章flutter开发web应用网络请求后台失败--记录遇到的跨源资源共享问题-CSDN博客)

与我的实现不同也没关系,方式都是通的,相似的

方案一 官方文档方案

server := rest.MustNewServer(rest.RestConf{})
defer server.Stop()server.Use(middleware)// 自定义的中间件
func middleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {w.Header().Add("X-Middleware", "static-middleware")next(w, r)}
}

这里我们可以看到,官方是在启动文件里面加了server.Use(middleware)这一行,并且以函数方式实现了中间件,但这样的方式不利于低耦合,但是十分有借鉴意义

方案二 中间件写在另外的文件里

这里我们在internal包里新建一个middleware文件夹用于专门存放中间件代码,

这里我定义了一个corsmiddleware.go

中间的代码根据个人情况而定,编写符合自己逻辑的代码

之后在servicecontext.go里面,也就是生产svc context的文件里面,

  1. ServiceContext结构体内添加Cors rest.Middleware
  2. NewServiceContext函数添加corsMiddleware := middleware.CorsMiddleware

  3. return &ServiceContext的结构体内添加Cors: corsMiddleware,

最后就可以在启动文件内,调用server.Use(ctx.Cors)了,这样我们的中间件就被加上了


另外---->我们采用的是goZero的rest包的rest.Middleware

其定义为:Middleware func(next http.HandlerFunc) http.HandlerFunc

这是一个标准的中间件结构,接受一个handlerfunc,返回另外一个handlerfunc,但是涉及到更复杂的逻辑就不够用了

补充

这里我们以一个更复杂的中间件为例:

需要接受一个redis客户端实例,从redis中获取用户可以访问的url列表


先定义中间件结构体

type CheckUrlMiddleware struct {Redis *redis.Redis
}

其中包含了指向redis客户端的指针

再定一个构造函数

func NewCheckUrlMiddleware(Redis *redis.Redis) *CheckUrlMiddleware {return &CheckUrlMiddleware{Redis: Redis}
}

接收一个redis客户端实例,返回一个新的CheckUrlMiddleware实例

后构造处理函数,包含具体的逻辑

func (m *CheckUrlMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {// 中间件的逻辑}
}

符合gozero中间件的签名,接收一个handlerfunc,返回一个新的handlerfunc

之后,我们在配置svc context内容

  1. Redis *redis.Redis

  2. CheckUrl rest.Middleware


  1. CheckUrl: middleware.NewCheckUrlMiddleware(newRedis).Handle,

  2. Redis: newRedis,

之后在启动文件添加server.Use(ctx.CheckUrl)就可以了


总结

本文介绍了GoZero官方已经提供的中间件以及启用方式,同时介绍了实现自定义中间件的两种方案,本文的局限为没有讲述怎么设置哪些路由使用中间件,后续会再继续补充

额外的,如果是解决GoZero跨源访问问题,官方已经给出了方便的实现,不用自定义中间件,具体方式为在启动文件修改如下一行

server := rest.MustNewServer(c.RestConf, rest.WithCors())

这篇关于GoZero微服务个人探究之路(七)添加中间件、自定义中间件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628822

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1