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

这篇具有很好参考价值的文章主要介绍了GoZero微服务个人探究之路(七)添加中间件、自定义中间件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说在前面

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

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

开启方式可以看官方文档

中间件 | 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

GoZero微服务个人探究之路(七)添加中间件、自定义中间件,微服务,中间件,架构,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())文章来源地址https://www.toymoban.com/news/detail-811845.html

到了这里,关于GoZero微服务个人探究之路(七)添加中间件、自定义中间件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GoZero微服务微服务个人探究之路(五)部署微服务到k8s的一种最佳实践

    在每个微服务下面新建一个Dockerfile文件 根据Dockerfile文件使用docker build指令,打包为具体的镜像 (根据自己需求选择)将docker镜像上传到私人docker仓库或者是公共仓库,如果没有上传,则自动保存在本地 编写用于部署k8s的yaml文件--服务service,节点--pod 根据yaml文件,使用ku

    2024年01月18日
    浏览(38)
  • [架构之路-239]:目标系统 - 纵向分层 - 中间件middleware

    目录 前言: 一、中间件概述 1.1 中间件在软件层次中的位置 1.2 什么是中间件 1.3 为什么需要中间件 1.4 中间件应用场合(应用程序不用的底层需求:计算、存储、通信) 1.5 中间件分类 - 按内容分 二、嵌入式系统的中间件 2.1 概述 2.2 案例 三、分布式系统的中间件 3.1 概述

    2024年02月07日
    浏览(66)
  • GoZero微服务个人探究(四)启动rpc微服务报错panic: context deadline exceeded

    这里的原因有很多: 网络不好,etcd服务没有起起来,如果etcd开起了tls加密,微服务没有配置证书等原因 主要讲的是为微服务配置好认证证书,因为其他两个容易解决 在对应服务的xxx.yaml内,补充etcd认证文件相关内容 参考来源:Go-Zero官方文档

    2024年01月16日
    浏览(87)
  • 【从零开始的rust web开发之路 二】axum中间件和共享状态使用

    第一章 axum学习使用 第二章 axum中间件使用 上篇文件讲了路由和参数相应相关的。axum还有个关键的地方是中间件的使用,这篇文件就来说说。 这个概念跟gin框架的中间件概念一样,类似于springboot项目当中的请求过滤器,在请求过来的时候链式执行一些操作。例如鉴权,日志

    2024年02月11日
    浏览(50)
  • 微服务中间件--微服务保护

    雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩 解决雪崩问题的常见方式有四种: 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待 舱壁模式:限定每个业务能使用的线程数,避免耗尽

    2024年02月12日
    浏览(51)
  • 服务器中间件

    一、tomcat tomcat(全称为Apache Tomcat)是一个开源的Java Web应用服务器,它实现了Java Servlet、JavaServer Pages(JSP)和Java WebSocket等JavaEE规范,提供了一个运行Java Web应用的容器。Tomcat由Apache软件基金会开发和维护,是一个非常流行的Web应用服务器。 Tomcat的主要特点包括: Servlet容器

    2024年02月10日
    浏览(46)
  • 微服务中间件--Nacos

    Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。 在bin目录下windows命令: 执行后的效果如图: 1.在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖 父工程: 客户端: 2.注释掉order-service和user-service中原有的eureka依赖。

    2024年02月11日
    浏览(49)
  • 微服务中间件--多级缓存

    传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时,会对数据库产生冲击 多级缓存方案 多级缓存就是充分利用请求处理的每个环节,分别

    2024年02月11日
    浏览(51)
  • 微服务中间件--MQ

    同步调用的问题 微服务间基于Feign的调用就属于同步方式,存在一些问题。 耦合度高:每次加入新的需求,都要修改原来的代码 性能下降:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和。 资源浪费:调用链中的每个服务在等待响应过

    2024年02月11日
    浏览(52)
  • 微服务中间件--MQ服务异步通信

    MQ的一些常见问题 消息可靠性问题 消息从发送,到消费者接收,会经历多个过程: 其中的每一步都可能导致消息丢失,常见的丢失原因包括: 发送时丢失: 生产者发送的消息未送达exchange 消息到达exchange后未到达queue MQ宕机,queue将消息丢失 consumer接收到消息后未消费就宕机

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包