# leave-sample **Repository Path**: coding-tao/leave-sample ## Basic Information - **Project Name**: leave-sample - **Description**: 基于极客时间《DDD实战课》专栏,复刻专栏实战的落地。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2022-04-18 - **Last Updated**: 2022-04-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # leave-sample ## 介绍 基于极客时间《DDD实战课》专栏,复刻专栏实战的落地。 ## 笔记 ### DDD/微服务/中台的关系 - 中台本质是业务模型 - 微服务是业务模型的系统落地 - DDD 是一种设计思想,它可以同时指导中台业务建模和微服务设计 ### DDD与微服务的关系 - DDD 是一种架构设计方法,微服务是一种架构风格,两者从本质上都是为了追求高响应力,而从业务视角去分离应用系统建设复杂度的手段。两者都强调从业务出发,其核心要义是强调根据业务发展,合理划分领域边界,持续调整现有架构,优化现有代码,以保持架构和代码的生命力,也就是我们常说的演进式架构 - DDD 主要关注:从业务领域视角划分领域边界,构建通用语言进行高效沟通,通过业务抽象,建立领域模型,维持业务和代码的逻辑一致性 - 微服务主要关注:运行时的进程间通信、容错和故障隔离,实现去中心化数据管理和去中心化服务治理,关注微服务的独立开发、测试、构建和部署。 ### DDD 包括战略设计和战术设计两部分 - 战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,限界上下文可以作为微服务设计的参考边界 - 战术设计则从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等代码逻辑的设计和实现 ### 三步划定领域模型和微服务的边界 - 第一步:在事件风暴中梳理业务过程中的用户操作、事件以及外部依赖关系等,根据这些要素梳理出领域实体等领域对象 - 第二步:根据领域实体之间的业务关联性,将业务紧密相关的实体进行组合形成聚合,同时确定聚合中的聚合根、值对象和实体 - 第三步:根据业务及语义边界等因素,将一个或者多个聚合划定在一个限界上下文内,形成领域模型 ### DDD 的域 #### 领域和子域 - DDD 的领域就是这个边界内要解决的业务问题域 - 领域可以进一步划分为子领域。我们把划分出来的多个子领域称为子域,每个子域对应一个更小的问题域或更小的业务范围 #### 核心域/通用域和支撑域 - 决定产品和公司核心竞争力的子域是核心域,它是业务成功的主要因素和公司的核心竞争力 - 没有太多个性化的诉求,同时被多个子域使用的通用功能子域是通用域 - 还有一种功能子域是必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域 ### 通用语言/限界上下文 ``` 通用语言定义上下文含义,限界上下文则定义领域边界,以确保每个上下文含义在它特定的边界内都具有唯一的含义,领域模型则存在于这个边界之内 ``` #### 通用语言 - 在事件风暴过程中,通过团队交流达成共识的,能够简单、清晰、准确描述业务涵义和规则的语言就是通用语言 - 通用语言包含术语和用例场景,并且能够直接反映在代码中。通用语言中的名词可以给领域对象命名,如商品、订单等,对应实体对象;而动词则表示一个动作或事件,如商品已下单、订单已付款等,对应领域事件或者命令 #### 限界上下文 - 用来封装通用语言和领域对象,提供上下文环境,保证在领域之内的一些术语、业务相关对象等(通用语言)有一个确切的含义,没有二义性 ### 实体和值对象 ``` 实体和值对象是组成领域模型的基础单元 实体一般对应业务对象,它具有业务属性和业务行为;而值对象主要是属性集合,对实体的状态和特征进行描述。但实体和值对象都只是个体化的对象,它们的行为表现出来的是个体的能力。 ``` #### 实体 - 在 DDD 里,实体类通常采用充血模型,与这个实体相关的所有业务逻辑都在实体类的方法中实现,跨多个实体的领域逻辑则在领域服务中实现 #### 值对象 - 通过对象属性值来识别的对象,它将多个相关属性组合为一个概念整体 - 值对象本质上就是一个集合 ### 聚合和聚合根 #### 聚合 - 聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化 #### 聚合根 - 聚合根的主要目的是为了避免由于复杂数据模型缺少统一的业务规则控制,而导致聚合、实体之间数据不一致性的问题 ### 领域事件 - 如果发生某种事件后,会触发进一步的操作,那么这个事件很可能就是领域事件 - 如果一次业务操作涉及多个聚合状态的更改,应采用领域事件的最终一致性