我们只需要写几行 .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(被忽略匹配)。那么问题来了:从这两组匹配结果到用户最终看到的报告,中间还发生了什么?
Grype 源码分析 10:如何计算漏洞优先级
拿到匹配结果只是"发现漏洞"的终点,"修复漏洞"的起点在哪里?想象这样一个场景:一次扫描产生了 200 条漏洞匹配,其中既有 Critical 级别的远程代码执行漏洞,也有 Low 级别的本地拒绝服务漏洞。安全工程师面临一个现实问题——应该先修哪一个?
Grype 源码分析 09:软件版本比较为什么如此复杂
前面的文章中,我们分析了 Grype 如何加载漏洞数据库、匹配框架如何运转、以及不同生态系统如何实施各自的匹配策略。但在整个漏洞匹配链路中,有一个环节被我们反复提及却一直未被展开讨论——版本比较。Grype 需要为 14 种以上的软件包格式分别提供正确的版本比较逻辑,而每一套逻辑背后都对应着一个生态的历史积累、社区约定和技术规范。
Grype 源码分析 08:不同软件生态的漏洞匹配策略
在上一篇文章中,我们分析了 Grype Matcher 匹配框架的整体架构:三条搜索路径(语言生态、发行版、CPE)、Criteria 查询条件体系、result.Set 中间结果容器,以及跨 Matcher 的 IgnoreFilter 去重机制。但上一篇文章重点在"框架如何运转",并没有深入回答一个更具体的问题:为什么 apk、deb、rpm、npm、Go 这些不同生态不能共用一种匹配规则?
Grype 源码分析 07:Matcher 匹配框架
在上一篇文章中,我们详细分析了 Grype 漏洞数据库 v6 的实现原理——它如何下载、存储和查询漏洞数据。数据库提供了 vulnerability.Provider 接口,Matcher 通过这个接口查询候选漏洞记录。但是,一个关键问题还没有回答:拿到一批软件包后,Grype 如何为每个包选择正确的 Matcher?每个 Matcher 又如何构造查询条件、执行搜索、过滤结果,并最终生成 Match 对象?
Grype 源码分析 06:漏洞数据库实现原理
在上一篇文章中,我们分析了 Package、Vulnerability 和 Match 三个核心类型,其中 Vulnerability 对象是在漏洞数据库中查询得到的,查询接口由 vulnerability.Provider 定义。但是,这个 Provider 背后是什么?漏洞数据库从哪里来、如何存储、又是如何被高效查询的?这正是本文要回答的问题。