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

config/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() 统一注入依赖。

扩展建议

增加新业务实体

  1. app/model/ 添加 GORM Model
  2. app/dao/ 封装数据访问
  3. app/service/ 编写业务逻辑
  4. app/dto/ 定义请求/响应 DTO
  5. app/controller/ 编写控制器
  6. config/autoload/router.go 注册路由
  7. 需要新的依赖时,在 config/autoload/ 添加 Provider 并装配到 Assembly

接入外部服务

  • 通知系统:在 Service 层通过事件接口发送
  • 第三方统计:参考点击异步写入机制,在跳转 Service 钩子处回调外部系统
  • 监控 / Metrics:可在 Middleware 层接入 Prometheus

性能特点

  • 跳转路径短GET /{code} 流程为 缓存命中 → 302 返回,目标响应时间 < 10ms
  • 异步统计:点击记录走异步队列,不阻塞主请求
  • 连接池:GORM 自带连接池,结合 Redis pool 满足高并发
  • 集群扩展:无状态设计,可直接水平扩展多实例共享 MySQL + Redis