第一章:序言------从混沌到有序的演进
在互联网软件开发的漫长历史中,我们一直在与"复杂度"做斗争。早期的单体应用往往随着业务的迭代,逐渐演变成"大泥球(Big Ball of Mud)"架构:业务逻辑分散在Controller、Service甚至DAO层,上帝类(God Class)横行,牵一发而动全身。
为了解决业务代码的混乱问题,阿里巴巴的技术专家张建飞(Frank Zhang)提出了COLA架构。COLA的全称是 Clean Object-Oriented and Layered Architecture ,即"整洁面向对象分层架构"。它的核心使命是:让业务逻辑与技术细节解耦,控制软件复杂度。
COLA的演进并非一蹴而就,它经历了几个关键版本的迭代:
-
COLA 1.0 (萌芽期): 重点在于规范分层,引入了Command模式来处理请求,初步尝试解决业务逻辑的组织问题。
-
COLA 2.0 (探索期): 引入了CQRS(命令查询职责分离)架构风格,试图将写操作和读操作分离,以应对高性能场景,但同时也增加了系统的理解成本。
-
COLA 3.0 (成熟期): 深度拥抱DDD(领域驱动设计)。重点强化了"扩展点(Extension)"设计,为了解决阿里的多业务线(多租户)共存问题,提供了一套优雅的SPI机制。
-
COLA 4.0 (返璞归真): 也是目前的主流版本。作者将COLA拆分为两个独立的部分:
-
COLA Architecture(架构原型): 纯粹的Maven Archetype,规范代码分层结构。
-
COLA Components(组件): 可选的框架组件(如状态机、扩展点),不再强制绑定。
这意味着COLA不再是一个"重型框架",而更多是一种"架构思想"和"工程规范"。
-
第二章:COLA的设计原理与应用场景
2.1 设计原理
COLA的设计深受"洋葱架构(Onion Architecture)"和"六边形架构(Hexagonal Architecture)"的影响,其核心原则可以概括为以下三点:
-
关注点分离(Separation of Concerns):
将**业务复杂度假定(Business Logic)与技术复杂度假定(Technical Details)**完全切分。
-
业务逻辑(Domain)应该是纯净的,不依赖数据库、缓存、MQ等具体技术实现。
-
技术细节(Infrastructure)应该围绕业务逻辑服务,作为插件存在。
-
-
依赖倒置(Dependency Inversion):
传统的分层架构是:Web -> Service -> DAO -> DB,上层依赖下层。
COLA遵循DDD原则:外层依赖内层,内层不依赖外层。 核心的Domain层不依赖任何层,Infrastructure层依赖Domain层(通过实现Domain定义的接口)。
-
统一的各种之道(Standardization):
COLA强制规定了DTO、Entity、DO(Data Object)的转换边界,规范了包的命名和异常处理。这使得不同团队开发的代码风格高度一致,"像同一个人写出来的"。
2.2 应用场景
并不是所有项目都适合COLA,架构的选择需要权衡成本与收益。
适合场景:
-
中大型B端业务系统: 如CRM、ERP、供应链系统。这类系统业务逻辑复杂,状态流转多,核心资产在于"领域模型"。
-
多业务线共存系统: 例如一个电商中台,需要同时支持C2C、B2C、O2O等多种交易模式,逻辑大同小异但又有定制化差异,COLA的扩展点机制能大显身手。
-
遗留系统重构: 将杂乱无章的单体应用逐步重构为符合DDD规范的模块化应用。
不适合场景:
-
简单的CRUD应用: 如果你的系统只是简单的增删改查,强行套用COLA会引入过多的对象转换(DTO -> Entity -> DO),导致开发效率降低,得不偿失。
-
追求极致性能的中间件: COLA的分层和抽象会带来微小的性能损耗,不适合网关、代理等底层基础设施开发。
第三章:代码结构与模块功能解析
COLA 4.0 推荐的标准Maven多模块结构通常包含四个核心模块:adapter、client、app、domain 和 infrastructure。
以下是自外向内的结构解析:
1. Adapter层(适配层)
-
功能: 负责对前端展示(Web)、移动端(Wireless)、三方系统(Wap)的请求进行适配。它是流量的入口。
-
包含内容:
-
Controller: 处理HTTP请求。
-
Consumer: 处理MQ消息。
-
Scheduler: 处理定时任务。
-
-
职责: 解析参数,调用App层接口,并将结果封装成ViewModel返回。它不处理任何业务逻辑。
2. Client层(API层/SDK层)
-
功能: 对外暴露的接口定义,通常作为一个独立的Jar包发布给调用方。
-
包含内容:
-
DTO (Data Transfer Object): 命令对象(Command)、查询对象(Query)、响应对象(Response)。
-
API Interface: 服务接口定义。
-
-
特点: 轻量级,不包含任何业务逻辑实现,只包含POJO和接口。
3. App层(应用层)
-
功能: 系统的"指挥官",负责用例(Use Case)的编排。
-
职责:
-
编排(Orchestration): 它不处理具体的状态变更逻辑,而是通过调用Domain层的能力来完成业务。例如:"开启事务 -> 获取领域对象 -> 调用领域方法 -> 保存 -> 发送事件"。
-
权限校验、事务控制: 通常在这里处理。
-
-
核心组件: Executor(命令执行器)。
4. Domain层(领域层/核心层)
-
功能: 系统的"心脏",也是最核心的资产。这里严禁依赖Spring Web、MyBatis等具体技术框架,只依赖JDK。
-
包含内容:
-
Entity(实体): 具有唯一标识的业务对象,包含业务行为(方法)。
-
Value Object(值对象): 描述特征的对象,不可变。
-
Domain Service(领域服务): 处理跨实体的业务逻辑。
-
Gateway Interface(网关接口): 定义了从外部获取数据或操作外部的接口(即Repository接口的泛化),注意这里只定义接口,不实现。
-
5. Infrastructure层(基础设施层)
-
功能: 提供具体的"技术实现",是Domain层Gateway接口的实现者。
-
职责:
-
数据库交互: 包含Mapper、DO(Data Object)、MyBatis/JPA配置。实现Domain层定义的Repository接口。
-
防腐层(ACL): 调用第三方RPC接口或中间件,并将其转化为Domain层能理解的对象。
-
配置类: Spring Boot的各种Config配置。
-
-
依赖关系: 它依赖Domain层(为了实现接口)和Client层。
第四部分:总结
COLA架构并不是一项具体的技术创新,而是一次对软件工程设计原则的回归与标准化。
作为架构师,我们在选择COLA时,看中的不仅仅是它的代码模板,更是它背后蕴含的DDD(领域驱动设计)思想。
欢迎关注,一起交流,一起进步~