它是在阿里内部诞生并开源的一种优雅的Java应用架构模式,其理念对现代Java应用开发非常有指导意义。
一、COLA 是什么?
COLA 的全称是 Clean Object-oriented & Layered Architecture(整洁面向对象分层架构)。它是由阿里巴巴大佬张建飞提出并开源的一套旨在约束代码结构、降低系统复杂度、提升可维护性的应用架构框架。
你可以把它理解为 “阿里巴巴版的DDD轻量级实现” 或 “一套强大的应用开发脚手架和规范”。它不仅仅是分层,更包含了一整套组件、规范和最佳实践。
核心设计理念
- 整洁性:倡导简洁、清晰、易于理解的代码结构。
- 面向对象:强调利用OO的特性(封装、继承、多态)来构建富有业务语义的领域模型,而非仅仅是数据对象。
- 分层架构:通过严格的分层来分离关注点,降低耦合。
二、COLA 架构的分层设计
COLA的核心是其分层结构,它通常被划分为四层,依赖关系严格从上到下(上层模块可以直接依赖下层模块,反之则不行)。
下图直观地展示了COLA的四层架构及其核心组件与依赖关系:

1. Adapter Layer(适配层 / 展现层)
- 职责:对接外部,处理外部请求和协议转换。是系统的“输入口”和“输出口”。
- 包含组件:
- Controller:处理HTTP请求(如Spring MVC
@RestController)。 - Consumer:处理消息队列的消息监听。
- Executor:处理定时任务。
- Controller:处理HTTP请求(如Spring MVC
- 关键规则:
- 非常薄的一层,只负责协议解析、转换、校验(如将
HttpServletRequest转换为应用层能理解的Command或Query对象)。 - 不应包含任何业务逻辑。逻辑应委托给下层的
Application Layer。
- 非常薄的一层,只负责协议解析、转换、校验(如将
2. App Layer(应用层)
- 职责:协调任务,是业务流程的组织者。它不处理核心业务逻辑,而是“指挥”领域层去做。
- 包含组件:
- Executor:这是COLA的特色。一个
Executor(命令执行器)通常负责一个特定的用例或流程,例如UserCreateCommandExe专门处理用户创建这个命令。
- Executor:这是COLA的特色。一个
- 关键规则:
- 负责事务控制(通常在此层添加
@Transactional注解)。 - 负责权限校验、日志记录等跨切面关注点。
- 协调多个领域服务(Domain Services)或聚合根(Aggregate Roots)来完成一个业务用例。
- 负责事务控制(通常在此层添加
3. Domain Layer(领域层)
- 职责:表达业务概念和逻辑,是系统的核心和灵魂。体现领域驱动设计(DDD) 的思想。
- 包含组件:
- Entity(实体):有唯一标识和生命周期的对象(如
User)。 - Value Object(值对象):描述一个属性特征的对象,无唯一标识(如
Address)。 - Aggregate(聚合) / Aggregate Root(聚合根):一组相关对象的边界,是外部访问的唯一入口(如
Order聚合根可能包含OrderItem值对象)。 - Domain Service(领域服务):处理一些不自然归属于某个实体的业务逻辑。
- Domain Event(领域事件):表示领域中发生的事件。
- Repository Interface(仓储接口):定义领域对象的持久化操作接口,其实现放在基础设施层。这是依赖倒置原则(DIP) 的体现。
- Entity(实体):有唯一标识和生命周期的对象(如
4. Infrastructure Layer(基础设施层)
- 职责:为上层提供技术实现,是系统的技术细节支撑。
- 包含组件:
- Repository Implementation(仓储实现):使用
MyBatis、JPA等实现领域层定义的仓储接口。 - Persistence:数据库、缓存的具体操作。
- Client Implementation:调用外部系统(如RPC、HTTP接口)的具体实现。
- Config:框架配置。
- Repository Implementation(仓储实现):使用
- 关键规则:
- 上层(特别是领域层)定义接口,基础设施层实现接口,从而让核心业务逻辑不依赖具体技术细节。
三、COLA 的核心组件与扩展
除了分层,COLA还提供了一些开箱即用的组件来强化架构:
-
COLA Components:
- 扩展机制:通过
ExtensionPoint和Extension接口,可以非常优雅地实现业务插件化,处理类似不同渠道有不同的下单逻辑这种场景。 - 身份认证:提供
Identity和Entity等基类。 - 上下文机制:提供
ExecutorContext等来传递执行过程的上下文信息。
- 扩展机制:通过
-
COLA Archetype:
- 提供了Maven原型,可以一键生成符合COLA架构的项目骨架,极大提升了开发效率,保证了项目结构的一致性。
四、COLA 的优势与价值
- 结构清晰,可维护性高:严格的分层和规范让代码结构一目了然,新人更容易上手,也便于长期维护。
- 可测试性好:每一层职责单一,可以很方便地进行单元测试和Mock。领域层不依赖任何实现,可以脱离基础设施进行测试。
- 技术细节与业务逻辑解耦:依赖倒置使得核心业务逻辑不依赖于数据库、缓存等具体技术。未来更换技术栈(如从MySQL迁到OceanBase)的成本很低。
- 拥抱DDD:它很好地实践了DDD的战术设计,帮助开发者写出更面向对象、更能体现业务语义的代码,而不是传统的贫血模型。
- 规范大于配置:通过架构约束和Archetype,统一了团队乃至整个公司的代码风格,减少了因个人习惯不同导致的代码混乱。
五、一个简单的代码示例
以创建用户为例:
-
Adapter Layer (Controller)
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserCreateCommandExe userCreateCommandExe; // 应用层执行器 @PostMapping public Response createUser(@RequestBody UserCreateRequest request) { // 1. 适配层:将HTTP请求转换为Command UserCreateCommand command = new UserCreateCommand(); command.setName(request.getName()); command.setEmail(request.getEmail()); // 2. 调用应用层执行器 return userCreateCommandExe.execute(command); } } -
App Layer (Executor)
@Component public class UserCreateCommandExe { @Autowired private UserDomainService userDomainService; // 领域服务 @Transactional // 事务控制在此层 public Response execute(UserCreateCommand cmd) { // 应用层:协调领域层完成业务逻辑 User newUser = userDomainService.createUser(cmd.getName(), cmd.getEmail()); return Response.buildSuccess(newUser.getId()); } } -
Domain Layer (Domain Service & Entity)
// 领域服务接口 public interface UserDomainService { User createUser(String name, String email); } // 领域服务实现(位于领域层) @Service public class UserDomainServiceImpl implements UserDomainService { @Autowired private UserRepository userRepository; // 仓储接口,依赖倒置! @Override public User createUser(String name, String email) { // 领域逻辑:校验业务规则 if (userRepository.existsByEmail(email)) { throw new BusinessException("邮箱已存在"); } // 创建富有行为的领域实体 User user = new User(name, email); user.doSomething(); // 实体内部可以封装行为 // 持久化 return userRepository.save(user); } } // 领域实体 public class User extends Entity { private String name; private Email email; // 值对象 public User(String name, String email) { this.name = name; this.email = new Email(email); // 构造时校验邮箱格式 } public void doSomething() { // 实体自己的行为方法 } } -
Infrastructure Layer (Repository Impl)
@Repository // Spring的注解,基础设施层 public class UserRepositoryImpl implements UserRepository { // 实现领域层的接口 @Autowired private UserMapper userMapper; // MyBatis Mapper @Override public User save(User user) { UserDO userDO = UserConvertor.toDO(user); // 转换为数据对象 userMapper.insert(userDO); return UserConvertor.toEntity(userDO); // 转换回领域实体 } @Override public boolean existsByEmail(String email) { return userMapper.countByEmail(email) > 0; } }
总结
COLA架构提供了一套行之有效的实践方案,将DDD、整洁架构、面向对象等优秀思想落到了实处。它通过分层、组件和规范,强制开发者写出结构清晰、可维护性高的代码,非常适合作为复杂业务系统中后端应用的基线架构。它不是万能的银弹,但对于希望提升代码质量和工程能力的团队来说,是一个非常值得学习和引入的架构范式。
991

被折叠的 条评论
为什么被折叠?



