总体目录结构(模块化设计)
text
.
├── 📁 _docs # 项目文档
│ ├── 📄 ARCHITECTURE.md # 架构设计
│ └── 📄 DEPLOYMENT.md # 部署指南
│
├── 📁 _infra # 基础设施配置
│ ├── 📁 docker # Docker 容器配置
│ ├── 📁 k8s # Kubernetes 部署文件
│ └── 📁 terraform # 云服务编排(AWS/GCP)
│
├── 📁 modules # 核心业务模块(每个模块独立)
│ ├── 📁 common # 公共模块(工具、通用组件)
│ ├── 📁 user # 用户模块(完整分层架构)
│ ├── 📁 order # 订单模块
│ └── ... # 其他业务模块
│
├── 📁 services # 微服务入口(独立部署)
│ ├── 📁 gateway # API 网关服务
│ ├── 📁 user-service # 用户微服务
│ └── ... # 其他微服务
│
├── 📁 libs # 自研工具库(可选)
│ ├── 📁 auth-client # 统一认证客户端
│ └── 📁 logging-starter # 日志 Starter
│
├── 📄 pom.xml # 父级 Maven 配置(聚合模块)
└── 📄 README.md # 项目总览单个业务模块(以 user 模块为例)
text
📁 user
├── 📁 src/main/java
│ └── 📁 com.company.user
│ ├── 📁 api # 接口层(API 定义)
│ │ ├── 📁 rest # REST Controller
│ │ ├── 📁 rpc # RPC 接口(如 gRPC)
│ │ └── 📁 event # 消息订阅/发布(如 Kafka)
│ │
│ ├── 📁 application # 应用层(业务流程编排)
│ │ ├── 📁 command # 命令处理(CQRS)
│ │ ├── 📁 query # 查询处理(CQRS)
│ │ └── 📁 service # 应用服务(事务、权限)
│ │
│ ├── 📁 domain # 领域层(DDD 核心)
│ │ ├── 📁 model # 聚合根、实体、值对象
│ │ ├── 📁 repository # 仓库接口(领域层定义)
│ │ ├── 📁 event # 领域事件
│ │ └── 📁 service # 领域服务(无状态逻辑)
│ │
│ ├── 📁 infrastructure # 基础设施层(实现细节)
│ │ ├── 📁 persistence # 数据库实现(JPA/MyBatis)
│ │ ├── 📁 cache # 缓存实现(Redis)
│ │ ├── 📁 client # 外部服务调用(Feign)
│ │ └── 📁 message # 消息队列实现(Kafka/RabbitMQ)
│ │
│ └── 📁 config # 模块配置类(Spring Beans)
│ ├── 📄 WebConfig.java
│ └── 📄 SecurityConfig.java
│
├── 📁 src/main/resources
│ ├── 📁 db/migration # 数据库迁移脚本(Flyway)
│ ├── 📁 i18n # 国际化资源
│ ├── 📄 application.yml # 主配置
│ └── 📄 application-dev.yml # 开发环境配置
│
├── 📁 src/test # 测试代码
│ ├── 📁 java
│ │ ├── 📁 application # 应用层测试
│ │ ├── 📁 domain # 领域层测试
│ │ └── 📁 api # API 集成测试
│ └── 📁 resources # 测试资源
│
└── 📄 pom.xml # 模块依赖配置关键分层详解
1. 接口层 (api)
• 职责:处理外部请求(HTTP/RPC/消息),仅做参数校验和格式转换。 • 示例代码:
java
@RestController
public class UserController {
@PostMapping("/users")
public UserResponse createUser(@Valid @RequestBody UserRequest request) {
return userAppService.createUser(request);
}
}2. 应用层 (application)
• 职责:编排领域对象,处理事务、权限和跨领域协调。 • CQRS 示例:
java
public class UserCommandHandler {
public void handle(CreateUserCommand command) {
User user = UserFactory.create(command);
userRepository.save(user);
eventPublisher.publish(new UserCreatedEvent(user.getId()));
}
}3. 领域层 (domain)
• 职责:封装核心业务逻辑,不依赖任何外部框架。 • 聚合根示例:
java
public class User {
public void changePassword(String newPassword) {
if (newPassword.length() < 8) {
throw new InvalidPasswordException();
}
this.password = encrypt(newPassword);
}
}4. 基础设施层 (infrastructure)
• 职责:实现技术细节(数据库、缓存、消息队列)。 • 仓库实现示例:
java
@Repository
public class UserRepositoryImpl implements UserRepository {
@Autowired
private JpaUserRepository jpaRepo;
@Override
public User findById(Long id) {
return jpaRepo.findById(id).orElseThrow();
}
}微服务目录示例(user-service)
text
📁 user-service
├── 📁 src/main/java
│ └── 📁 com.company.user.service
│ ├── 📁 bootstrap # 服务启动类
│ ├── 📁 adapter # 适配其他服务的客户端
│ └── 📁 config # 服务专属配置
├── 📁 src/main/resources
│ ├── 📄 bootstrap.yml # Spring Cloud 配置
│ └── 📄 application.yml # 服务配置
├── 📁 k8s # 独立部署配置
│ └── 📄 deployment.yaml
└── 📄 Dockerfile核心原则
- 模块独立:每个业务模块可独立编译、测试和部署。
- 分层依赖:text
接口层 → 应用层 → 领域层 ← 基础设施层 - 技术无关性:领域层不依赖 Spring、数据库等具体技术。
适用场景
• 微服务架构:每个模块可拆分为独立服务。 • 复杂业务系统:电商平台、金融系统、ERP 等。 • 团队协作:模块由不同团队负责,减少代码冲突。
通过此结构,超大型项目可以保持 高内聚、低耦合,轻松应对业务扩展和技术演进。