5.0 KiB
5.0 KiB
GoChat Architecture Review
项目概览
GoChat 是 Chatwoot 的 1:1 Go 语言重写,旨在提供高性能、可扩展的全功能客服平台。
| 指标 | 数值 |
|---|---|
| 源代码行数 | 32,228 |
| 测试代码行数 | 8,746 |
| 源文件数 | 209 |
| 测试文件数 | 30 |
| API路由数 | 104 |
| 模型结构体 | 28 |
| Handler方法 | ~150 |
分层架构
cmd/main.go ← 入口
internal/app/bootstrap.go ← DI 编排(repos→services→handlers→router)
internal/router/router.go ← 104 路由注册
internal/handler/api/v1/ ← HTTP 处理层(15个handler文件)
internal/service/ ← 业务逻辑层(DI via 接口)
internal/repository/ ← 数据访问层(GORM + BaseRepository泛型)
internal/model/ ← 领域模型(28 个 struct)
internal/auth/ ← 认证+RBAC+MFA+SAML+OAuth
internal/channel/provider/ ← 渠道抽象(Telegram/WebWidget/API)
internal/llm/ ← AI集成(Captain/Copilot)
internal/middleware/ ← 11 个中间件(安全/限流/XSS/上传等)
internal/security/ ← 加密/Webhook签名/SQL安全
internal/ws/ ← WebSocket hub + authenticator
internal/pubsub/ ← Watermill 事件驱动
internal/reporting/ ← 报表+指标注册
pkg/crypto/ ← JWT + 加密工具
模块代码量分布
| 模块 | 行数 | 占比 |
|---|---|---|
| channel (Telegram/WebWidget/API) | 6,448 | 20.0% |
| handler (HTTP) | 5,044 | 15.6% |
| service (业务逻辑) | 4,426 | 13.8% |
| auth (认证/RBAC/MFA) | 1,691 | 5.2% |
| middleware (安全中间件) | 1,879 | 5.8% |
| security (加密/签名) | 1,570 | 4.9% |
| ws (WebSocket) | 1,221 | 3.8% |
| repository (数据访问) | 1,820 | 5.6% |
| model (领域模型) | 1,392 | 4.3% |
| reporting (报表) | 477 | 1.5% |
| llm (AI) | 579 | 1.8% |
| config | 243 | 0.7% |
| pubsub | 239 | 0.7% |
关键设计决策
1. 依赖注入(DI)
- Bootstrap 函数按顺序编排:repos → services → handlers → router
- Services 依赖 repo 接口(不直接依赖 app.DB)
- Handlers 依赖 service 接口(不依赖 app.App struct)
- ✅ 优点:可测试、松耦合
- ⚠️ 缺点:无 DI 容器,手动编排复杂度随模块增长
2. 泛型 BaseRepository
BaseRepository[T any]提供通用 CRUD- 具体 Repo 通过组合 BaseRepository + 自定义方法实现
- ✅ 减少重复代码
- ⚠️ 泛型错误处理需要关注 RowsAffected 检查
3. 渠道抽象(Channel Provider)
ChannelProvider接口:SendMessage/ReceiveMessage/ValidateWebhookToken- Provider 工厂模式:
GetProvider(channelType) - 支持 Telegram、WebWidget、API Channel
- ✅ 新渠道只需实现接口 + 注册工厂
4. Watermill PubSub
- 替代 Chatwoot 的 Sidekiq/asynq
- 内存实现(可扩展到 Redis/NATS)
- 事件:message.created, conversation.updated, notification.created 等
- ✅ Go 生态标准选择,可插拔
5. 安全层
- JWT + RefreshToken + MFA (TOTP) + SAML + OAuth
- RBAC: PermissionMatrix → PolicyContext.Can(action, resource)
- SSRF 防护、Rate Limiting、XSS、上传安全、加密
- Webhook HMAC-SHA256 签名验证 + 防重放
6. AI 集成(Captain/Copilot)
- LLM provider 接口:
Generate/Stream/Embed - 多提供商支持(OpenAI/Anthropic/本地模型)
- Captain: assistant + scenario + document + custom_tool
- Copilot: message suggestion + thread analysis
循环依赖检查
# Go 模块依赖拓扑无循环
go build ./... → PASS
go vet ./... → PASS
各包 import 关系:
- handler → service → repository → model(单向)
- auth → config, crypto
- middleware → auth, config
- channel → model, pubsub, service(事件发布)
- ws → auth, crypto
- security → 独立(无外部依赖)
✅ 无循环依赖,依赖方向全部单向向下。
分层合规性评估
| 规则 | 状态 | 说明 |
|---|---|---|
| Handler 不依赖 DB | ✅ | 仅注入 Service 接口 |
| Service 不依赖 app.App | ✅ | 仅注入 Repo 接口 |
| Repo 不依赖 Service | ✅ | 仅依赖 GORM + model |
| Model 独立无业务逻辑 | ✅ | 纯数据结构 + GORM hooks |
| 跨层通过接口通信 | ✅ | 全部 DI via 接口 |
改进建议
高优先级
- 引入 DI 容器(wire/dig)— 减少 bootstrap 手动编排复杂度
- Service 层测试覆盖率(0.2%→50%)— 关键业务逻辑需要验证
- Repository 层测试覆盖率(6.3%→40%)— 数据访问层需保证正确性
中优先级
- PubSub 扩展到 Redis/NATS — 生产环境需要持久化消息队列
- 配置热加载 — 当前配置只在启动时加载
- API 文档生成(Swagger/OpenAPI)— 104 个路由需要自动文档
低优先级
- 性能优化 — Conversation List (468μs) 和 Message List (440μs) 有优化空间
- 结构化日志 — applogger 当前简化版,生产需要 JSON 结构化