深入解析 COLA 4.0:构建优雅的 Java 应用架构
1 什么是 COLA?
COLA (Clean Object-oriented and Layered Architecture) 是阿里巴巴大神张建飞(Frank)提出并开源的一种面向对象的、整洁的、分层的Java应用架构框架。它的核心使命是帮助开发者构建一个职责清晰、可复用、可测试、高可维护的应用程序,旨在约束和治理混乱的代码结构,让应用架构真正成为可传承、可复用的系统资产。
COLA 发展至今已到 4.0 版本,其功能与思想都已非常成熟,成为了众多企业和团队构建复杂业务系统的首选架构范式。
2 COLA 4.0 的核心设计思想
在深入其组成之前,理解其核心思想至关重要:
- 整洁性 (Clean): 强调代码的简洁、清晰和可读性,遵循面向对象设计原则(如SOLID)。
- 分层架构 (Layered Architecture): 通过明确的层级划分,分离不同的关注点,降低系统复杂度。
- 领域驱动设计 (DDD) 友好: COLA 的分层与 DDD 的层次(用户接口层、应用层、领域层、基础设施层)天然契合,是实践 DDD 的理想脚手架。
- 组件化与扩展性: 将应用拆分为多个模块(Module)和组件(Component),并通过扩展点(ExtensionPoint)机制支持灵活的扩展。
3 COLA 4.0 的分层架构
COLA 4.0 的核心是其清晰的分层架构设计,它严格定义了每一层的职责和依赖关系,确保了代码的隔离性和可维护性。其标准的四层架构如下图所示:

3.1 各层详细职责
- 用户接口层 (User Interface Layer):
- 职责: 负责接收用户请求(如HTTP),解析参数,返回响应。不应包含任何业务逻辑。
- 常见组件: Controller, DTO (Data Transfer Object), Assembler (负责DTO与领域对象的转换)。
- 应用层 (Application Layer):
- 职责: 负责用例的编排和业务流程的组合。它协调多个领域服务来完成一个特定的业务用例(如“用户下单”)。不应包含核心业务规则。
- 常见组件: App Service, Command Executor, Query Executor。
- 领域层 (Domain Layer):
- 职责: 这是系统的核心,包含核心业务逻辑和领域规则。
- 常见组件:
- Entity (实体): 具有唯一标识和生命周期的领域对象(如Order)。
- Value Object (值对象): 描述领域特征的不可变对象(如Address)。
- Domain Service (领域服务): 处理一些不属于单个实体的业务逻辑。
- Repository Interface (仓储接口): 定义领域对象的持久化操作,其实现放在基础设施层。
- 基础设施层 (Infrastructure Layer):
- 职责: 为上层提供技术实现支撑,是细节的实现者。
- 常见组件: Repository Interface 的实现(如MyBatis Mapper、JPA EntityManager)、外部RPC调用、消息中间件客户端、配置管理等。
依赖规则: 上层可以依赖下层,但下层绝不能依赖上层。这是一种单向依赖关系,确保了领域核心的纯粹性。
4 COLA 4.0 的项目结构
COLA 倡导使用多模块(Multi-Module)来组织代码,与分层架构完美对应。一个标准的 COLA 项目结构如下所示:
my-cola-app ├── my-cola-app-adapter/ # 适配器模块(对应用户接口层) │ ├── controller/ # Web控制器 │ └── assembler/ # DTO装配器 ├── my-cola-app-app/ # 应用层模块 │ ├── executor/ # 命令/查询执行器 │ └── service/ # 应用服务 ├── my-cola-app-domain/ # 领域层模块(核心) │ ├── model/ # 领域模型(Entity, VO) │ ├── service/ # 领域服务 │ └── repository/ # 仓储接口 ├── my-cola-app-infrastructure/ # 基础设施层模块 │ └── repository/persistence/ # 仓储接口的实现(如MyBatis Mapper) └── my-cola-app-client/ # Client模块(可选) ├── dto/ # 对外暴露的DTO └── api/ # 对外暴露的Service API这种模块化划分强制实施了物理边界,使得层级关系更加清晰,避免了代码的随意耦合。
5 COLA 4.0 的核心组件与特性
5.1 扩展点机制 (ExtensionPoint)
这是 COLA 中非常巧妙的设计,用于解决业务的扩展和定制化需求,符合开闭原则。
- ExtensionPoint: 扩展点接口,是一个标记接口。定义一个业务扩展点。
- Extension: 扩展实现,使用
@Extension注解。提供该扩展点的具体实现。 - ExtensionExecutor: 扩展点执行器,负责根据上下文(Biz Scenario)选择合适的扩展来执行。
// 1. 定义扩展点 public interface PaymentExtPt extends ExtensionPoint { void pay(Order order); } // 2. 实现扩展(例如支付宝支付) @Extension(bizId = "trade", useCase = "order", scenario = "alipay") public class AlipayPaymentExtension implements PaymentExtPt { @Override public void pay(Order order) { // 调用支付宝SDK } } // 3. 使用扩展点执行器 @Resource private ExtensionExecutor extensionExecutor; public void pay(Order order, String scenario) { extensionExecutor.execute(PaymentExtPt.class, new BizScenario("trade", "order", scenario), ext -> ext.pay(order)); }这种机制将不同的业务实现解耦,只需通过配置不同的 bizId, useCase, scenario即可路由到不同的实现,非常灵活。
5.2 整洁架构实践
COLA 完美体现了 Robert C. Martin 的整洁架构(Clean Architecture) 思想。其依赖关系如下图所示,依赖方向总是由外向内,领域层作为核心保持独立性与稳定性:

- 领域层 (Domain) 是核心,最稳定,不依赖任何其他层。
- 应用层 (App) 依赖领域层。
- 外层 (Adapter & Infrastructure) 是实现细节,依赖内层。它们可以轻易被替换(如替换数据库、Web框架),而不影响核心业务逻辑。
6 如何使用 COLA 4.0?
- 定义领域模型: 在
domain模块中,根据业务设计你的 Entity、Value Object。 - 编写仓储接口: 在
domain模块中定义 Repository 接口。 - 实现基础设施: 在
infrastructure模块中,使用 MyBatis、JPA 等技术实现 Repository 接口。 - 编写应用服务: 在
app模块中,编排领域服务,处理业务用例。 - 暴露API: 在
adapter模块中,编写 Controller,调用 App Service。
初始化项目: 可以使用官方提供的 cola-archetype快速生成项目骨架。
mvn archetype:generate -DgroupId=com.yourcompany -DartifactId=your-app -DarchetypeArtifactId=cola-framework-archetype -DarchetypeGroupId=com.alibaba.cola -DarchetypeVersion=4.0.07 总结:COLA 4.0 的优势与适用场景
优势:
- 结构清晰: 强制性的分层和模块化,使项目结构一目了然。
- 强约束性: 通过架构框架来约束代码,防止架构被破坏。
- 可维护性高: 核心业务逻辑高度内聚,易于理解和修改。
- 可测试性好: 各层职责单一,便于单元测试和集成测试。
- 扩展性强: 扩展点机制支持灵活的业务扩展。
适用场景:
- 中大型复杂的业务系统,需要长期迭代和维护。
- 团队需要统一的架构规范和约束。
- 希望实践领域驱动设计(DDD)和整洁架构(Clean Architecture)的项目。
COLA 4.0 不仅仅是一个框架,更是一套架构方法论和最佳实践的集合。它为解决Java应用,特别是业务系统的架构治理问题,提供了一个非常优秀的标准答案和落地实践。