Files
gochat/docs/ARCHITECTURE_REVIEW.md
T
2026-06-04 15:44:48 +08:00

137 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
## 循环依赖检查
```bash
# 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 接口 |
## 改进建议
### 高优先级
1. **引入 DI 容器**wire/dig)— 减少 bootstrap 手动编排复杂度
2. **Service 层测试覆盖率**(0.2%→50%)— 关键业务逻辑需要验证
3. **Repository 层测试覆盖率**(6.3%→40%)— 数据访问层需保证正确性
### 中优先级
4. **PubSub 扩展到 Redis/NATS** — 生产环境需要持久化消息队列
5. **配置热加载** — 当前配置只在启动时加载
6. **API 文档生成**Swagger/OpenAPI)— 104 个路由需要自动文档
### 低优先级
7. **性能优化** — Conversation List (468μs) 和 Message List (440μs) 有优化空间
8. **结构化日志** — applogger 当前简化版,生产需要 JSON 结构化