我们完整走完了 REST 服务的全部链路——从 goctl 生成代码、配置加载与服务启动,到路由匹配、参数解析、响应写入,再到 11 个中间件的协同配合。现在把视角转到微服务架构的另一端:RPC。
go-zero 源码分析 07:REST 中间件链
中间件是 go-zero REST 框架中最容易 凭感觉使用 却最难 准确理解 的部分。它的本质不难——每个中间件都是一个 func(http.Handler) http.Handler,层层包裹业务逻辑。本文从 chain.Chain 的不可变链表机制出发,依次分析每个默认中间件的职责和位置原因,再展开 JWT 认证、签名校验、CORS、SSE 和文件服务这些 附加能力 如何挂载到主链之上。文中会用成功、超时、panic、未认证四种典型请求贯穿讲解,帮你建立"请求穿过中间件链"的肌肉记忆。
go-zero 源码分析 06:REST 核心链路
这篇文章将分析一个 HTTP 请求到底是怎么到达你写的业务 logic 的?以 rest.MustNewServer 为入口,沿着"创建 → 注册 → 启动 → 路由匹配 → 参数解析 → 响应写入"这条主线,把 REST 核心链路的每个环节讲清楚。中间件链的细节(每条中间件的实现原理和顺序设计理由)会留到下一篇专门展开。
go-zero 源码分析 05:配置加载、服务启动与优雅退出
前几篇文章中,我们通过 goctl 生成了完整的 REST 和 RPC 工程。这些工程都有一个共同的入口——main 函数,而这些 main 函数的核心逻辑就是实现 配置加载、服务启动 和 优雅退出。这篇文章我们将聚焦这部分逻辑的实现。
go-zero 源码分析 04:RPC、Model 与部署生成
在上一篇文章中,我们把 goctl 最核心的能力——从 .api 到 REST 工程的解析与代码生成——完整地走了一遍。但一个生产级的微服务系统远不止 REST 接口。你还需要:
- RPC 服务:内部服务间的通信不走 HTTP,而是走 gRPC——接口用 protobuf 定义,生成类型安全的客户端和服务端桩代码。
- 数据访问层:业务逻辑最终要读写数据库。表结构定义好了,对应的 model 代码怎么来?缓存怎么自动集成?
- 部署描述文件:服务写好了,Dockerfile 怎么生成?Kubernetes 的 Deployment、Service、HPA 清单怎么来?Gateway 的骨架怎么搭?
go-zero 源码分析 03:goctl 的解析与代码生成
我们只需要写几行 .api 定义,goctl 就为你生成了 handlers、logic、routes、types、config 等一系列 Go 文件。这些文件不是在运行时通过反射动态注册的,而是编译前就已经确定好了的、类型安全的 Go 代码。这个"跳跃"的背后,是 goctl 最核心的能力:把一份声明式的 API 定义语言(DSL),解析为结构化的中间表示(IR),再通过模板引擎渲染为可编译的 Go 工程代码。
go-zero 源码分析 02:整体架构与源码地图
这篇文章我们会从仓库顶层结构出发,逐步拆解到四层架构,然后用 REST 和 RPC 两条主调用链示范 请求到底穿过了哪些层,最后归纳出贯穿整个项目的几种设计模式。读完这篇文章后,你对后续任何一篇文章中涉及的模块,都能快速定位到它在整体架构中的位置。
go-zero 源码分析 01:go-zero 是什么
在日常的后端开发里,无论是刚开始写一个新的微服务,还是在已有系统上增加接口,我们都要面对一连串 通用但琐碎 的事情:启动配置、参数校验、错误处理、日志、超时、限流、熔断、服务注册与发现、链路追踪。go-zero 的定位是一个集成了各种工程实践的 Web 和 RPC 框架,它把这些通用能力下沉到框架层面,让开发者把精力集中在业务逻辑上。
Grype 源码分析 12:整体总结 Grype 项目
我们已经整体分析了 Grype 的源码实现原理。作为 Go 语言编写的安全工具,Grype 不仅在功能上十分强大,其工程设计和开源维护实践也非常值得学习。本文将从源码目录结构、框架设计、测试策略、CI/CD 流程等多个维度全面总结分析这个项目。
Grype 源码分析 11:结果过滤、VEX 与报告输出
我们已经沿着 Grype 的扫描链路,我们从 main() 一路跟踪到了漏洞匹配和风险评分。当 VulnerabilityMatcher.FindMatchesContext() 执行完毕,返回了 remainingMatches(有效匹配)和 ignoredMatches(被忽略匹配)。那么问题来了:从这两组匹配结果到用户最终看到的报告,中间还发生了什么?