前言
每个架构师,对系统应用架构,都有自己的理解。在长期的技术实践中,出现了一堆应用架构产物。但是往往都是思想,没有实实在在的落地的产物。COLA 的横空出世,真正给应用架构落地,提供了优秀的实践。
COLA 的主要目的是为应用架构提供一套简单的可以复制、可以理解、可以落地、可以控制复杂性的”指导和约束"。
目前,COLA发展到4.0,进行一次重新梳理,回归初心,让COLA真正成为应用架构的最佳实践,帮助广大的业务技术同学,脱离酱缸代码的泥潭!
应用架构的本质
摘自官方概述。架构的意义就是要素结构,要素是组成架构的重要元素,结构是要素之间的关系。应用架构的意义就在于定义一套良好的结构,治理应用复杂度, 降低系统熵值,从随心所欲的混乱状态,走向紧紧有条的有序状态。
如下图所示,熵值能够表示事物的混乱程度。越整洁,熵值越低。
好的组织架构会遵循一定的架构模式,大部分的组织都会按职能和业务来设计自己的架构。如果你反其道而行之,硬要把销售、财务和技术人员放在一个部门,就会显得很奇怪。
同样,好的应用架构,也遵循一些共同模式,不管是六边形架构、洋葱圈架构、整洁架构、还是COLA架构,都提倡以业务为核心,解耦外部依赖,分离业务复杂度和技术复杂度。
应用架构的本质,就是要从繁杂的业务系统中提炼出共性,找到解决业务问题的最佳共同模式,为开发人员提供统一的认知,治理混乱。帮助应用系统“从混乱到有序”,COLA架构就是为此而生,其核心职责就是定义良好的应用结构,提供最佳实践。
COLA 架构 - 分层结构
所有的复杂系统都会呈现出层级结构,应用系统处理复杂业务逻辑也应该是分层的,下层对上层屏蔽处理细节,每一层各司其职,分离关注点。
对于一个典型的业务应用系统来说,COLA会做如下层次定义,每一层都有明确的职责定义:
1)适配层(Adapter Layer):负责对前端展示(web,wireless,wap)的路由和适配,对于传统B/S系统而言,adapter就相当于MVC中的controller;
2)应用层(Application Layer):主要负责获取输入,组装上下文,参数校验,调用领域层做业务处理,如果需要的话,发送消息通知等。层次是开放的,应用层也可以绕过领域层,直接访问基础实施层;
3)领域层(Domain Layer):主要是封装了核心业务逻辑,并通过领域服务(Domain Service)和领域对象(Domain Entity)的方法对App层提供业务实体和业务逻辑计算。领域是应用的核心,不依赖任何其他层次;
4)基础实施层(Infrastructure Layer):主要负责技术细节问题的处理,比如数据库的CRUD、搜索引擎、文件系统、分布式服务的RPC等。此外,领域防腐的重任也落在这里,外部依赖需要通过gateway的转义处理,才能被上面的App层和Domain层使用。
COLA 架构 - 包结构
分层是属于大粒度的职责划分,太粗,我们有必要往下再down一层,细化到包结构的粒度,才能更好的指导我们的工作。
还是拿一堆玩具举例子,分层类似于拿来了一个架子,分包类似于在每一层架子上又放置了多个收纳盒。所谓的内聚,就是把功能类似的玩具放在一个盒子里,这样可以让应用结构清晰,极大的降低系统的认知成本和维护成本。
COLA经过不断的迭代,形成的目前的结构:
各个包结构的简要功能描述,如下表所示:
层次 | 包名 | 功能 | 必选 |
Adapter层 | web | 处理页面请求的Controller | 否 |
Adapter层 | wireless | 处理无线端的适配 | 否 |
Adapter层 | wap | 处理wap端的适配 | 否 |
App层 | executor | 处理request,包括command和query | 是 |
App层 | consumer | 处理外部message | 否 |
App层 | scheduler | 处理定时任务 | 否 |
Domain层 | model | 领域模型 | 否 |
Domain层 | ability | 领域能力,包括DomainService | 否 |
Domain层 | gateway | 领域网关,解耦利器 | 是 |
Infra层 | gatewayimpl | 网关实现 | 是 |
Infra层 | mapper | ibatis数据库映射 | 否 |
Infra层 | config | 配置信息 | 否 |
Client SDK | api | 服务对外透出的API | 是 |
Client SDK | dto | 服务对外的DTO | 是 |
考虑功能和领域两个维度包结构定义。按照领域和功能两个维度分包策略,最后呈现出来的,是如下图所示的顶层包节点是领域名称,领域之下,再按功能划分包结构。
经过多次迭代,我们定义出了相对稳定、可靠的应用架构:COLA 4.0
COLA Archetype
好的应用架构,都遵循一些共同模式,不管是六边形架构、洋葱圈架构、整洁架构、还是COLA架构,都提倡以业务为核心,解耦外部依赖,分离业务复杂度和技术复杂度等。
COLA架构区别于这些架构的地方,在于除了思想之外,还提供了可落地的工具和实践指导。
为了能够快速创建满足COLA架构的应用,提供了两个Archetype,在cola-archetypes下面。
- 一个是用来创建纯后端服务的archetype:cola-archetype-service。
- 一个是用来创建adapter和后端服务一体的web应用archetype:cola-archetype-web。
COLA Components
此外,还提供了一些非常有用的通用组件,这些组件可以帮助提升研发效率。
这些功能组件被收拢在cola-components下面。到目前为止,已经沉淀了以下组件:
组件名称 | 功能 | 版本 | 依赖 |
cola-component-dto | 定义了DTO格式,包括分页 | 1.0.0 | 无 |
cola-component-exception | 定义了异常格式, 主要有BizException和SysException | 1.0.0 | 无 |
cola-component-statemachine | 状态机组件 | 1.0.0 | 无 |
cola-component-domain-starter | Spring托管的领域实体组件 | 1.0.0 | 无 |
cola-component-catchlog-starter | 异常处理和日志组件 | 1.0.0 | exception ,dto组件 |
cola-component-extension-starter | 扩展点组件 | 1.0.0 | 无 |
cola-component-test-container | 测试容器组件 | 1.0.0 | 无 |
如何使用COLA
开源地址:https://github.com/alibaba/COLA
- 安装 cola archetype
下载cola-archetypes下的源码到本地,然后本地运行mvn install安装。 - 安装 cola components
下载cola-components下的源码到本地,然后本地运行mvn install安装。 - 创建应用
mvn archetype:generate -DgroupId=com.alibaba.demo -DartifactId=demoWeb -Dversion=1.0.0-SNAPSHOT -Dpackage=com.alibaba.demo -DarchetypeArtifactId=cola-framework-archetype-web -DarchetypeGroupId=com.alibaba.cola -DarchetypeVersion=4.0.0
命令执行成功的话,会看到如下的应用代码结构:
注:也可以使用阿里云的应用生成器:https://start.aliyun.com/bootstrap.html 生成cola应用。
4.运行应用
首先在demoWeb目录下运行mvn install(如果不想运行测试,可以加上-DskipTests参数)。然后进入start目录,执行mvn spring-boot:run。运行成功的话,可以看到SpringBoot启动成功的界面。
生成的应用中,已经实现了一个简单的Rest请求,可以在浏览器中输入 http://localhost:8080/helloworld 进行测试。