设计理念
Firefly 的设计遵循以下核心原则,旨在平衡开发的灵活性与架构的规范性。
1. 协议优先 (Schema-First)
在微服务架构中,API 契约是服务间协作的基石。Firefly 坚持使用 Protobuf (Protocol Buffers) 作为接口定义语言 (IDL)。
- 单一事实来源:所有的 API 定义、数据结构验证规则都定义在
.proto文件中。 - 代码生成:通过
buf等工具自动生成 Server Stub、Client SDK 和 DTO,避免手动编写重复代码。 - 语言无关:一份 Proto 定义可以同时生成 Go, Rust, TypeScript 等多种语言的代码,天然支持多语言生态。
2. 整洁架构 (Clean Architecture)
Firefly 的项目模板(如 go-layout)严格遵循整洁架构的分层原则,实现关注点分离。
- Biz 层(核心业务):纯净的业务逻辑,不依赖任何外部实现(如数据库、HTTP 框架)。
- Data 层(数据适配):负责数据的持久化和外部接口的调用,通过接口实现 Biz 层的需求。
- Service 层(应用服务):负责处理网络请求(gRPC/HTTP),进行参数校验和 DTO 转换,编排 Biz 层逻辑。
这种设计使得业务逻辑高度可测试、易于维护,并且可以在不修改业务代码的情况下替换底层实现(例如将 MySQL 换成 MongoDB)。
3. 依赖注入 (Dependency Injection)
为了管理复杂的组件依赖关系,Firefly 提倡使用依赖注入模式。
- 显式依赖:组件所需的依赖(如数据库连接、配置对象)通过构造函数显式传入,而不是在内部隐式创建或通过全局变量获取。
- 编译期安全:在 Go 语言实现中,我们使用 Google
Wire进行编译期依赖注入,在代码编译阶段就能发现依赖缺失的问题,避免运行时错误。
4. 约定优于配置 (Convention over Configuration)
Firefly 提供了一套标准化的目录结构和命名规范。
- 统一目录:所有服务都采用相同的
internal/biz,internal/data等目录结构。 - 统一配置:标准化的
bootstrap.json引导配置,统一管理服务身份、业务端口、管理端口、sidecar-agent、日志和 telemetry 等启动参数。
这使得新加入的开发者能够快速上手任何一个基于 Firefly 构建的服务,无需花费大量时间熟悉项目结构。
5. 极简与可扩展
Firefly 的核心库保持轻量级,不强行绑定过多的第三方库。
- 模块化设计:日志、配置、注册发现和运行时治理都面向稳定契约,裸机 / IDC 可使用 Consul 适配层,云原生环境可切换到 K8s / Istio 运行时,业务代码不直接绑定底层 SDK。
- 代码透明:生成的代码(如
wire_gen.go)也是清晰可读的 Go 代码,没有黑魔法。
6. 单服务单仓库 (Repo-per-Service)
Firefly 倡导 单个服务单个仓库 的代码管理模式,不推荐使用大仓 (Monorepo)。
- 独立演进:每个服务拥有独立的版本控制、CI/CD 流程和依赖管理,避免“牵一发而动全身”。
- 公共库抽取:通用的业务逻辑、工具函数应抽取为独立的 SDK 或 Package(如
go-utils),以库的形式被各个服务引用。 - 边界清晰:物理上的仓库隔离强制划清了服务边界,减少了隐式的代码耦合。