架构总览
多模块拆进程 + nginx 负载均衡
本项目参照 RuoYi-Vue-Plus 的功能,用 Go + Gin 重新实现。架构核心是 多模块拆进程 + nginx 负载均衡:每个业务模块编译成独立 binary、独立进程启动;另提供 standalone 单体入口,四模块同进程,便于本地调试。
四个业务模块
| 模块 | 职责 |
|---|---|
| auth | 登录 / 验证码 / 三方绑定 |
| system | 用户 / 角色 / 菜单 / 部门 / 字典 / 参数 / 公告 / 客户端 / 社交账号 |
| monitor | 在线用户 / 登录日志 / 操作日志 / 缓存监控 |
| resource | OSS 对象存储 / 消息推送 / 短信 / 邮箱验证码 |
两种部署形态
单体(standalone)
一个进程,四个模块同进程。cmd/standalone/main.go 内 gin.New() + 全局中间件装配一次,再调各模块 RegisterRoutes(r, "/<prefix>")。进程内自带 /resource 前缀(等价于网关 StripPrefix=1 后的效果),保留 /auth、/system、 /monitor 前缀与前端直连的网关路径一致。
微服务(modular)
四个进程,每个模块一个。各 internal/<module>/router.go 的 InitRouter() 各自 gin.New() + r.Use(...),然后 RegisterRoutes(r, "")( 空前缀注册)。/resource 由 nginx 剥离后匹配裸路径。前端始终打 /auth、/system、/resource、 /monitor 前缀路径,两种部署前端无感。
数据库与缓存
- 数据库: MySQL + GORM,所有进程共用同一个库(
ry-cloud)。 - Redis 做会话 / 缓存 / 分布式锁 / 验证码 / 推送分发。
关键设计取舍
- auth 复用 system 走 in-process:
internal/auth/service直接import internal/system/service,同进程函数调用, 不走 HTTP。auth 进程也连同一数据库。 - 只有 repository 层接触 GORM:service 拿到的是 model,不感知 SQL。
- 模块隔离:
internal/system与internal/auth之间只能通过 service 层导出的接口交互,不跨模块 import handler/repository/model 内部。 - pkg 不能 import internal:注解层落库等场景用 Recorder 回调让 internal 反向注册(见 pkg 参考 / oplog)。