# Novalon Manage System 单体多模块架构重构设计文档 **文档版本**: 1.0 **创建日期**: 2026-03-13 **设计目标**: 将 novalon-manage-api 重构为单体多模块架构,实现模块化、统一认证授权、独立部署和性能优化 --- ## 1. 架构概述 ### 1.1 设计原则 基于参考项目 `everything-is-suitable-api` 的成功实践,novalon-manage-system 将采用**网关 + 单体多模块**的架构模式。 **核心设计原则**: 1. **职责单一**:每个模块只负责一个业务领域 2. **依赖单向**:上层模块依赖下层模块,避免循环依赖 3. **接口隔离**:通过网关统一对外暴露API,内部模块解耦 4. **可测试性**:每个模块都可以独立进行单元测试和集成测试 ### 1.2 架构图 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 前端应用 (Vue 3) │ └──────────────────────┬──────────────────────────────────────┘ │ ▼ ┌─────────────────┐ │ manage-gateway │ 8080 (网关) │ (网关) │ └────────┬────────┘ │ ▼ ┌─────────────────┐ │ manage-app │ 8081 (后台管理应用) │ (业务应用) │ └────────┬────────┘ │ ┌────────────┼────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │manage-sys│ │manage- │ │manage- │ │(系统管理)│ │audit │ │notify │ └──────────┘ └──────────┘ └──────────┘ │ │ │ └────────────┼────────────┘ │ ┌────────────┼────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │manage- │ │manage- │ │manage- │ │common │ │db │ │file │ │(公共模块)│ │(数据库) │ │(文件管理)│ └──────────┘ └──────────┘ └──────────┘ │ ▼ ┌─────────────────┐ │ PostgreSQL │ │ (数据库) │ └─────────────────┘ ``` --- ## 2. 模块设计 ### 2.1 模块层次结构 ``` novalon-manage-api/ ├── manage-gateway/ # 网关层(8080端口) │ ├── 路由配置 │ ├── JWT认证过滤器 │ ├── RBAC权限过滤器 │ └── 限流熔断 │ ├── manage-app/ # 应用层(8081端口) │ ├── 应用启动器 │ ├── 业务模块聚合 │ └── 配置管理 │ ├── manage-sys/ # 系统管理模块 │ ├── 用户管理 │ ├── 角色管理 │ ├── 菜单管理 │ ├── 权限管理 │ ├── 字典管理 │ └── 系统配置 │ ├── manage-audit/ # 审计中心模块 │ ├── 操作日志 │ ├── 登录日志 │ ├── 异常日志 │ └── 安全审计 │ ├── manage-notify/ # 通知中心模块 │ ├── 通知公告 │ ├── 用户消息 │ └── WebSocket实时推送 │ ├── manage-file/ # 文件管理模块 │ ├── 文件上传 │ ├── 文件下载 │ └── 文件预览 │ ├── manage-common/ # 公共模块 │ ├── 工具类 │ ├── JWT工具 │ ├── RBAC过滤器 │ ├── 通用配置 │ └── 缓存配置 │ └── manage-db/ # 数据库模块 ├── 实体类 ├── Repository ├── DAO层 └── 数据库迁移 ``` ### 2.2 模块依赖关系 ``` manage-gateway ↓ manage-app ↓ ┌─────────┬─────────┬─────────┬─────────┐ │manage- │manage- │manage- │manage- │ │sys │audit │notify │file │ └────┬────┴────┬────┴────┬────┴────┬────┘ │ │ │ │ └─────────┴─────────┴─────────┘ ↓ ┌─────────┴─────────┐ │manage-common │ └─────────┬─────────┘ ↓ manage-db ``` ### 2.3 端口分配 - **manage-gateway**: 8080(对外统一入口) - **manage-app**: 8081(后台管理应用) - **PostgreSQL**: 5432(数据库) --- ## 3. 认证授权机制 ### 3.1 JWT 认证流程 ``` 1. 用户登录 前端 → Gateway → manage-app → manage-sys ↓ 验证用户名密码 ↓ 生成 JWT Token(包含用户ID、角色、权限) ↓ 返回 Token 给前端 2. 后续请求 前端 → Gateway(携带 Token) ↓ JWT 认证过滤器验证 Token ↓ 解析用户信息(ID、角色、权限) ↓ RBAC 权限过滤器验证权限 ↓ 转发到 manage-app ``` ### 3.2 JWT Token 结构 ```json { "sub": "user_123", // 用户ID "username": "admin", // 用户名 "roles": ["ADMIN"], // 角色列表 "permissions": [ // 权限列表 "user:read", "user:write", "user:delete", "role:read", "role:write" ], "iat": 1234567890, // 签发时间 "exp": 1234571490 // 过期时间 } ``` ### 3.3 RBAC 权限模型 **角色定义**: - **SUPER_ADMIN**: 超级管理员,拥有所有权限 - **ADMIN**: 管理员,拥有系统管理权限 - **AUDITOR**: 审计员,拥有查看权限 - **OPERATOR**: 操作员,拥有基础操作权限 **权限映射**: ``` 用户管理: - user:read # 查看用户 - user:write # 创建/修改用户 - user:delete # 删除用户 角色管理: - role:read # 查看角色 - role:write # 创建/修改角色 - role:delete # 删除角色 菜单管理: - menu:read # 查看菜单 - menu:write # 创建/修改菜单 - menu:delete # 删除菜单 系统配置: - config:read # 查看配置 - config:write # 修改配置 审计中心: - audit:read # 查看审计日志 通知中心: - notice:read # 查看通知 - notice:write # 发布通知 文件管理: - file:read # 查看文件 - file:write # 上传文件 - file:delete # 删除文件 ``` ### 3.4 网关认证授权流程 **Gateway 过滤器链**: ``` 请求 → 限流过滤器 → JWT 认证过滤器 → RBAC 权限过滤器 → 路由转发 ``` **JWT 认证过滤器**: 1. 从请求头提取 Token:`Authorization: Bearer {token}` 2. 验证 Token 签名和有效期 3. 解析 Token 获取用户信息 4. 将用户信息添加到请求头:`X-User-Id`, `X-User-Roles`, `X-User-Permissions` 5. 验证失败返回 401 Unauthorized **RBAC 权限过滤器**: 1. 从请求头获取用户权限 2. 根据请求路径和方法判断所需权限 3. 验证用户是否拥有所需权限 4. 验证失败返回 403 Forbidden ### 3.5 路由权限映射 ```java /api/sys/users/** → user:read (GET), user:write (POST/PUT), user:delete (DELETE) /api/sys/roles/** → role:read (GET), role:write (POST/PUT), role:delete (DELETE) /api/sys/menus/** → menu:read (GET), menu:write (POST/PUT), menu:delete (DELETE) /api/sys/config/** → config:read (GET), config:write (POST/PUT) /api/audit/logs/** → audit:read (GET) /api/notify/notices/** → notice:read (GET), notice:write (POST/PUT) /api/file/files/** → file:read (GET), file:write (POST), file:delete (DELETE) ``` ### 3.6 Token 刷新机制 **刷新策略**: - Access Token 有效期:2 小时 - Refresh Token 有效期:7 天 - 前端在 Access Token 过期前 5 分钟使用 Refresh Token 刷新 **刷新流程**: ``` 前端 → Gateway → manage-app → manage-sys ↓ 验证 Refresh Token ↓ 生成新的 Access Token ↓ 返回新 Token ``` ### 3.7 安全增强措施 1. **Token 加密**:使用强加密算法(RS256) 2. **Token 黑名单**:使用 Caffeine 缓存存储已注销的 Token 3. **IP 绑定**:可选将 Token 与用户 IP 绑定 4. **设备指纹**:记录登录设备,异常登录时告警 5. **限流保护**:防止暴力破解(登录接口限流:5次/分钟) --- ## 4. 数据流和缓存策略 ### 4.1 数据访问架构 **分层设计**: ``` Handler 层(API接口) ↓ Service 层(业务逻辑) ↓ Repository 层(数据访问) ↓ DAO 层(数据库操作) ↓ PostgreSQL 数据库 ``` ### 4.2 Caffeine 缓存策略 **缓存配置**: ```yaml spring: cache: type: caffeine caffeine: spec: maximumSize=10000,expireAfterWrite=10m ``` **缓存分层**: 1. **用户信息缓存** - 缓存键:`user:{userId}` - 缓存内容:用户基本信息、角色、权限 - 过期时间:5 分钟 - 最大容量:1000 条 2. **角色权限缓存** - 缓存键:`role:{roleId}` - 缓存内容:角色信息、关联权限 - 过期时间:10 分钟 - 最大容量:500 条 3. **菜单树缓存** - 缓存键:`menu:tree:{userId}` - 缓存内容:用户可访问的菜单树 - 过期时间:10 分钟 - 最大容量:1000 条 4. **字典数据缓存** - 缓存键:`dict:{dictType}` - 缓存内容:字典类型对应的字典数据 - 过期时间:30 分钟 - 最大容量:2000 条 5. **系统配置缓存** - 缓存键:`config:{configKey}` - 缓存内容:系统配置项 - 过期时间:30 分钟 - 最大容量:500 条 6. **Token 黑名单缓存** - 缓存键:`token:blacklist:{tokenId}` - 缓存内容:已注销的 Token ID - 过期时间:Token 剩余有效期 - 最大容量:10000 条 ### 4.3 缓存更新策略 **Cache-Aside 模式**: ``` 读取数据: 1. 先查缓存 2. 缓存命中,直接返回 3. 缓存未命中,查数据库 4. 将数据写入缓存 5. 返回数据 写入数据: 1. 先更新数据库 2. 删除相关缓存 3. 下次读取时重新加载缓存 ``` **缓存失效场景**: - 用户信息更新 → 删除用户缓存 - 角色权限变更 → 删除角色缓存、用户缓存 - 菜单配置变更 → 删除菜单树缓存 - 字典数据变更 → 删除字典缓存 - 系统配置变更 → 删除配置缓存 - 用户登出 → 添加 Token 到黑名单缓存 ### 4.4 数据流示例 **用户登录流程**: ``` 1. 前端请求登录 POST /api/auth/login ↓ 2. Gateway 验证(限流检查) ↓ 3. manage-app 接收请求 ↓ 4. manage-sys 验证用户名密码 ↓ 5. 查询用户信息(先查缓存,未命中查数据库) ↓ 6. 查询用户角色和权限(先查缓存,未命中查数据库) ↓ 7. 生成 JWT Token ↓ 8. 返回 Token 和用户信息 ↓ 9. 缓存用户信息(5分钟) ``` **获取用户菜单流程**: ``` 1. 前端请求菜单 GET /api/sys/menus ↓ 2. Gateway 验证 JWT Token ↓ 3. Gateway 验证 RBAC 权限(menu:read) ↓ 4. manage-app 接收请求 ↓ 5. manage-sys 查询菜单树 ↓ 6. 先查缓存(menu:tree:{userId}) ↓ 7. 缓存命中,直接返回 ↓ 8. 缓存未命中,查询数据库 ↓ 9. 构建菜单树 ↓ 10. 写入缓存(10分钟) ↓ 11. 返回菜单树 ``` ### 4.5 数据库连接池配置 **R2DBC 连接池**: ```yaml spring: r2dbc: pool: initial-size: 10 # 初始连接数 max-size: 50 # 最大连接数 max-idle-time: 30m # 最大空闲时间 max-life-time: 1h # 连接最大生命周期 acquire-timeout: 5s # 获取连接超时时间 ``` ### 4.6 性能优化策略 1. **批量查询优化** - 使用 IN 查询替代循环查询 - 使用 JOIN 减少数据库往返 2. **索引优化** - 用户表:username, email, phone - 角色表:role_code - 菜单表:parent_id, menu_type - 日志表:create_time, user_id 3. **分页查询优化** - 使用游标分页(基于 ID) - 避免 OFFSET 过大 4. **异步处理** - 日志记录异步化 - 消息推送异步化 5. **响应式编程** - 使用 WebFlux 非阻塞 I/O - 使用 R2DBC 非阻塞数据库访问 ### 4.7 Token 黑名单实现(Caffeine 版本) ```java @Configuration public class TokenBlacklistConfig { @Bean public Cache tokenBlacklistCache() { return Caffeine.newBuilder() .maximumSize(10000) .expireAfterWrite(2, TimeUnit.HOURS) // 与 Access Token 过期时间一致 .build(); } } @Service public class TokenBlacklistService { @Autowired private Cache tokenBlacklistCache; public void addToBlacklist(String tokenId) { tokenBlacklistCache.put(tokenId, true); } public boolean isBlacklisted(String tokenId) { return tokenBlacklistCache.getIfPresent(tokenId) != null; } } ``` --- ## 5. 部署方案 ### 5.1 Docker 部署架构 **容器化架构**: ``` ┌─────────────────────────────────────────────────────────────────┐ │ Docker Network │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Nginx │ │ Gateway │ │ App │ │ │ │ :80 │ │ :8080 │ │ :8081 │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ │ │ └─────────────────┴─────────────────┘ │ │ │ │ │ ┌────────┴────────┐ │ │ │ PostgreSQL │ │ │ │ :5432 │ │ │ └────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 5.2 Docker Compose 配置 ```yaml version: '3.8' services: # PostgreSQL 数据库 postgres: image: postgres:15-alpine container_name: novalon-postgres environment: POSTGRES_DB: novalon_manage POSTGRES_USER: ${DB_USERNAME:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./docs/sql:/docker-entrypoint-initdb.d networks: - novalon-network healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # 网关服务 manage-gateway: build: context: ./novalon-manage-api dockerfile: manage-gateway/Dockerfile container_name: novalon-gateway ports: - "8080:8080" environment: SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod} JWT_SECRET: ${JWT_SECRET} JWT_EXPIRATION: ${JWT_EXPIRATION:-7200} APP_SERVICE_URL: http://manage-app:8081 depends_on: manage-app: condition: service_healthy networks: - novalon-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] interval: 30s timeout: 10s retries: 3 # 应用服务 manage-app: build: context: ./novalon-manage-api dockerfile: manage-app/Dockerfile container_name: novalon-app ports: - "8081:8081" environment: SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod} DB_HOST: postgres DB_PORT: 5432 DB_NAME: novalon_manage DB_USERNAME: ${DB_USERNAME:-postgres} DB_PASSWORD: ${DB_PASSWORD:-postgres} JWT_SECRET: ${JWT_SECRET} depends_on: postgres: condition: service_healthy networks: - novalon-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8081/actuator/health"] interval: 30s timeout: 10s retries: 3 # Nginx 反向代理(可选) nginx: image: nginx:alpine container_name: novalon-nginx ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/ssl:/etc/nginx/ssl depends_on: - manage-gateway networks: - novalon-network volumes: postgres_data: networks: novalon-network: driver: bridge ``` ### 5.3 环境变量配置 **.env 文件**: ```bash # 数据库配置 DB_USERNAME=postgres DB_PASSWORD=your_secure_password # JWT 配置 JWT_SECRET=your_jwt_secret_key_minimum_256_bits JWT_EXPIRATION=7200 # Spring Profile SPRING_PROFILES_ACTIVE=prod ``` --- ## 6. 迁移计划 ### 6.1 阶段一:准备工作(1-2天) **Task 1: 创建新模块结构** - 创建 manage-gateway 模块 - 创建 manage-app 模块 - 创建 manage-common 模块 - 创建 manage-db 模块 - 创建 manage-audit 模块 - 创建 manage-notify 模块 - 创建 manage-file 模块 **Task 2: 配置父 POM** - 更新父 POM 添加新模块 - 配置依赖管理 - 配置插件管理 **Task 3: 数据库迁移准备** - 备份现有数据库 - 检查 Flyway 迁移脚本 - 准备新的迁移脚本 ### 6.2 阶段二:模块拆分(3-5天) **Task 4: 提取公共模块(manage-common)** - 提取工具类到 manage-common - 提取 JWT 工具类 - 提取 RBAC 过滤器 - 提取通用配置 - 提取缓存配置 **Task 5: 提取数据库模块(manage-db)** - 提取实体类到 manage-db - 提取 Repository 接口 - 提取 DAO 层 - 提取数据库迁移脚本 **Task 6: 拆分系统管理模块(manage-sys)** - 保留用户、角色、菜单、权限、字典、配置功能 - 移除审计、通知、文件相关代码 - 更新依赖关系 **Task 7: 创建审计中心模块(manage-audit)** - 迁移操作日志功能 - 迁移登录日志功能 - 迁移异常日志功能 - 迁移安全审计功能 **Task 8: 创建通知中心模块(manage-notify)** - 迁移通知公告功能 - 迁移用户消息功能 - 迁移 WebSocket 实时推送功能 **Task 9: 创建文件管理模块(manage-file)** - 迁移文件上传功能 - 迁移文件下载功能 - 迁移文件预览功能 ### 6.3 阶段三:网关和应用层(2-3天) **Task 10: 创建网关模块(manage-gateway)** - 配置路由规则 - 实现 JWT 认证过滤器 - 实现 RBAC 权限过滤器 - 实现限流熔断 - 配置健康检查 **Task 11: 创建应用模块(manage-app)** - 创建应用启动器 - 配置模块聚合 - 配置应用配置 - 配置 Actuator 端点 **Task 12: 配置模块依赖** - 配置 manage-app 依赖所有业务模块 - 配置业务模块依赖 manage-db 和 manage-common - 验证依赖关系正确性 ### 6.4 阶段四:测试和优化(2-3天) **Task 13: 单元测试** - 为每个模块编写单元测试 - 确保测试覆盖率 ≥ 80% - 修复测试失败 **Task 14: 集成测试** - 测试网关路由 - 测试认证授权 - 测试模块间调用 - 测试缓存功能 **Task 15: 性能测试** - 使用 K6 进行性能测试 - 优化慢查询 - 优化缓存策略 - 调整 JVM 参数 **Task 16: 安全测试** - OWASP 依赖检查 - SQL 注入测试 - XSS 测试 - CSRF 测试 ### 6.5 阶段五:部署和切换(1-2天) **Task 17: Docker 部署** - 编写 Dockerfile - 编写 docker-compose.yml - 配置环境变量 - 本地部署测试 **Task 18: 生产部署** - 备份生产环境 - 部署新版本 - 验证功能正常 - 监控系统运行 **Task 19: 灰度切换** - 切换部分流量到新版本 - 监控错误率和性能 - 逐步扩大流量 - 全量切换 **Task 20: 回滚准备** - 准备回滚脚本 - 验证回滚流程 - 文档化回滚步骤 --- ## 7. 风险控制 ### 7.1 风险识别 1. **数据丢失风险**:迁移过程中数据不一致 2. **功能回归风险**:模块拆分导致功能异常 3. **性能下降风险**:网关层增加延迟 4. **部署失败风险**:Docker 部署出现问题 ### 7.2 风险缓解 1. **数据备份**:迁移前完整备份数据库 2. **充分测试**:单元测试、集成测试、E2E 测试 3. **灰度发布**:逐步切换流量,监控指标 4. **快速回滚**:准备回滚方案,确保可以快速恢复 --- ## 8. 监控指标 ### 8.1 应用监控 - 健康检查:`/actuator/health` - 性能指标:`/actuator/metrics` - JVM 指标:内存、GC、线程 ### 8.2 业务监控 - 请求成功率 - 响应时间(P50, P95, P99) - 错误率 - 并发用户数 ### 8.3 数据库监控 - 连接池使用率 - 慢查询数量 - 数据库 CPU 使用率 --- ## 9. 技术栈 ### 9.1 后端技术栈 - **Java**: 21 - **Spring Boot**: 3.4.1 - **Spring WebFlux**: 响应式编程框架 - **Spring Security**: 安全框架 - **Spring Data R2DBC**: 响应式数据库访问 - **PostgreSQL**: 关系型数据库 - **Flyway**: 数据库版本管理 - **JWT**: 无状态认证 - **Caffeine**: 本地缓存 - **MapStruct**: 对象映射 - **Lombok**: 简化代码 ### 9.2 构建和部署 - **Maven**: 项目构建工具 - **Docker**: 容器化 - **Docker Compose**: 容器编排 - **Nginx**: 反向代理 ### 9.3 测试和监控 - **JUnit 5**: 单元测试框架 - **Reactor Test**: 响应式测试 - **K6**: 性能测试 - **Spring Boot Actuator**: 应用监控 - **SpotBugs**: 静态代码分析 - **OWASP Dependency Check**: 依赖安全检查 - **JaCoCo**: 代码覆盖率 --- ## 10. 成功标准 ### 10.1 功能验收标准 - ✅ 所有现有功能正常工作 - ✅ 网关路由正确转发请求 - ✅ JWT 认证正常工作 - ✅ RBAC 权限控制正确 - ✅ 缓存功能正常工作 - ✅ WebSocket 实时推送正常 ### 10.2 性能指标 - ✅ API 响应时间 P95 < 200ms - ✅ API 响应时间 P99 < 500ms - ✅ 请求成功率 > 99.9% - ✅ 数据库连接池使用率 < 80% - ✅ 缓存命中率 > 70% ### 10.3 质量指标 - ✅ 单元测试覆盖率 ≥ 80% - ✅ 集成测试覆盖率 ≥ 60% - ✅ 无严重安全漏洞 - ✅ 无严重代码质量问题 --- ## 11. 后续优化方向 ### 11.1 短期优化(1-3个月) - 引入 API 文档自动生成 - 完善监控告警系统 - 优化慢查询 - 增加缓存命中率 ### 11.2 中期优化(3-6个月) - 引入分布式追踪(如 Jaeger) - 实现灰度发布功能 - 优化数据库索引 - 实现 API 版本管理 ### 11.3 长期优化(6-12个月) - 考虑微服务化改造 - 引入服务网格(如 Istio) - 实现多租户支持 - 引入事件驱动架构 --- ## 附录 ### A. 参考资料 - everything-is-suitable-api 双应用架构文档 - Spring Boot 官方文档 - Spring Security 官方文档 - PostgreSQL 官方文档 - Caffeine 官方文档 ### B. 术语表 - **RBAC**: Role-Based Access Control,基于角色的访问控制 - **JWT**: JSON Web Token,JSON 格式的 Web Token - **R2DBC**: Reactive Relational Database Connectivity,响应式数据库连接 - **Caffeine**: 高性能 Java 缓存库 - **Flyway**: 数据库迁移工具 - **Actuator**: Spring Boot 应用监控端点 --- **文档结束**