6.1 系统架构与扩展点
系统架构与扩展点
dwz-server 是一个模块化 Go 服务。main.go 负责嵌入资源并把 config.App 交给 go-web 启动;业务代码通过容器解析数据库、缓存、日志、Redis、版本和 IP 归属地服务。
请求链
HTTP 请求
→ 全局中间件:CORS → 短码分发 → 安装状态
→ API 中间件:操作日志 → 认证 → 工作区
→ Controller → Service → DAO → GORM → Database
↘ Cache / Redis / ID Generator / IP Region短码 /<code> 与 /preview/<code> 由全局分发中间件处理,避免根路径 catch-all 与明确路由冲突。
目录分层
| 目录 | 职责 |
|---|---|
app/controller |
HTTP 绑定、权限检查、状态码和响应 |
app/dto |
请求与响应类型、校验标签 |
app/service |
业务规则、事务和跨 DAO 编排 |
app/dao |
GORM 查询与持久化 |
app/model |
数据库模型与领域常量 |
app/middleware |
认证、工作区、操作日志、安装与 CORS |
config/autoload |
配置默认值、路由和中间件注册 |
pkg/service |
数据库、Redis、缓存、迁移、发号器、IP 归属地等基础服务 |
migrations |
MySQL/PostgreSQL/SQLite 的 Goose 迁移 |
装配与启动顺序
Assembly 按依赖顺序创建:
Env → Config → Logger → Installed → Version
→ Database → Redis → Cache → IPRegionServer 顺序:
Migration → IDGenerator → HttpServer未安装时数据库和 Redis 装配会跳过外部连接,缓存使用内存,以便安装页能启动。安装完成后写入配置与锁文件,再通过进程重载重新装配完整依赖。
HTTP 抽象
路由集中在 config/autoload/router.go。控制器签名使用:
func (Controller) Handle(c httpInterfaces.RouterContextInterface) {
// c.ShouldBindJSON, c.Query, c.Param, c.JSON ...
}需要底层标准库对象时用 c.Request() 和 c.ResponseWriter()。业务代码不要依赖具体 Gin Context,以保留 HTTP 实现可替换性。
可替换驱动
| 能力 | 实现 |
|---|---|
| 数据库 | MySQL、PostgreSQL、SQLite |
| 缓存 | memory、Redis |
| ID 发号器 | local、Redis |
| 静态资源/模板 | embed、disk |
| IP 归属地 | 内嵌 xdb、外部 xdb、禁用 Noop |
驱动选择由配置完成,但多实例需要 Redis 发号器这一业务约束不能忽略。
CE 扩展入口
config.DefaultAssemblies()、config.DefaultServers(migrationsFS) 和 config.DefaultConfigs() 暴露 CE 默认链。扩展版本可以实现自己的 AppProvider,在保持依赖顺序的前提下追加 Assembly、Server 和配置提供者;数据库结构通过额外 embed.FS 的 Goose 迁移扩展,不再依赖运行时 AutoMigrate。