mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-06 07:36:37 +08:00
299ac30ee4
- Purify core micro-kernel by removing context hardcoded helpers and reverse dependencies - Eliminate init() side effects in infra plugins with reversible lifecycle disposal - Completely isolate plugins by removing cross-plugin imports and using core/contracts - Introduce TaskService and RiskControlService contracts for unified cross-plugin APIs - Regenerate Swagger documentation and update developer guide matrix - Achieve 0 violations in check_cordis_architecture.sh and 100% test pass
4.5 KiB
4.5 KiB
Cordis 架构重构设计规格书 (Cordis Architecture Refactor Design)
日期: 2026-08-28
目标: 依据 Cordis 时空可组合性元框架(Spatiotemporal Composability)哲学,重构 Wavelet 后端包结构、包职责与插件边界,消除全局静态单例与跨插件私有实现依赖,实现真正的可逆副作用与契约化隔离。
1. 背景与核心设计原则
Cordis 是一个面向时空可组合性的元框架,核心在于:
- 时间可组合性 (Temporal Composability / Revertible Effects):组件挂载到上下文时产生的任何副作用(数据库连接、Redis 客户端、路由、事件监听、定时任务)必须具备明确的逆操作,在卸载时按 LIFO(后进先出)干净撤销。
- 空间可组合性 (Spatial Composability / Reactive Coeffects):组件通过
Inject声明依赖;无特权微内核,所有基础设施与业务均以平等插件形态存在;组件之间严格面向抽象服务契约(Contracts)编程,严禁跨包引用私有实现。 - 合流定理 (Confluence):任何插件的装载/卸载顺序,静止状态等同于从零静态装配,杜绝全局隐藏状态与启动顺序隐式假设。
2. 详细重构方案
2.1 微内核纯洁化 (backend/core/)
改造点:
- 移除特权辅助方法:
- 从
backend/core/context.go中移除func (c *Context) DB() contracts.DBService与func (c *Context) Cache() contracts.CacheService。 - 所有服务消费方统一面向
core.Inject[T](ctx)、core.MustInject[T](ctx)或core.Using[T](ctx, ...)。
- 从
- 保持依赖注入纯粹性:
- 内核仅保留:
Context、Container、Fiber、EventBus、生命周期管理以及通用的扩展点挂载。
- 内核仅保留:
2.2 基础设施插件生命周期可逆化 (backend/plugins/infra/)
1. 数据库插件 (plugins/infra/database)
- 移除隐式副作用:
- 删除
postgres.go与sqlite.go中的func init() { ... }静态建连。 - 删除包级导出的静态全局变量
var db *gorm.DB以及全局DB(ctx)/SetDB()。
- 删除
- 生命周期受控与可逆释放:
- 在
Plugin.Apply(ctx *core.Context)时根据配置建立数据库连接(GORM + underlying*sql.DB)。 - 创建
contracts.DBService实例并通过core.Provide[contracts.DBService](ctx, svc)注册。 - 注册
ctx.OnDispose逆操作,在插件卸载时调用sqlDB.Close()。
- 在
2. 缓存插件 (plugins/infra/cache)
- 移除隐式副作用:
- 删除
redis.go中的func init() { ... }静态建连。 - 删除包级导出的全局变量
var Redis redis.UniversalClient。
- 删除
- 生命周期受控与可逆释放:
- 在
Plugin.Apply(ctx *core.Context)时初始化 Redis 客户端并构造contracts.CacheService。 - 通过
core.Provide[contracts.CacheService](ctx, svc)注册。 - 注册
ctx.OnDispose逆操作,在插件卸载时调用client.Close()。
- 在
2.3 业务领域插件防线隔离与依赖重构 (backend/plugins/domain/)
1. 消除跨插件私有 Import
- 遍历并重构以下 8 个 Domain 插件:
authuseradmincapmessage_gatewayrisk_controlsystemupload
- 规则:
- 严禁任何 domain 插件
import "Wavelet/plugins/infra/database"或import "Wavelet/plugins/infra/cache"。 - 严禁任何 domain 插件直接 import 另一个 domain 插件的具体实现包(如
admin严禁 importrisk_control/logstore或storage/diskcache)。 - 各插件内部的 Repository / Service 统一通过
core.Inject[contracts.DBService](ctx)或插件内部 scoped context 获取数据库连接。
- 严禁任何 domain 插件
2. admin 插件解耦与全局变量清除
- 移除
admin/plugin.go中的包级变量(globalUserSvc,globalAuthSvc,globalCoreCtx)。 - 将
admin的日志查询、任务触发、缓存清理等管理接口改造为通过contracts或ctx.Tasks()访问,消除对risk_control、driver_asynq_worker等的私有依赖。
3. 验证与门禁标准
- 编译与依赖检查:
- 运行
grep -r "Wavelet/plugins/infra/database" backend/plugins/domain/结果为空。 - 运行
grep -r "Wavelet/plugins/infra/cache" backend/plugins/domain/结果为空。
- 运行
- 自动化测试:
- 所有既有单元测试与集成测试(
go test ./...)无回归,全部 PASS。
- 所有既有单元测试与集成测试(
- 代码质量门禁:
make code-check静态检查 0 告警通过。make format格式化通过。