浅谈对DDD与Cola的学习与思考

13,150 阅读5分钟

前言

最近刚入职阿里不久,发现内部项目大多采用DDD设计,由于自己之前也没有过多的接触过,便抽时间去学习了一下,在这期间也阅读了大佬大飞哥的文章。今天,在大年初一这天,就简单了聊一聊我对DDD的学习分享。

一、什么是DDD

DDD:全称 Domain-driven design 驱动领域设计 驱动领域设计其实是一种通过将实现连接到持续进化的模型来满足复杂需求的软件开发方法。 这样说,可能听起来很模糊。 其实简单来说:就是为了解决业务的复杂性。

1.1使用前提:

既然是解决业务的复杂性,那肯定是复杂的业务才会用的到,那么DDD也应该是有一定的使用前提才对。

  • 把项目的主要重点放在核心领域(core domain)和域逻辑

  • 把复杂的设计放在有界域(bounded context)的模型上

  • 发起一个创造性的合作之间的技术和域界专家以迭代地完善的概念模式,解决特定领域的问题

领域驱动设计是一种由域模型来驱动着系统设计的思想,不是通过存储数据词典(DB表字段、ES、 Mapper字段等等)来驱动系统设计。领域模型是对业务模型的抽象,DDD是把业务模型翻译成系统架构设计的一种方式。

1.2DDD三层架构:

image.png

  • API:API层是作为对外打包、前端接口调用使用。Domian层是整个域模型,不能直接把它打包成maven给别人使用,也不能直接把它作为接口给前端使用,有些需要API层作为进行转换后调用Domain,对调用Domain返回的数据进行包装筛选后再返回出去。

  • Domain:系统的核心层,所有具体的业务逻辑处理、事件处理等都在这层域模型中处理。

  • Repository:数据源代理层,Repository 层类似一个网关代理,它本身没有数据,数据都是通过它的代理来被Domain层访问,被代理的数据源不仅仅可以是DB、ES还可以是HTTP、RPC任何与Domain层进行数据交互的都叫Repository。

1.3业务理解

既然已经了解了DDD,也知道了它的使用前提;那么对于一个业务系统来说,如何进行DDD的建模设计以及领域模型的划分就是最为重要的了。

只有充分的理解业务,梳理业务的每一个细节,才能有效的将业务模型转化为领域模型。

下面我以一个电商系统为例,进行一下简单的领域分析

电商系统在我们生活中是最为常见的一种。商品、订单、交易、配送等等,每一个子系统都是极其复杂的。

image.png 比方说:我以淘宝的一个商品为例。我们从图上可以获取到的信息有很多:

  • 商品图片、商品名称、商品价格
  • 商品活动
  • 运费、配送信息等等

梳理业务: 在梳理业务过程中会把业务每一个具体的点都给罗列出来。通过对业务的理解进行抽象,把相关性的业务点进行分组聚合。业务抽象过程中涉及边界划分问题,比如商品价格信息和商品活动价格信息是统一抽象成商品基础信息,还是分别抽象成商品基础信息和商品营销信息?在商品业务中,一个商品可以参加多个活动,该商品下的所有营销活动都是同一个商品基础信息,但商品的每个营销活动信息可以不同(可以是免配送费、也可以是满xx减xx),在商品业务中商品基础信息和商品营销信息是需要抽象成两个独立的业务模块。

image.png

模型转化: 当我们对业务进行了梳理,进行了简单的业务模型拆分,那么我们就可以把业务模型经过简单翻译映射成域模型即可。

image.png

二、Cola又是什么?

Cola是阿里开源框架,可以说是DDD的实现。

提倡以业务为核心,解耦外部依赖,分离业务复杂度和技术复杂度。

帮助应用系统“从混乱到有序”,COLA架构就是为此而生,其核心职责就是定义良好的应用结构,提供最佳实践。

2.1cola分层结构:

image.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层使用。

2.2cola分包结构:

image.png cola4.0结构:

  1. COLA架构:关注应用架构的定义和构建,提升应用质量。
  2. COLA组件:提供应用开发所需要的可复用组件,提升研发效率。 image.png

2.3cola的快速使用

COLA 开源地址: github.com/alibaba/COL…

三、对于DDD的思考

其实对于设计领域模型而言,并没有绝对的正确与错误。只要是最适合自己业务系统的领域模型那就是最好的了。本人自己也是在DDD的学习过程中,不断的去思考如果是自己应该如何去设计。

像一个电商系统中,其实可以是"横向DDD"

image.png

也可以是"纵向DDD"

image.png

本文是自己的一些学习理解,若有不对,可以指正,共同进步。