Skip to content

整体架构 ​

DoraCMS 采用现代化的微服务架构设计,前后端分离,支持微前端和双数据库。

系统架构图 ​

┌─────────────────────────────────────────────────────────────┐
│                    前端应用层                                │
│  ┌──────────────┐  ┌──────────────┐  ┌─────────────────┐   │
│  │  用户中心     │  │  管理后台     │  │  远程微前端应用 │   │
│  │  Vue 3       │  │  Vue 3 + TS  │  │   qiankun      │   │
│  │  Vite        │  │  UnoCSS      │  │                │   │
│  └──────┬───────┘  └──────┬───────┘  └────────┬────────┘   │
└─────────┼──────────────────┼───────────────────┼────────────┘
          │                  │                   │
          └──────────────────┼───────────────────┘
                             │ HTTP/WebSocket
┌──────────────────────────┼──────────────────────────────────┐
│                    API 网关层                                │
│         ┌────────────────▼───────────────────┐              │
│         │         Nginx / API Gateway        │              │
│         │    · 路由转发  · 负载均衡          │              │
│         │    · SSL 终止  · 限流防护          │              │
│         └────────────────┬───────────────────┘              │
└──────────────────────────┼──────────────────────────────────┘
                           │
┌──────────────────────────▼──────────────────────────────────┐
│                    应用服务层                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              EggJS 后端服务                          │   │
│  │  ┌───────────┐  ┌──────────┐  ┌──────────────┐     │   │
│  │  │Controller │➜ │ Service  │➜ │ Repository   │     │   │
│  │  │   层      │  │   层     │  │     层       │     │   │
│  │  └───────────┘  └──────────┘  └──────┬───────┘     │   │
│  │                                       │             │   │
│  │  ┌──────────┐  ┌──────────┐  ┌──────▼───────┐     │   │
│  │  │ 中间件   │  │  插件    │  │   Adapter    │     │   │
│  │  │  Auth    │  │  Redis   │  │   适配器     │     │   │
│  │  │  Error   │  │  Upload  │  │   转换层     │     │   │
│  │  └──────────┘  └──────────┘  └──────┬───────┘     │   │
│  └─────────────────────────────────────┼─────────────┘   │
└────────────────────────────────────────┼─────────────────┘
                                         │
┌────────────────────────────────────────▼─────────────────────┐
│                      数据存储层                               │
│  ┌────────────┐         ┌────────────┐        ┌──────────┐  │
│  │  MongoDB   │◄───OR──►│  MariaDB   │        │  Redis   │  │
│  │  文档数据库 │         │  关系数据库 │        │  缓存    │  │
│  └────────────┘         └────────────┘        └──────────┘  │
└──────────────────────────────────────────────────────────────┘

技术选型 ​

前端技术栈 ​

技术版本说明为什么选择
Vue3.x渐进式框架易学易用,生态完善,性能优秀
TypeScript5.x类型系统类型安全,减少运行时错误
Vite6.x构建工具极速开发体验,HMR 快
Element Plus-UI 组件库组件丰富,文档完善,企业级
UnoCSS-原子化 CSS按需生成,性能优秀
Pinia-状态管理Vue 官方推荐,TypeScript 友好
qiankun-微前端阿里开源,成熟稳定

后端技术栈 ​

技术版本说明为什么选择
EggJS3.x企业级框架约定优于配置,插件生态丰富
MongoDB4.x+NoSQL 数据库灵活的文档结构,水平扩展
Mongoose7.xMongoDB ODM强大的 Schema 系统
MariaDB10.x+关系数据库开源,兼容 MySQL,性能好
Sequelize6.xSQL ORM支持多种数据库,API 友好
Redis5.x+缓存高性能,数据结构丰富
JWT-认证无状态,易于扩展

架构特点 ​

1. 前后端分离 ​

优势:

  • ✅ 前后端独立开发部署
  • ✅ 前端可以使用任何框架
  • ✅ API 可以被多端复用
  • ✅ 更好的性能和用户体验

实现:

javascript
// 后端:提供 RESTful API
router.get('/api/articles', controller.article.index)
router.post('/api/articles', controller.article.create)

// 前端:调用 API
const articles = await axios.get('/api/articles')

2. 三层架构 ​

Controller → Service → Repository

javascript
// Controller 层:处理请求
class ArticleController {
  async index() {
    const result = await this.ctx.service.article.getList(this.ctx.query)
    this.ctx.body = result
  }
}

// Service 层:业务逻辑
class ArticleService {
  async getList(params) {
    return await this.ctx.repo.article.findByPage(params)
  }
}

// Repository 层:数据访问
class ArticleRepository {
  async findByPage(params) {
    return await this.model.find(params)
  }
}

3. Repository 模式 ​

核心价值:

  • ✅ 数据访问层抽象
  • ✅ 支持双数据库切换
  • ✅ 代码复用率 90%+
  • ✅ 统一的查询接口

四层继承结构:

IBaseRepository (接口)
    ↓
BaseStandardRepository (跨数据库基类)
    ↓                    ↓
BaseMongoRepository  BaseMariaRepository
    ↓                    ↓
UserMongoRepository  UserMariaRepository

4. 微前端架构 ​

