企业级低代码平台模块化架构设计
企业级低代码平台模块化架构设计
引言
在企业级低代码平台的建设过程中,架构设计决定了系统的可维护性、可扩展性和团队协作效率。随着业务复杂度的增长,单体架构的弊端日益凸显——代码耦合严重、编译部署缓慢、团队协作冲突频发。模块化架构设计是解决这些问题的核心手段,它将系统拆分为高内聚、低耦合的模块单元,使各模块能够独立开发、测试和部署。
本文将结合企业级低代码平台的实践经验,系统阐述模块化架构的设计原则、分层策略和依赖管理方案。
核心内容
一、模块化架构设计原则
模块化设计遵循以下核心原则:
graph TD
A[模块化设计原则] --> B[高内聚低耦合]
A --> C[单一职责]
A --> D[依赖倒置]
A --> E[开闭原则]
A --> F[接口隔离]
B --> B1[模块内部功能紧密相关]
B --> B2[模块间通过接口通信]
C --> C1[每个模块只负责一个业务域]
D --> D1[上层模块依赖抽象而非实现]
E --> E1[对扩展开放对修改关闭]
F --> F1[模块暴露最小必要接口]
高内聚低耦合是模块化的基石。模块内部的功能应当紧密相关,模块之间只通过明确定义的接口进行交互,避免直接依赖其他模块的内部实现。
单一职责确保每个模块只负责一个业务领域,避免"上帝模块"的出现。当模块职责过多时,任何变更都可能引发连锁反应。
依赖倒置要求上层模块依赖抽象接口,而非具体实现。通过依赖注入(DI)容器管理模块间的依赖关系,实现松耦合。
二、四层分层架构
企业级低代码平台采用 common → infra → system → module 四层架构,层级之间严格遵循单向依赖规则:
graph TB
subgraph "模块层 Module"
M1[业务模块A]
M2[业务模块B]
M3[业务模块C]
end
subgraph "系统层 System"
S1[用户管理]
S2[权限管理]
S3[系统配置]
end
subgraph "基础设施层 Infra"
I1[Redis基础设施]
I2[文件存储基础设施]
I3[Excel基础设施]
I4[安全基础设施]
end
subgraph "通用层 Common"
C1[工具类]
C2[通用常量]
C3[基础实体]
C4[通用注解]
end
M1 --> S1
M1 --> S2
M2 --> S1
M2 --> S3
M3 --> S2
S1 --> I1
S1 --> I4
S2 --> I1
S2 --> I4
S3 --> I2
I1 --> C1
I2 --> C1
I3 --> C1
I4 --> C1
1. Common 通用层
通用层是最底层,不依赖任何其他层,提供全局共享的工具类、常量定义、基础实体和通用注解。
// 通用层示例:基础实体定义
public abstract class BaseEntity {
/** 主键ID */
private Long id;
/** 创建时间 */
private LocalDateTime createTime;
/** 更新时间 */
private LocalDateTime updateTime;
/** 逻辑删除标记 */
private Integer deleted;
}
// 通用层示例:通用常量
public final class CommonConstants {
private CommonConstants() {}
/** 成功状态码 */
public static final int SUCCESS = 200;
/** 分页默认大小 */
public static final int DEFAULT_PAGE_SIZE = 10;
/** 超级管理员角色ID */
public static final Long SUPER_ADMIN_ROLE_ID = 1L;
}
2. Infra 基础设施层
基础设施层封装技术中间件的访问能力,为上层提供统一的技术服务接口。每个基础设施模块独立打包,支持按需引入。
// Redis基础设施模块示例:分布式锁服务
public interface DistributedLockService {
/**
* 尝试获取分布式锁
* @param lockKey 锁的key
* @param waitTime 等待时间
* @param leaseTime 持有时间
* @return 是否获取成功
*/
boolean tryLock(String lockKey, long waitTime, long leaseTime);
/**
* 释放分布式锁
* @param lockKey 锁的key
*/
void unlock(String lockKey);
}
基础设施模块的Maven依赖按需引入:
<!-- 按需引入Redis基础设施 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ys-infra-redis</artifactId>
</dependency>
<!-- 按需引入文件存储基础设施 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ys-infra-file</artifactId>
</dependency>
3. System 系统层
系统层包含平台核心的系统管理功能,如用户管理、权限管理、系统配置等。系统层依赖基础设施层,但不依赖任何业务模块。
// 系统层示例:权限服务接口
public interface PermissionService {
/**
* 获取用户权限列表
* @param userId 用户ID
* @return 权限标识集合
*/
Set<String> getUserPermissions(Long userId);
/**
* 校验用户是否拥有指定权限
* @param userId 用户ID
* @param permission 权限标识
* @return 是否拥有
*/
boolean hasPermission(Long userId, String permission);
}
4. Module 业务模块层
业务模块层是最高层,包含各业务领域的功能模块。业务模块之间禁止直接依赖,必须通过系统层或事件机制进行交互。
graph LR
A[模块A] -->|直接调用| S[系统层服务]
B[模块B] -->|直接调用| S
A -.->|事件驱动| E[事件总线]
B -.->|事件驱动| E
E -.-> A
E -.-> B
style A fill:#e1f5fe
style B fill:#e1f5fe
style S fill:#fff3e0
style E fill:#f3e5f5
三、模块间依赖管理
依赖规则
| 规则 | 说明 | 示例 |
|---|---|---|
| 单向依赖 | 上层可依赖下层,下层不可依赖上层 | Module → System ✓,System → Module ✗ |
| 横向隔离 | 同层模块之间禁止直接依赖 | ModuleA → ModuleB ✗ |
| 接口优先 | 模块间通过接口交互,不依赖实现类 | 依赖 Service 接口而非 Impl |
| 按需引入 | 基础设施模块按需引入,不强制依赖 | 不用Redis则不引入 ys-infra-redis |
模块间通信方式
当业务模块之间需要交互时,推荐以下方式:
// 方式一:通过系统层服务间接调用(推荐)
@Service
public class OrderModuleService {
@Autowired
private UserService userService; // 系统层服务
public OrderVO getOrderDetail(Long orderId) {
Order order = orderMapper.selectById(orderId);
// 通过系统层获取用户信息,而非直接调用用户模块
UserVO user = userService.getUserById(order.getUserId());
return OrderVO.build(order, user);
}
}
// 方式二:通过Spring事件机制解耦
// 事件定义
public class OrderCreatedEvent extends ApplicationEvent {
private final Long orderId;
private final Long userId;
public OrderCreatedEvent(Object source, Long orderId, Long userId) {
super(source);
this.orderId = orderId;
this.userId = userId;
}
}
// 事件发布
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void createOrder(OrderDTO dto) {
// 业务处理...
eventPublisher.publishEvent(new OrderCreatedEvent(this, orderId, userId));
}
}
// 事件监听(其他模块)
@Component
public class InventoryEventListener {
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
// 库存模块处理扣减逻辑
}
}
四、Maven多模块项目结构
graph TD
ROOT[ys-lowcode-pro] --> COMMON[ys-common]
ROOT --> INFRA[ys-infra]
ROOT --> SYSTEM[ys-system]
ROOT --> MODULE[ys-module]
INFRA --> I1[ys-infra-redis]
INFRA --> I2[ys-infra-file]
INFRA --> I3[ys-infra-excel]
INFRA --> I4[ys-infra-security]
INFRA --> I5[ys-infra-ai]
SYSTEM --> S1[ys-system-user]
SYSTEM --> S2[ys-system-permission]
SYSTEM --> S3[ys-system-config]
MODULE --> M1[ys-module-codegen]
MODULE --> M2[ys-module-knowledge]
MODULE --> M3[ys-module-workflow]
父POM统一管理版本:
<dependencyManagement>
<dependencies>
<!-- 内部模块版本统一管理 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>ys-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>ys-infra-redis</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 第三方依赖版本统一管理 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
五、模块化开发规范
模块目录结构规范
每个模块内部遵循统一的目录结构:
ys-module-xxx/
├── src/main/java/com/example/xxx/
│ ├── controller/ # 控制器
│ ├── service/ # 服务接口
│ │ └── impl/ # 服务实现
│ ├── mapper/ # 数据访问
│ ├── entity/ # 数据实体
│ ├── dto/ # 数据传输对象
│ ├── vo/ # 视图对象
│ ├── config/ # 模块配置
│ └── constant/ # 模块常量
├── src/main/resources/
│ └── mapper/ # MyBatis XML
└── pom.xml
模块API暴露规范
模块对外暴露的API应当是最小必要集合,内部实现细节不应暴露给其他模块:
// 模块对外API(放在service包根目录)
public interface CodegenService {
/** 生成代码 */
CodegenResult generateCode(CodegenRequest request);
}
// 内部实现(放在service/impl包,不对外暴露)
@Service
public class CodegenServiceImpl implements CodegenService {
// 内部实现细节...
}
结论与建议
关键建议
-
严格遵循分层依赖规则:任何违反单向依赖的代码都应在Code Review阶段被拦截,可通过ArchUnit等架构测试工具自动化检查。
-
基础设施模块按需引入:不要为了"方便"而引入不需要的基础设施模块,每个额外依赖都会增加编译时间和维护成本。
-
业务模块间优先使用事件驱动:当模块间存在交互需求时,优先考虑事件机制,避免模块间的直接耦合。
-
统一版本管理:所有模块版本在父POM的
dependencyManagement中统一管理,禁止子模块自行指定版本号。 -
定期架构审查:随着项目迭代,模块边界可能逐渐模糊,建议每季度进行一次架构审查,及时纠正依赖违规。
架构演进方向
graph LR
A[单体模块化] --> B[服务化拆分]
B --> C[微服务架构]
style A fill:#c8e6c9
style B fill:#fff9c4
style C fill:#ffccbc
模块化架构是向微服务演进的基础。当某个业务模块的流量和团队规模增长到需要独立部署时,模块化设计使得拆分过程平滑自然,无需大规模重构。