【Go电商实战05】结合商业项目讲解中间件的概念和应用

简介: 把Go语言中的知识点结合商业项目,理论联系实践,更好的学习理解,高效学,少踩坑。

本期重点

用到的知识点包括:

  • 中间件的概念和应用
  • GoFrame中间件/拦截器的基本介绍
  • GoFrame中间件/拦截器的使用示例
  • 结合商业项目,视频答疑读者使用中遇到的问题

什么是中间件?

在服务端开发中,“中间件”是大家一定会听到的名词。

初学者听起来觉得很高大上,觉得很难,其实“中间件”并不难,对我们学习Go语言来说,使用中间件也没有太多心智挑战。

“中间件”它并没有很严格的定义,但是普遍接受IDC的定义:中间件是一种独立的系统软件服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。

比如:

  1. 我们今天要重点介绍的“GoFrame网络请求控制中间件”是中间件的一种,它是基于GoFrame框架内部的一种中间件,也是我们这期内容的重点。
  2. 在我们WEB开发过程中,像常用的MySQL、Redis、RabbitMQ在系统架构角度也被称为中间件。

从基础架构、系统架构、程序架构等不同的观点来看,中间件的概念是不一样的。我们也不用过于纠结于这个名词的具体解释。

毕竟结合自己的需求,掌握如何使用中间件,远比只搞清楚中间件的解释要有意义的多。

更多介绍大家可以查看:中间件-计算机用语--百度百科,不作为我这期内容的重点。

GoFrame中间件/拦截器-基本介绍

GoFrame提供了优雅的中间件请求控制方式,该方式也是主流的WebServer提供的请求流程控制方式,基于中间件设计可以为WebServer提供更灵活强大的插件机制。

经典的中间件洋葱模型:

image.png

中间件定义

中间件的定义和普通HTTP执行方法HandlerFunc一样,但是可以在Request参数中使用Middleware属性对象来控制请求流程。

我们拿一个跨域请求的中间件定义来示例说明一下:

func MiddlewareCORS(r *ghttp.Request) {
  r.Response.CORSDefault()
  r.Middleware.Next()
}

可以看到在该中间件中执行完成跨域请求处理的逻辑后,使用r.Middleware.Next()方法进一步执行下一个流程;如果这个时候直接退出不调用r.Middleware.Next()方法的话,将会退出后续的执行流程(例如可以用于请求的鉴权处理)。

中间件类型

中间件的类型分为两种:前置中间件和后置中间件。前置即在路由服务函数调用之前调用,后置即在其后调用。

前置中间件

其定义类似于:

func Middleware(r *ghttp.Request) {
  // 中间件处理逻辑
  r.Middleware.Next()
}

后置中间件

其定义类似于:

func Middleware(r *ghttp.Request) {
  r.Middleware.Next()
  // 中间件处理逻辑
}

按照中间件注册方式划分,又可分为:全局中间件、分组路由中间件。

全局中间件

func (s *Server) Use(handlers ...HandlerFunc)

全局中间件是可以独立使用的请求拦截方法,通过路由规则的方式进行注册,绑定到Server上,由于中间件需要执行请求拦截操作,因此往往是使用"模糊匹配"或者"命名匹配"规则。

全局中间件仅对动态请求拦截有效,无法拦截静态文件请求。

分组路由中间件

func (g *RouterGroup) Middleware(handlers ...HandlerFunc) *RouterGroup

分组路由中注册的中间件绑定到当前分组路由中的所有的服务请求上,当服务请求被执行前会调用到其绑定的中间件方法。

分组路由仅有一个Middleware的中间件注册方法。分组路由中间件与全局中间件不同之处在于,分组路由中间件无法独立使用,必须在分组路由注册中使用,并且绑定到当前分组路由中所有的路由上作为路由方法的一部分。

执行优先级

全局中间件

由于全局中间件也是通过路由规则执行,那么也会存在执行优先级:

  1. 首先,由于全局中间件是基于模糊路由匹配,因此当同一个路由匹配到多个中间件时,会按照路由的深度优先规则执行,具体请查看路由章节;
  2. 其次,同一个路由规则下,会按照中间件的注册先后顺序执行,中间件的注册方法也支持同时按照先后顺序注册多个中间件;
  3. 最后,为避免优先级混淆和后续管理,建议将所有中间件放到同一个地方进行先后顺序注册来控制执行优先级;

这里的建议来参考于gRPC的拦截器设计,没有过多的路由控制,仅在一个地方同一个方法统一注册。往往越简单,越容易理解,也便于长期维护。

分组路由中间件

分组路由中间件是绑定到分组路由上的服务方法,不存在路由规则匹配,因此只会按照注册的先后顺序执行。

示例

官方文档为我们提供了比较详细的示例,包括:

  1. 允许跨域请求
  2. 请求鉴权处理
  3. 鉴权例外处理
  4. 统一的错误处理
  5. 自定义日志处理

大家感兴趣可以直接查看:官方示例文档,不作为我这期内容的重点。

初学者必看

有基础的朋友看了这篇文章基本就搞清楚了,初学Go的朋友如果还有不懂的地方,欢迎观看我的视频:我的视频结合了「电商实战」项目,回答了读者在使用GoFrame开发过程中的疑问:

  1. 用到的知识点就包括前文重点提到的“GoFrame中间件”
  2. “api层结构体中定义接口URL和请求方式是如何与controller层中的方法关联上的呢?”
  3. “为什么cmd中路由绑定只是绑定到controller层对象这一层就可以?”


公众号:程序员升职加薪之旅

微信号:wangzhongyang1993

B站视频:王中阳Go

相关文章
|
2月前
|
人工智能 安全 中间件
阿里云 AI 中间件重磅发布,打通 AI 应用落地“最后一公里”
9 月 26 日,2025 云栖大会 AI 中间件:AI 时代的中间件技术演进与创新实践论坛上,阿里云智能集团资深技术专家林清山发表主题演讲《未来已来:下一代 AI 中间件重磅发布,解锁 AI 应用架构新范式》,重磅发布阿里云 AI 中间件,提供面向分布式多 Agent 架构的基座,包括:AgentScope-Java(兼容 Spring AI Alibaba 生态),AI MQ(基于Apache RocketMQ 的 AI 能力升级),AI 网关 Higress,AI 注册与配置中心 Nacos,以及覆盖模型与算力的 AI 可观测体系。
782 42
|
2月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
|
3月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
321 0
|
1月前
|
Java 编译器 Go
【Golang】(1)Go的运行流程步骤与包的概念
初次上手Go语言!先来了解它的运行流程吧! 在Go中对包的概念又有怎样不同的见解呢?
130 4
|
2月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
3月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
454 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
3月前
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
3月前
|
数据采集 Go API
Go语言实战案例:使用context控制协程取消
本文详解 Go 语言中 `context` 包的使用,通过实际案例演示如何利用 `context` 控制协程的生命周期,实现任务取消、超时控制及优雅退出,提升并发程序的稳定性与资源管理能力。
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
12052 1
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
490 3