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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/418961.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread 瑞萨 智能家居网络开发:RA6M3 HMI Board 以太网+GUI技术实践

不用放大了, 我在包里找到张不小的…… 以太网HMI线下培训-环境准备 这是社群的文档:【腾讯文档】以太网线下培训(HMI-Board) https://docs.qq.com/doc/DY0FIWFVuTEpORlNn 先介绍周六的培训是啥,然后再介绍一下要准…

ios适配虚拟home键

在H5开发过程中遇到一个兼容性问题。iphone手机的虚拟home键会对屏幕底部的内容造成遮挡。要处理此问题,需要清楚安全区域这个概念。 安全区域 根据刘海和虚拟Home键,Apple为其设备提供了屏幕安全区域的视觉规范 竖屏:竖屏的时候&#xff…

无法找到mfc100.dll的解决方法分享,如何快速修复mfc100.dll文件

在日常使用电脑时,我们可能会碰到一些系统错误提示,比如“无法找到mfc100.dll”的信息。这种错误通常会阻碍代码的执行或某些应用程序的启动。为了帮助您解决这一问题,本文将深入探讨其成因,并提供几种不同的mfc100.dll解决方案。…

TCP缓存(C++)

系统为每个 socket 创建了发送缓冲区和接收缓冲区,应用程序调用 send()/write()函数发送数据的 时候,内核把数据从应用进程拷贝 socket 的发送缓冲区中;应用程序调用 recv()/read()函数接收数据的时候,内核把数据从 socket 的接收…

Navicat平替工具,一款免费开源的通用数据库工具

前言 前段时间有小伙伴在群里提问说:因为公司不允许使用破解版的Navicat,有好用的Navicat平替工具推荐吗?今天分享一款免费开源的通用数据库工具:DBeaver。 DBeaver工具介绍 DBeaver是一款免费的跨平台数据库工具,适…

负载均衡流程

1、负载均衡流程图 2、触发负载均衡函数trigger_load_balance void trigger_load_balance(struct rq *rq) { /* Dont need to rebalance while attached to NULL domain */ if (unlikely(on_null_domain(rq)))//当前调度队列中的调度域是空的则返回 return; i…

[小程序]API、数据与事件

一、API ①事件监听API 以on开头,用来监听事件的触发(如wx.inWindowResize) ②同步API 以Sync结尾,且可以通过函数返回值获取,执行错误会抛出异常(如wx.setStorageSync) ③异步API 类似网页中的…

v32.条件运算符

1.是三元运算符,需要3个操作数 条件运算符可以替换if-else语句 2. marks > 33是一个表达式,返回值是false/true;等号左边是左值,右边那部分是右值。 如果第一个表达式返回true,那么将第二个表达式返回&…

【日常聊聊】边缘计算的挑战和机遇

🍎个人博客:个人主页 🏆个人专栏: 日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 边缘计算的挑战和机遇 一:数据安全与隐私保护 二:网络稳定性与可靠性 三:实时性与性能优…

ESP32-HTTP_webServer库(Arduino)

ESP32-HTTP 介绍 ESP32是一款功能强大的微控制器,具有丰富的网络和通信功能。其中之一就是支持HTTP协议,这使得ESP32可以用于创建Web服务器。 HTTP是什么? HTTP(Hyper Text Transfer Protocol),即超文本传…

[计算机网络]基本概念

目录 1.ip地址和端口号 1.1IP地址 1.2端口号 2.认识协议 2.1概念: 2.2知名协议的默认端口 3.五元组 4.协议分层 4.1分层的作用 4.2OSI七层模型 4.3TCP/IP五层(四层)模型 ​编辑4.4网络设备对应的分层: ​编辑以下为跨…

零日漏洞:威胁与应对

一、引言 随着信息技术的迅猛发展,网络安全问题日益凸显。其中,零日漏洞已成为当今网络安全领域最受关注的问题之一。本文将深入探讨零日漏洞的威胁、产生原因以及应对策略,以期提高人们对这一问题的认识和防范意识。 二、零日漏洞的威胁 …