企业级应用架构范例-COLA

软件的首要技术使命:管理复杂度。
             —— «代码大全(第二版)»

在互联网软件开发场景下,产品从0到1的技术挑战往往不是最难的,因为快速上线抢占市场往往是最高优先级, 技术实现上往往可以做减法。然而,从1到100过程中,系统可能变得越来越难以维护,事实上,单从完成需求开发来说, 最简单易懂的Controller -> Service -> DAL这样的三层架构也能实现,不断在这个基础上扩展,就会 造成系统臃肿,学习成本、开发成本以及维护成本越来越高,因此在这个过程中,团队会逐步沉淀出一套大家都能接受 的应用架构规范。一套好的应用架构值得参考学习,特别是架构的演进过程,可以发现很多共性问题。它山之石可以攻玉, 阿里开源的COLA架构是其中的优秀代表,重要的是,COLA架构不是一套架构思想的陈述,而是可以落地的架构实现。

应用架构的目标:

  • 定义一套良好的结构;
  • 治理应用复杂度,降低系统熵值;
  • 从随心所欲的混乱状态,走向井井有条的有序状态。

COLA的初衷就是要在架构层面控制软件复杂度,这张图片看到过多次,形象生动地展示了COLA解决的问题:
pPmyYGj.png

整体分层结构

应用系统确定分层很重要,每一层各司其职,下层对上层屏蔽细节。
COLA的总体分层结构:
pPmyzTS.png

  • 适配层(Adapter Layer):负责对前端展示(web,wireless,wap)的路由和适配,对于传统B/S系统而言,adapter就相当于MVC中的controller;

  • 应用层(Application Layer):主要负责获取输入,组装上下文,参数校验,调用领域层做业务处理,如果需要的话,发送消息通知等。层次是开放的,应用层也可以绕过领域层,直接访问基础实施层;

  • 领域层(Domain Layer):主要是封装了核心业务逻辑,并通过领域服务(Domain Service)和领域对象(Domain Entity)的方法对App层提供业务实体和业务逻辑计算。领域是应用的核心,不依赖任何其他层次;

  • 基础实施层(Infrastructure Layer):主要负责技术细节问题的处理,比如数据库的CRUD、搜索引擎、文件系统、分布式服务的RPC等。此外,领域防腐的重任也落在这里,外部依赖需要通过gateway的转义处理,才能被上面的App层和Domain层使用。

实际上,参考这个分层规范开发,注意领域层和基础设施层的依赖倒置,哪怕不使用COLA提供的其他特性,系统就会清晰很多。

包结构

pPm6afH.md.png

根据这个更加细化的包结构,就能清晰看到代码层面如何设计了。

  • Adapter层:展示层为了适配不同前端展示,在前后端分离架构下,这一层非必须。
  • App层:获取输入,前置校验,做流程编排,同时处理消息等。
  • Domain层:通过领域服务(Domain Service),领域对象(Domain Object)的交互,对上层提供业务逻辑的处理,然后调用下层Repository做持久化处理。
  • Infrastructure层:包括数据库、缓存、rpc、配置、消息中间件等访问。

防腐层设计

防腐层(Anti-Corruption)是DDD中一个解耦的设计思想,简单说,就是应用不要直接依赖外域的信息,要把外域的信息转换成自己领域上下文(Context)的实体再去使用,从而实现本域和外部依赖的解耦。

COLA中,将数据库、搜索引擎等数据存储都列为外部依赖的范畴。利用依赖倒置,统一使用gateway来实现业务领域和外部依赖的解耦。
其实现方式如下图所示,主要是在Domain层定义Gateway接口,然后在Infrastructure提供Gateway接口的实现。
pPmcQUS.md.png

扩展点

业务场景简单的场景下,扩展性要求并不高,但是对于大型互联网公司,业务需求快速迭代的状态下,扩展性是一个必须考虑的要点,否则就会 出现大量的if-else代码,除了常规的策略模式外,还可以再应用框架层面提供扩展点解决方案,扩展点思想来自插件设计模式。
可以通过配置化的方式,管理每一种场景下的扩展实现,在不改动主流程代码的情况下,支持不断的场景变化。

扩展点具体实现可以参考COLA作者的文章以及使用方的总结:
复杂度应对之道 - COLA应用架构
cola扩展点使用和设计初探

COLA Archetype

落实到开发实战中,COLA提供了基于Maven的脚手架,一键生成应用骨架,可以指定生成纯后端服务,或者包含适配层的Web应用。
具体参考官方文档:
https://github.com/alibaba/COLA#dummy

测试支持

测试覆盖率往往是成熟系统的难点,很多系统从开发之初就忽略了测试,或者测试数据难以构造, COLA提供了ColaMock组件,亮点是可自动录制和回放测试数据,这一点在COLA设计中只是简单一提,但是实际应用中 能发挥巨大的作用,极大提高单元测试和集成测试的效率。

COLA架构下数据流

pPmg7YF.md.png

演进

COLA一直在持续演进,可以关注作者张建飞的博客,介绍了每一次演进的思考。 张建飞(Frank)的博客

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @sxzhou Apr 25, 2023

奉献爱心