架构概览
MolanDev Cloud 基于现代化的分层架构设计,核心创新是支持单体/微服务双模部署,一套代码可自由切换。
分层架构
┌─────────────────────────────────────────────────────────┐
│ 表示层 (Presentation Layer) │
│ │
│ Vue 3 + Element Plus + Pinia │
└────────────────────────────┬────────────────────────────┘
│ HTTP/JSON
┌────────────────────────────▼────────────────────────────┐
│ 接口层 (API Gateway / Controller) │
│ │
│ Gateway (微服务) / FeignClient自动映射 (单体) │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────┐
│ 业务层 (Service Layer) │
│ │
│ 业务逻辑处理 · 事务管理 · 数据验证 · 服务编排 │
└────────────────────────────┬────────────────────────────┘
│
┌────────────────────────────▼────────────────────────────┐
│ 数据访问层 (Repository / Mapper) │
│ │
│ MyBatis Plus Mapper / Custom SQL │
└────────────────────────────┬────────────────────────────┘
│
┌─────────┴─────────┐
│ │
┌──────────────────▼──────┐ ┌─────────▼────────────────┐
│ 持久化层 (Storage) │ │ 中间件层 (Middleware) │
│ │ │ │
│ ┌────────┬─────────┐ │ │ ┌──────────┬────────┐ │
│ │ MySQL │ Redis │ │ │ │ RabbitMQ │ S3/OSS │ │
│ └────────┴─────────┘ │ │ └──────────┴────────┘ │
└─────────────────────────┘ └──────────────────────────┘跨层关注点
系统通过框架层自动处理以下横切关注点:
| 关注点 | 实现方式 | 说明 |
|---|---|---|
| 认证授权 | Gateway Filter / LocalAuthFilter | 双模自动适配 |
| 权限校验 | @HasPermission + AOP | 按钮级权限控制 |
| 日志记录 | @OpLog + AOP | 声明式操作日志 |
| 异常处理 | @RestControllerAdvice | 统一异常处理 |
| 数据验证 | Bean Validation | 参数自动校验 |
| 缓存管理 | Redis + Spring Cache | 字典/菜单缓存 |
| 事务管理 | @Transactional | Service 层事务 |
| 分布式锁 | @GlobalLock / LockUtils | Redis/内存双策略 |
| 事件总线 | EventUtil + @MolanListener | 本地/MQ 自动切换 |
双模部署架构
MolanDev Cloud 的核心创新是双模部署:同一套代码可在单体和微服务之间自由切换。
单体模式架构
┌─────────────────────────────────────┐
│ molandev-standalone-service │
│ │
│ ┌─────────────┬──────────────────┐ │
│ │ base │ ai │ │
│ │ (系统/文件/ │ (知识库) │ │
│ │ 消息/任务) │ │ │
│ └─────────────┴──────────────────┘ │
│ ↓ │
│ ┌──────────┐ │
│ │ MySQL │ │
│ │ Redis │ │
│ └──────────┘ │
└─────────────────────────────────────┘
特点:
• 接口调用走本地 Bean 注入
• 事件通信走进程内内存
• 支持本地事务
• 资源占用少,运维简单配置:
yaml
molandev:
run-mode: single微服务模式架构
┌──────────┐
│ Gateway │
└─────┬────┘
┌───────────┼───────────┐
↓ ↓ ↓
┌─────────┐ ┌─────────┐
│ base │ │ ai │
└────┬────┘ └────┬────┘
│ │
└───────────┼───────────┘
↓
┌──────────┐
│ Nacos │
│ RabbitMQ │
└──────────┘
特点:
• 服务独立部署,可独立扩展
• 接口调用走 HTTP 远程调用
• 事件通信走 RabbitMQ
• 支持服务治理、限流熔断配置:
yaml
molandev:
run-mode: cloud核心实现原理
1. 接口即服务
所有服务间调用都通过 Feign 接口:
java
// 定义 Feign 接口
@FeignClient(name = "${molandev.service-name.molandev-base:molandev-base}", path = "/feign/user")
public interface SysUserApi {
@GetMapping("/{id}")
UserDto getById(@PathVariable String id);
}
// 业务代码调用(单体/微服务完全一致)
@Service
public class OrderService {
@Autowired
private SysUserApi userApi; // 注入接口
public void createOrder(OrderDTO order) {
UserDto user = userApi.getById(order.getUserId()); // 自动适配
}
}- 单体模式: Feign 接口通过
molandev-rpc自动转为本地调用 - 微服务模式: Feign 接口通过 HTTP 远程调用
2. 事件驱动适配
java
// 发布事件(单体/微服务完全一致)
EventUtil.publish(new UserRegisteredEvent(user));
// 监听事件
@MolanListener
public void onUserRegistered(UserRegisteredEvent event) {
emailService.sendWelcomeEmail(event.getUser().getEmail());
}- 单体模式: 本地事件总线(Spring Event)
- 微服务模式: RabbitMQ 分布式消息
3. 定时任务双模
java
@TaskSchedule("NotifyExpiredUser")
public void execute() {
// 业务逻辑
}- 单体模式: 本地直接调用
- 微服务模式: HTTP 远程调度
- 分布式锁: 防止多节点重复执行
详细了解
双模部署的详细实现原理请参考 双模部署文档。
数据流转
单体模式数据流
浏览器
│ HTTP Request
▼
Controller/FeignClient自动映射
│ 参数验证 + 权限校验
▼
Service 业务层
│ 业务逻辑 + 事务管理
▼
Mapper 数据层
│ SQL 执行
▼
MySQL / Redis
▼
返回响应(字典翻译 + 脱敏)
▼
浏览器微服务模式数据流
浏览器
│ HTTP Request
▼
Gateway 网关
│ 路由匹配 + 认证鉴权 + 权限转发
▼
Target Service
│ Controller → Service → Mapper
│ (可调用其他服务 Feign 接口)
▼
RabbitMQ (异步事件)
▼
MySQL / Redis / S3
▼
返回响应(经 Gateway)
▼
浏览器核心组件
1. 认证授权
- RBAC 模型: 用户-角色-菜单-权限码
- JWT 认证: Token 自动续期
- 网关鉴权: 统一认证 + 权限按需转发
- 按钮权限: 前后端双重校验
详细了解
请参考 认证授权系统。
2. 字典管理
- @Dict 注解: 自动翻译字典值
- 前端组件: DictSelect 自动加载选项
- 缓存机制: 内存缓存 + 事件刷新
详细了解
请参考 字典管理。
3. 事件总线
- 统一接口: EventUtil.publish()
- 自动适配: 单体内存 / 微服务 RabbitMQ
- 异步处理: 不阻塞业务
详细了解
请参考 消息服务。
4. 分布式锁
java
// 编程式
LockUtils.runInLock("ORDER_" + orderId, () -> {
// 业务逻辑
});
// 注解式
@GlobalLock(key = "'INVENTORY_' + #productId")
public void deductInventory(Long productId) {}- 单体模式: 内存锁
- 微服务模式: Redis 分布式锁
技术栈
后端核心技术
| 技术 | 版本 | 用途 |
|---|---|---|
| Spring Boot | 3.x | 应用框架 |
| MyBatis Plus | 3.5.x | 数据访问 |
| Spring Cloud | 2025.x | 微服务(可选) |
| Redis | 6.0+ | 缓存/分布式锁 |
| RabbitMQ | 3.12+ | 消息队列(微服务) |
| Nacos | 2.3+ | 服务注册/配置(微服务) |
前端核心技术
| 技术 | 版本 | 用途 |
|---|---|---|
| Vue | 3.x | 前端框架 |
| Vite | 5.x | 构建工具 |
| Element Plus | latest | UI 组件库 |
| Pinia | latest | 状态管理 |
核心框架
- MolanDev Framework: 自研双模部署框架
molandev-rpc: 接口即服务,自动适配本地/远程molandev-event: 统一事件总线molandev-datasource: 智能多数据源路由molandev-lock: 分布式锁molandev-encrypt: 全链路加密