基于 qiankun 的微前端方案:

javascript
// 主应用:注册子应用
registerMicroApps([
  {
    name: 'admin',
    entry: '//localhost:5173',
    container: '#subapp-viewport',
    activeRule: '/admin',
  },
  {
    name: 'user',
    entry: '//localhost:3000',
    container: '#subapp-viewport',
    activeRule: '/user',
  }
])

优势:

  • ✅ 应用独立开发部署
  • ✅ 技术栈无关
  • ✅ 增量升级
  • ✅ 按需加载

5. 双数据库支持 ​

MongoDB vs MariaDB:

特性MongoDBMariaDB
数据模型文档型关系型
Schema灵活固定
扩展性水平扩展容易垂直扩展
事务支持(4.0+)完全支持
查询简单查询快复杂查询好
适用场景非结构化数据结构化数据

切换方式:

javascript
// config.js
config.dbType = 'mongodb'  // 或 'mariadb'

// 业务代码无需修改
const users = await this.ctx.repo.user.findMany({})

数据流向 ​

请求流程 ​

1. 用户请求
   ↓
2. Nginx(路由、负载均衡)
   ↓
3. Controller(参数验证、权限检查)
   ↓
4. Service(业务逻辑处理)
   ↓
5. Repository(数据库操作)
   ↓
6. Adapter(查询转换)
   ↓
7. MongoDB/MariaDB(数据存储)
   ↓
8. 逆向返回到用户

认证流程 ​

1. 用户登录
   ↓
2. Controller 接收请求
   ↓
3. Service 验证账号密码
   ↓
4. 生成 JWT Token
   ↓
5. 返回 Token 给前端
   ↓
6. 前端后续请求携带 Token
   ↓
7. Auth 中间件验证 Token
   ↓
8. 解析用户信息
   ↓
9. 注入到 ctx.user

权限控制 ​

管理端权限链路采用“权限定义 → 菜单/按钮 → 角色 → 管理员缓存 → 中间件校验”的闭环,详细流程见 /architecture/permission-control。

性能与安全(概览) ​

  • 查询与缓存:Repository 支持字段选择、关联查询优化与 Redis 缓存;索引与连接池配置按数据库类型调整
  • 前端优化:路由/组件按需加载、CDN/Gzip/懒加载等标准手段
  • 安全基线:JWT 认证、RBAC 权限(详见 /architecture/permission-control)、密码加密、敏感字段过滤、CSRF/XSS/限流防护
  • 生产运维与加固:参见 运维与排障

可扩展性 ​

1. 水平扩展 ​

bash
# 多实例部署
pm2 start app.js -i max  # 根据 CPU 核心数启动实例

# Nginx 负载均衡
upstream api_backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:7002;
    server 127.0.0.1:7003;
}

2. 插件系统 ​

javascript
// 自定义插件
module.exports = app => {
  // 插件初始化
  app.beforeStart(async () => {
    // 注册自定义功能
  })
}

3. 微服务演进 ​

当单体应用无法满足需求时,可以拆分为微服务:

DoraCMS Monolith
    ↓
┌─────────┬─────────┬─────────┬─────────┐
│ User    │Article  │Comment  │  File   │
│ Service │Service  │Service  │ Service │
└─────────┴─────────┴─────────┴─────────┘

监控和日志 ​

1. 应用监控 ​

javascript
// EggJS 内置监控
app.on('error', (err, ctx) => {
  ctx.logger.error('Application Error:', err)
})

// 性能监控
app.use(async (ctx, next) => {
  const start = Date.now()
  await next()
  const duration = Date.now() - start
  ctx.logger.info(`[${ctx.method}] ${ctx.url} - ${duration}ms`)
})

2. 日志管理 ​

javascript
// 分级日志
ctx.logger.debug('调试信息')
ctx.logger.info('普通信息')
ctx.logger.warn('警告信息')
ctx.logger.error('错误信息')

// 日志文件
logs/
├── doracms-web.log        # 应用日志
├── common-error.log       # 错误日志
├── egg-agent.log          # Agent 日志
└── egg-schedule.log       # 定时任务日志

部署架构 ​

开发环境 ​

┌─────────────────────────────────────┐
│  开发机器                            │
│  ├── Node.js                        │
│  ├── MongoDB/MariaDB (本地)         │
│  └── Redis (可选)                   │
└─────────────────────────────────────┘

生产环境 ​

┌────────────────────────────────────────────┐
│  负载均衡 (Nginx/HAProxy)                  │
└──────────┬─────────────────────────────────┘
           │
    ┌──────┴──────┬──────────┬──────────┐
    │             │          │          │
┌───▼───┐    ┌───▼───┐  ┌───▼───┐  ┌──▼───┐
│App 1  │    │App 2  │  │App 3  │  │Static│
│Node   │    │Node   │  │Node   │  │Files │
└───┬───┘    └───┬───┘  └───┬───┘  └──────┘
    │            │          │
    └────────────┼──────────┘
                 │
    ┌────────────┴──────────────┐
    │                           │
┌───▼────────┐         ┌────────▼────┐
│MongoDB     │         │  Redis      │
│Replica Set │         │  Cluster    │
└────────────┘         └─────────────┘

下一步 ​