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 → IPRegion

Server 顺序:

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。

相关章节:添加新功能数据库与迁移