🚀 发现 gone-io/gone:一个优雅的 Go 依赖注入框架!💻 它让您的代码更简洁、更易测试。🔍 框架轻量却功能强大,完美平衡了灵活性与易用性。⭐ 如果您喜欢这个项目,请给我们点个星!🌟 您的支持是我们前进的动力!🤝 欢迎贡献代码或提出建议,一起让 gone 变得更好!👨💻 #golang #依赖注入 #开源 👉github.com/gone-io/gone
本文原地址:https://github.com/gone-io/goner/blob/main/docs/modules_update.md
文章目录
一、改造背景
1. Gone框架的定位
Gone框架是一个轻量级的依赖注入框架,它通过简洁的API和注解式依赖声明,帮助开发者轻松构建模块化、可测试的应用程序。作为一个轻量级框架,Gone坚持"小而美"的设计理念,只提供必要的核心功能,避免过度臃肿。
2. 可插拔组件的设计
Gone框架提供了一系列可插拔的组件(称为Goner),涵盖了Web开发、数据库访问、配置管理、日志记录等多个方面:
- gin:Web框架集成
- gorm:ORM框架集成
- viper:配置管理
- redis:缓存服务
- grpc:RPC服务
- apollo/nacos:配置中心
- zap:日志组件
- 等等
这种设计让开发者可以根据实际需求选择所需组件,实现灵活组合,避免了"全家桶"式的强制依赖。
3. 原有架构的问题
改造前,Gone核心代码和所有Goner组件都在同一个仓库中管理,共享同一个Go module。这种架构存在以下问题:
- 依赖膨胀:用户即使只需要某一个特定功能(如gin集成),也必须导入整个Gone模块,包含大量不需要的依赖
- 版本管理困难:所有组件共享同一个版本号,无法针对单个组件进行独立版本迭代
- 维护成本高:随着组件数量增加,单一仓库的维护难度急剧上升
- 违背轻量级理念:过多的依赖与Gone框架轻量级的设计理念相矛盾
二、改造过程
1. 仓库分离
首先,我们将Goner组件库从原始的github.com/gone-io/gone仓库中分离出来,独立为一个新仓库:github.com/gone-io/goner。
这一步骤包括:
- 创建新的Git仓库
- 迁移相关代码,保留提交历史
- 调整导入路径
2. 单仓库多模块(Mono Repo)改造
对github.com/gone-io/goner进行Mono Repo改造,将每个Goner组件作为独立的子模块管理:
github.com/gone-io/goner/
├── g/ # 基础接口定义
├── gin/ # Gin框架集成
├── gorm/ # GORM框架集成
├── redis/ # Redis客户端集成
├── viper/ # Viper配置管理
├── apollo/ # Apollo配置中心
├── nacos/ # Nacos配置中心
├── zap/ # Zap日志组件
├── grpc/ # gRPC服务集成
├── cmux/ # 连接复用
├── schedule/ # 定时任务
├── tracer/ # 链路追踪
├── urllib/ # HTTP客户端
├── xorm/ # XORM框架集成
└── ...
每个子目录都是一个独立的Go模块,拥有自己的go.mod文件,可以独立版本化和发布。
3. 接口抽象与依赖解耦
为了解决组件间的相互依赖问题,我们采用了"依赖接口,不依赖实现"的设计原则:
- 创建
github.com/gone-io/goner/g子模块,用于定义所有公共接口 - 所有组件都依赖于这个基础接口模块,而不是直接依赖其他组件
- 通过接口抽象,实现了组件间的松耦合
例如,在g/tracer.go中定义了链路追踪相关接口,而不是直接依赖于tracer的具体实现:
// /g/tracer.go
package g
// Tracer 用于日志追踪,为同一调用链分配统一的traceId,方便日志追踪
type Tracer interface {
//SetTraceId 为调用函数设置traceId。如果traceId为空字符串,将自动生成一个。
//调用函数可以通过GetTraceId()方法获取traceId。
SetTraceId(traceId string

最低0.47元/天 解锁文章
1957

被折叠的 条评论
为什么被折叠?



