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

说在前面

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

开启方式可以看官方文档

中间件 | go-zero Documentation

实现自定义的中间件

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

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

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

方案一 官方文档方案

Go 复制代码
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列表


先定义中间件结构体

Go 复制代码
type CheckUrlMiddleware struct {
    Redis *redis.Redis
}

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

再定一个构造函数

Go 复制代码
func NewCheckUrlMiddleware(Redis *redis.Redis) *CheckUrlMiddleware {
    return &CheckUrlMiddleware{Redis: Redis}
}

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

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

Go 复制代码
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())

相关推荐
苹果酱056710 分钟前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
Casual_Lei36 分钟前
ClickHouse 的底层架构和原理
clickhouse·架构
bug菌¹1 小时前
滚雪球学SpringCloud[4.1讲]: Spring Cloud Gateway详解
java·spring cloud·微服务
小筱在线3 小时前
SpringCloud微服务实现服务熔断的实践指南
java·spring cloud·微服务
cooldream20094 小时前
828华为云征文 | 在华为云X实例上部署微服务架构的文物大数据管理平台的实践
微服务·架构·华为云·文物大数据平台
super_journey5 小时前
RabbitMq中交换机(Exchange)、队列(Queue)和路由键(Routing Key)
分布式·中间件·rabbitmq
码拉松5 小时前
千万不要错过,优惠券设计与思考初探
后端·面试·架构
小筱在线6 小时前
使用SpringCloud构建可伸缩的微服务架构
spring cloud·微服务·架构
zheeez6 小时前
微服务注册中⼼2
java·微服务·nacos·架构
灰色孤星A7 小时前
分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
分布式·微服务·架构·seata·分布式事务·tc服务器·微服务集成seata