6.1 系统架构与扩展点
架构与扩展
分层
dwz-server 采用经典的 Clean Architecture:
Request
│
▼
Middleware (AuthMiddleware / OperationLogMiddleware / InstallMiddleware / CORS)
│
▼
Controller (app/controller/*.go) — 参数校验、调用 Service、组装响应
│
▼
Service (app/service/*.go) — 业务逻辑、事务边界
│
▼
DAO (app/dao/*.go) — GORM 查询封装
│
▼
Model (app/model/*.go) — GORM 实体依赖注入(Assembly Pattern)
config/assembly.go 按严格顺序初始化依赖,避免循环引用:
Env → Config → Logger → Version → Installed → Database → Redis → Cacheconfig/server.go 按依赖顺序启动服务:
Migration → IDGenerator → HttpServer全局访问通过 internal/helper/helper.go 提供的接口(HelperInterface)获取 logger、config、cache、db 等。
可插拔驱动
| 抽象 | 接口位置 | 实现 |
|---|---|---|
| 数据库 | GORM dialector | MySQL / PostgreSQL / SQLite |
| 缓存 | internal/interfaces/CacheInterface |
Redis / Memory |
| ID 生成 | internal/interfaces/IDGeneratorInterface |
Redis / Local |
| 静态资源 | http.static_mode |
embed / disk |
| 模板 | http.templates_mode |
embed / disk |
切换驱动只需改配置,无需重新编译。
嵌入式静态资源
templates/**与static/**通过 Go 的//go:embed在构建时嵌入二进制- 单文件部署,不依赖外部模板目录
- 开发时可切到
disk模式,支持热更新
路由注册
所有路由集中在 config/autoload/router.go,通过依赖注入容器注册到 Gin。控制器以结构体方法形式存在,通过 deps.WrapHandler() 统一注入依赖。
扩展建议
增加新业务实体
- 在
app/model/添加 GORM Model - 在
app/dao/封装数据访问 - 在
app/service/编写业务逻辑 - 在
app/dto/定义请求/响应 DTO - 在
app/controller/编写控制器 - 在
config/autoload/router.go注册路由 - 需要新的依赖时,在
config/autoload/添加 Provider 并装配到 Assembly
接入外部服务
- 通知系统:在 Service 层通过事件接口发送
- 第三方统计:参考点击异步写入机制,在跳转 Service 钩子处回调外部系统
- 监控 / Metrics:可在 Middleware 层接入 Prometheus
性能特点
- 跳转路径短:
GET /{code}流程为 缓存命中 → 302 返回,目标响应时间 < 10ms - 异步统计:点击记录走异步队列,不阻塞主请求
- 连接池:GORM 自带连接池,结合 Redis pool 满足高并发
- 集群扩展:无状态设计,可直接水平扩展多实例共享 MySQL + Redis