DDD读书笔记

《DDD实战-欧创新》

  • DDD是什么?

“DDD是一种指导思想和方法论,指导拆分复杂业务、划分边界和建设领域模型,并最终指导微服务系统建设落地(draft)”

  • 如何使用DDD

“使用事件风暴进行业务领域建模 -> 使用DDD的战术设计,设计聚合、实体、值对象、领域服务、领域事件以及应用服务等领域对象 -> 再使用DDD的分层架构模型(4层)完成微服务的设计”

  • 如何进行领域建模?

参照 11 10 | DDD、中台和微服务:它们是如何协作的?

总结:按照业务流程划分领域,划分为核心域、通用域和支撑域到合适的粒度,并反复推敲,对于重复或需要重组的领域对象,提炼并重构主领域对象。

  • 使用事件风暴构建微服务步骤

    • 第一步:产品愿景

      • 对产品顶层价值的设计,使产品目标用户、核心价值、差异化竞争点等信息达成一致

      • 例如:为了。。。。。我们需要做。。。。。,为此我们需要xxx核心/通用中台,实现。。。。功能,最终达成。。。。。目标

    • 第二步:业务场景分析

      • 从用户视角触发,根据业务流程或用户旅程,采用用例和场景分析,探索领域中的典型场景,找出领域事件、实体和命令等领域对象,支持领域建模

      • 例如:创建系统的命令会触发系统已创建的事件

    • 第三步:领域建模

      • 根据场景分析中产生的领域对象,比如领域事件、命令等,找出产生这些命令的实体,分析实体之间的关系组成聚合,为聚合划定限界上限文,建立领域模型和领域模型之间的依赖,领域模型利用限界上下文向上可以指导微服务设计,通过聚合向下可以指导聚合根、实体和值对象的设计。

        • 1.根据事件和命令,提取实体

        • 2.从多个实体中找到聚合根,并根据聚合根以及实体之间的依赖关系,组合实体成为聚合

        • 3.划定限界上线文,根据上线文归类聚合

    • 第四步:进行微服务设计

      • 理论上一个领域模型对应一个微服务,具体实施还是需要根据团队的现状来看。

 

  1. 实体和值对象的区别

     

    实体

    值对象

    是否有唯一Id

       

    是否有行为

       

    是否是class

     
    • 不一定,可能是class,可能是简单的属性

    从属关系

    值对象是实体的属性,用于描述实体

    定义

    代表一个子域,有属性、行为和逻辑,是充血模型

    聚合具有相同特征的一类属性(可能就一个,那就不用定义class了),一般没有行为和逻辑,聚合到实体,是实体的一个属性,一般是贫血模型

  2. 聚合根

    1. 是实体,有生命周期,有全局唯一id,负责协调和组织聚合内各实体和值对象协同完成业务逻辑;

    2. 一个聚合内只有一个聚合根

  3. 聚合

    1. 一组业务关系紧密的实体、值对象、聚合很的集合

    2. 一个微服务有多个聚合,一个聚合有多个实体、值对象、命令、领域事件等。

    3. 根据需要,一个聚合可以单独拆出来作为微服务,比如这个聚合遇到高并发挑战了。

  4. 领域服务(DomainService)

    1. 单一实体(或者值对象)不能实现时,领域服务就会出马,它可以组合聚合内的多个实体(或者值对象),实现复杂的业务逻辑。

  5. 实体方法、领域服务、应用服务的区别

    类型

    说明

    所在的包

    实体方法

    实体entity的function,比如createAddress(),原子业务逻辑

    domain.entiry

    领域服务

    domainService,具体多个实体方法,完成较为复杂的业务功能

    domain.service

    应用服务

    APPService,编排和聚合领域服务,对上层facade提供完成的接口业务能力

    application.service

  6. 命令(动作)

    1. 一个业务行为,例如支付这个动作

  7. 领域事件

    1. 命令产生的结果,该结果可能引发后续动作,可能不会引发就此结束;例如支付完成后会产生支付完成事件,会触发财务入账等后续动作。

  8. DDD分层架构

    分层

    功能

    常见的功能

    交互规则和职责边界

    用户接口层

    • 接受用户指令,展示结果

    • 用户

    • 程序

    • 自动化脚本

    • API

    • DTO

    应用层

    • 很薄的一层,不干涉领域行为

    • 能够快速响应业务需求

    • 实现面向用户操作相关的用例和流程

    • 协调和组织多个聚合,完成业务逻辑

    • 组合、编排和转发服务

    • 负责处理业务用例的执行顺序以及结果的拼装

    • 安全认证

    • 权限校验

    • 事务控制

    • 发送或订阅领域事件

    • Application service

    领域层

    • 包括实体、值对象、领域服务和聚合

    • 保持长期稳定

     
    • 聚合(Aggregate)

      • Entity

      • ValueObject

      • DomainService

    • MapperXML

    • Repository(仓储接口)

    基础设施层

    • 贯穿所有层,为其他各层(即用户接口层、应用层和领域层都可以访问该层)提供通用的技术和基础服务

    • 数据库

    • 缓存

    • 消息中间件

    • 第三方工具

    • 驱动

    • 网关

    • 文件

    • Repository AOP(仓储实现)

    • 缓存

    • 消息中间件

    • 第三方工具

    • 驱动

    • 网关

    • 文件

  9. 边界

    边界

    说明

    逻辑边界

    聚合的编辑

    物理边界

    微服务之间的边界,不同微服务部署位置和运行环境是相互隔离的

    代码边界

    不同层或者聚合之间代码目录的边界

posted @ 2023-03-23 23:01  Katsu  阅读(15)  评论(0编辑  收藏  举报