架构概览
架构概览
M-Doc 采用经典的分层架构,结合 Assembly 依赖注入和事件驱动设计。
分层架构
┌─────────────────────────────────────┐
│ HTTP Layer (Gin Router) │ 路由 + 中间件
├─────────────────────────────────────┤
│ Controller Layer │ 请求/响应处理
├─────────────────────────────────────┤
│ Service Layer │ 业务逻辑
├─────────────────────────────────────┤
│ DAO Layer │ 数据访问
├─────────────────────────────────────┤
│ Model Layer (GORM) │ 数据模型
└─────────────────────────────────────┘各层职责
| 层级 | 目录 | 职责 |
|---|---|---|
| Controller | app/controller/ |
解析请求参数,调用 Service,返回响应 |
| Service | app/service/ |
业务逻辑,事务管理,事件触发 |
| DAO | app/dao/ |
数据库 CRUD 操作 |
| Model | app/model/ |
GORM 数据模型定义 |
| DTO | app/dto/ |
数据传输对象(请求/响应结构) |
控制器方法签名
控制器方法返回 dto.Response,由 WrapHandler 自动转换为 JSON:
func (c FeatureController) GetList(ctx *gin.Context) dto.Response {
// 业务逻辑
return dto.Response{Code: 200, Message: "成功", Data: data}
}Assembly 依赖注入
M-Doc 使用 Assembly 模式管理组件初始化:
// config/assembly.go
func (receiver *Assembly) Get() []interfaces.AssemblyInterface {
return []interfaces.AssemblyInterface{
&envAssembly.Env{}, // 1. 环境变量
&configAssembly.Config{}, // 2. 配置加载
&loggerAssembly.Logger{}, // 3. 日志系统
&databaseAssembly.Database{}, // 4. 数据库
&redisAssembly.Redis{}, // 5. Redis
&cacheAssembly.Cache{}, // 6. 缓存
// ... 更多组件
}
}每个组件实现 InitConfig(helper) 方法,按顺序初始化。通过 helper 访问共享依赖:
helper.GetDatabase()— GORM 实例helper.GetConfig()— Viper 配置helper.GetLogger()— Zap 日志helper.GetRedis()— Redis 客户端helper.GetCache()— 缓存实例
事件驱动设计
Service 层在操作完成后触发事件,监听器异步执行后续操作:
ArticleService.Publish()
↓
EventBus.Dispatch(ArticlePublishedEvent)
↓
├── LoggerListener(记录日志)
├── SummarizeListener(生成摘要)
└── VectorizeListener(更新向量索引)这种设计实现了核心逻辑与扩展功能的解耦。
CE/EE 扩展机制
M-Doc 开源版(CE)设计为可扩展的基础:
mdoc-server (CE) mdoc-ee (EE)
├── pkg/ ├── 引用 CE 的 pkg
├── cmd/Start() ├── 重写 Start() 注入 EE 功能
├── Assembly ├── 追加 EE Assembly 组件
└── EventBus └── 注册 EE 事件监听器EE 版通过 Go Workspace 依赖 CE:
- 使用 CE 的公共包(
pkg/) - 在 Assembly 中追加 EE 组件
- 注册 EE 专属的事件监听器
- 添加 EE 路由(
/api/ee/*)
这确保了 CE 版的完整性和独立性,同时允许 EE 版无侵入地扩展功能。
技术栈
| 组件 | 技术 |
|---|---|
| HTTP 框架 | Gin |
| ORM | GORM |
| 配置 | Viper |
| 日志 | Zap |
| 缓存 | Redis |
| 认证 | JWT + OIDC |
| 向量搜索 | langchaingo + pgvector |
| 数据库迁移 | Goose |
| 定时任务 | robfig/cron |