DDD领域驱动设计概述

领域驱动设计(Domain-Driven Design, DDD)是一种软件开发方法论,它通过将业务领域知识与软件设计紧密结合,以应对复杂系统的开发与维护。以下是对DDD的详细解析:

1. DDD的作用与意义

DDD适用于系统复杂度较高时,它能够帮助团队更好地理解和应对业务变更。

适用场景:
  • 初期项目:为未来可能的维护和变更打下基础。- 持续维护项目:简化业务升级流程。- 未来项目:面对业务复杂性增加、技术迭代加速、系统规模扩大和市场竞争加剧等挑战。
核心价值:
  • 解耦业务与技术:通过整洁架构实现业务逻辑与技术实现的分离,提高系统的可维护性和可扩展性。- 促进团队沟通:统一语言和概念,加强开发、业务和运维团队之间的协作。

2. 领域建模的方法

领域建模是DDD的核心,它要求开发者深入理解业务领域,识别关键概念和实体,建立领域模型。

  • 识别领域实体:找出业务中的关键对象。- 定义领域服务:确定实体间的交互逻辑。- 划分子域:将大型系统划分为更小、更易于管理的部分。

3. 领域模型到程序设计的转换

将领域模型转化为程序设计,需要以下步骤:

  • 实体与值对象:将领域实体和值对象映射为代码中的类。- 领域服务:实现领域逻辑的服务类。- 应用服务:协调领域对象,处理应用程序的业务逻辑。

4. 支持DDD的架构设计

DDD支持的架构设计应包括:

  • 分层架构:将系统分为表现层、领域层、应用层和基础设施层。- 中间接口层:作为业务逻辑与技术实现之间的桥梁。- 事件驱动:使用事件来异步处理业务流程,提高系统的响应性和可扩展性。 通过上述方法,DDD能够帮助团队构建出既灵活又健壮的软件系统,以应对不断变化的业务需求和技术挑战。
    在这里插入图片描述

领域建模与架构设计

领域建模是软件开发中的一项基础工作,它帮助我们深入理解业务需求,并将其转化为可操作的模型。以下是对领域建模及其在架构设计中的应用进行的详细阐述:

1. 领域建模的重要性- 深刻理解业务:通过与业务专家的沟通,准确把握业务流程和规则。- 转换成领域模型:将业务需求抽象成领域模型,为软件开发提供基础。

2. 领域模型到数据库设计- 模型转换:将领域模型映射到数据库设计,确保数据存储结构与业务逻辑一致。- 数据持久化:通过数据库设计,实现数据的持久化存储。

3. 模型的演进:充血模型与贫血模型- 充血模型:领域模型具有业务逻辑,模型本身包含行为和状态。- 贫血模型:领域模型仅包含数据,业务逻辑由服务层处理。

DDD解决方案领域驱动设计(DDD)结合微服务设计,为解决复杂架构设计提供了一种方法:

  • 领域建模+微服务设计:通过领域建模来指导微服务的划分,实现服务的自治和解耦。- 缺点:可能会增加系统的复杂度,影响服务间的交互速度。- 解决策略:采用整洁架构设计,通过分层架构来降低复杂度,提高系统的可维护性和可扩展性。

注意事项- 在设计过程中,需要权衡模型的复杂度与系统的可维护性。- 整洁架构设计是降低系统复杂度的有效手段。

以上内容对领域建模及其在架构设计中的应用进行了结构化和条理化的总结,希望能够帮助理解这一过程。
在这里插入图片描述

小而专的微服务设计

某几个微服务都需要调用同一个表时会导致服务被影响。
如购物、交易、配送服务操作商品表的情况。

应当设计成某个表只让一个微服务进行操作,对其他服务提供调用接口完成调用。

在这里插入图片描述
在进行跨库关联查询时,我们通常会遇到需要将两个不同的数据集合并查询的情况。传统的方法是通过JOIN操作将两个表连接起来,但这种方法在某些情况下效率并不高。为了优化这个过程,我们可以采用一种新策略:先单独查询订单数据,然后再补填用户信息。这种方法的优势在于能够减少底层设计的复杂性,同时提高查询效率。

跨库关联查询优化策略

  1. 查询订单数据 首先,独立地查询订单表,获取所需的订单信息。这一步骤可以快速完成,因为只涉及到单一数据源。
  2. 数据分页 查询得到的订单数据量可能非常大,因此需要进行分页处理。分页可以有效地控制每次返回的数据量,提高用户体验。
  3. 用户信息补填 在订单数据查询完成后,根据订单中的用户ID或其他关联字段,查询用户表,补填用户信息。这一步骤是优化查询的关键,因为它避免了在初始查询中就进行复杂的JOIN操作。
  4. 关注业务逻辑 通过上述方法,我们可以将更多的精力放在业务逻辑的实现上,而不是底层数据查询的复杂性。

