代码组织 - DDD 六边形架构

2022/2/16 探索实践总结Go

一提到代码组织,想必大家第一个印象便是分层,分层的带来的好处是什么:

  • 隔离不同关注点。高层关注业务逻辑、低层关注基础设置
  • 隔离业务复杂度与技术复杂度
  • 提高复用
  • 降低耦合

分层的原则是什么?

  • 层次越高,越面向业务、用户
  • 层次越低,越通用,面向设备
  • 封装变化。层之间解耦,将各层的影响降到最低

对于分层架构中层次的界定,Martin Fowler给出了一个判定的方法,就是如果把表示层换成其他实现,如果和原来的表示层有重复实现的内容,那么这部分内容就应该放到业务逻辑层

传统的分层,我们会将系统分为表示层、业务逻辑层以及数据访问层:

  • 表现层 - controller:json、xml等
  • 逻辑层 - service:业务逻辑
  • 数据访问层 - dao:orm 、关系型数据库

注:Common或Utility,提供共用或通用方法或行为的支持

对于传统分层有什么特点:

  • 层依赖下层。下层不能依赖上层。
  • 适合逻辑简单的服务(CRUD),比如:直接提供对数据库增删改查,简单的信息管理
  • 数据为中心,数据驱动
  • 无法适应复杂业务多维度依赖

随着某些核心业务的访问量发展,通常我们需要去进行优化的措施,比如加缓存,加MQ,换数据源

另外,核心业务的复杂程度不断提高,数据驱动开始显得有些力不从心,需要能有跟好方式进行代码组织 - DDD的出现很好的解决了复杂性的问题,开启了从以数据为中心向基于任务的设计转变的过程,目前比较成熟的架构架构风格有:洋葱架构、干净架构、六边形架构,以六边形架构为例,整体组织架构如下:

image.png

  • 内层业务逻辑
  • 外层依赖内层
  • 左边向右边驱动
  • 外层为驱动逻辑、基础设施或其他应用

它的特点是:

  • 解决了业务逻辑和表示层代码交错的问题
  • 前端需求多变,核心领域稳定
  • 用例和流程会随外部需求随时调整
  • 不同的客户通过"平等"的方式与系统交互
  • 六边形架构也称为端口与适配器