实施步骤

  • 步骤一:执行订单查询,获取基础数据。- 步骤二:对查询结果进行分页,确保数据的可管理性。- 步骤三:根据订单信息中的用户标识,查询用户表,补全用户数据。- 步骤四:将补全后的数据整合,形成完整的查询结果。 通过这种方法,我们不仅能够提高查询效率,还能够使开发过程更加专注于业务需求,而不是技术实现的细节。
    在这里插入图片描述

2.How to DDD?

软件规模化给团队带来的挑战

在这里插入图片描述

频繁的变更导致软件质量的下降。于是软件的维护越来越难,因此软件的架构极为重要!

在这里插入图片描述

由简单——>复杂
原来的做法是直接在padoff方法中不断添加代码导致越来越难以维护。现在应该调整程序结构。

在这里插入图片描述

领域建模思想

调整程序结构的方法即 领域建模思想
对象应与现实世界事物相对应。
方法与现实世界行为对应。
关联与现实世界相对应。

单一职责原则(SRP)

定义与理解单一职责原则是面向对象设计的一个基本原则,它要求软件系统中的每个类或模块只承担一个职责。这意味着一个类或模块应该只负责完成与自己相关的任务,而将其他任务交给其他类或模块去完成。

正确与错误的理解- 错误理解:很多人可能会认为,与一个类或模块相关的所有功能都应该由它来实现,这会导致类或模块承担过多的职责。- 正确理解:单一职责原则强调的是,一个类或模块的职责应该是软件变化的一个原因。换句话说,当软件需要变更时,这个变更应该只影响这个类或模块,而不会影响到其他部分。

帮助理解单一职责原则可以帮助我们设计出更加灵活和可维护的系统。它类似于微服务架构中的服务拆分,每个服务只处理一种类型的业务逻辑,当需要对某一部分进行修改或扩展时,不会影响到整个系统。

案例分析以付款系统为例,假设我们需要添加一个折扣功能。如果按照单一职责原则来设计,我们应该将折扣逻辑作为一个独立的模块来实现,而不是将其直接嵌入到付款模块中。这样做的好处是:

  1. 解耦:付款模块和折扣模块之间的耦合度降低,修改折扣逻辑不会影响付款模块。2. 可维护性:当折扣逻辑需要更新或维护时,可以独立于付款模块进行,简化了维护工作。3. 可扩展性:未来如果需要添加更多的促销或折扣类型,可以轻松地扩展折扣模块,而不需要修改付款模块。

总结单一职责原则是提高软件系统质量的重要原则之一。通过合理划分职责,我们可以构建出更加模块化、灵活和易于维护的系统。

在这里插入图片描述

领域模型

在这里插入图片描述
在进行系统设计时,理解限界上下文(Bounded Context)的概念至关重要。限界上下文是领域驱动设计(Domain-Driven Design, DDD)中的一个重要概念,它指的是在特定领域内,模型和术语的一致性边界。在真实世界的应用场景中,如折扣计算、支付处理等,限界上下文帮助我们清晰地区分不同的业务逻辑和规则。

限界上下文的理解和应用

  1. 定义:限界上下文是模型和通用语言的边界,它们定义了在特定领域内哪些概念是有效的。2. 重要性:它帮助团队成员在讨论和开发过程中保持概念的一致性,避免混淆。3. 应用场景:在设计复杂的系统时,如远程智慧医疗系统,限界上下文可以划分不同的业务领域,例如患者管理、诊疗服务、药品管理等。

领域建模图的构建

  • 领域建模图应当是多个小的图,而不是一张大的图。这样做的目的是为了更清晰地展示不同限界上下文之间的关系和交互。

案例分析:远程智慧医疗系统

  1. 初期阶段:系统可能只是一个简单的诊所管理系统,主要负责日常的病人挂号、医生排班等基本功能。2. 发展阶段:随着技术的发展和业务需求的增加,系统可能需要整合远程诊断、电子病历管理、在线支付等更复杂的功能。3. 限界上下文划分:在远程智慧医疗系统中,可以根据不同的业务需求划分出多个限界上下文,例如: - aaaaaaa:负责患者基本信息的管理。 - aaaaaaa:处理与诊疗相关的服务。 - aaaaaaa:管理药品库存和供应链。 - aaaaaaa:实现在线支付和财务结算。 通过上述内容的重新编写和结构化,我们可以看到限界上下文在系统设计中的重要性,以及如何通过领域建模图来清晰地展示不同业务领域的交互和边界。
    在这里插入图片描述

统一语言建模与领域建模

  1. 事件风暴

在这里插入图片描述

2.  事件即事实  
    领域事件:命名都是过去式,且事情很重要,有记录。  
    且需要识别领域事件有无聚合  

在这里插入图片描述

    eg:  

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

需要识别领域事件有无聚合
删除了整体后部分也会消失

在这里插入图片描述

  1. 事件风暴会议
    目标:进行领域建模

在这里插入图片描述

领域建模  

在这里插入图片描述

限界上下文  

在这里插入图片描述

自我总结:活动者单独划分,功能模块依次划分。