领域驱动设计(DDD)概述

何时使用领域驱动设计?领域驱动设计(DDD)并非架构风格或模式,也非软件开发方法论。它是一种面向业务的应用程序架构设计方法。当项目团队在需求分析中不断考虑如何设计业务对象,并且梳理领域知识时,就已经在实践DDD。更精确的问题应是:如何选择适合的架构风格来构建系统。

领域驱动设计基本概念DDD旨在简化业务与开发团队间的沟通,确保软件产品满足业务需求并解决开发中的问题。核心概念是通用语言,确保代码组织反映业务模型。

领域建模基础- 实体(Entity):通过ID标识个体。- 值对象(Value Object):通过属性值确定个体。- 服务(Service):定义不属于任何模型对象的领域行为。

生命周期管理- 聚合(Aggregate):表达完整业务概念的实体和值对象组合。- 聚合根(Aggregate Root):代表聚合业务意义的实体。- 工厂(Factory):创建聚合。- 仓储(Repository):管理聚合的持久化和生命周期。

经典分层架构与DDD经典分层架构通常分为界面层、业务逻辑层、数据访问层。而DDD将系统分为四层:

  1. 用户界面层:面向用户,如前端应用或API。2. 应用层:协调任务执行,隔离领域与用户界面。3. 领域层:包含领域模型对象,避免贫血模型。4. 基础设施层:技术细节,如数据库和外部服务。

架构实践案例早些年,微软团队开源了NLayerApp,展示了DDD的分层架构实践,但该项目现已不可查。

微服务架构与DDD微服务架构风格与DDD的界定上下文概念相契合,有助于解决领域概念在不同场景下的差异问题。

结论如果你的项目遵循DDD概念进行业务分析和领域建模,那么你已经在正确的道路上。选择适合的架构风格,结合DDD实践,可以构建出满足业务需求的高质量软件系统。


在软件开发中,分层架构是一种常见的设计模式,它将系统划分为不同的层次,以实现职责的清晰分离和模块化。以下是对分层架构及其在领域驱动设计(Domain-Driven Design, DDD)中的应用的详细解析:

分层架构概览分层架构通常包括以下几个层次:- 用户界面层:与用户交互的界面。- 应用层:处理应用程序的业务逻辑。- 领域层:包含业务领域的核心逻辑和模型。- 基础设施层:提供数据存储、网络通信等底层服务。

领域驱动设计的应用在领域驱动设计中,分层架构可以进一步细化为以下模式:- 仓储模式(Repository):管理领域聚合的生命周期。- 规约模式(Specification):定义业务规则和条件。- MVC模式:在用户界面层组织视图、控制器和模型。

架构模式与实现- 分层架构的选择:根据项目需求和团队熟悉度选择合适的架构风格。- 领域模型:定义业务领域的核心概念和操作。- 仓储接口与实现:接口位于领域层,实现位于基础设施层,通过依赖注入提供。

技术案例分析- Microsoft NLayer App:虽然已不再存在,但其多层分布式架构案例仍具有参考价值。- Byteart Retail:一个较早的符合DDD的多层架构案例,尽管技术较老,但架构清晰。

分层架构的适用性- 简单业务系统:如学校图书馆管理系统,分层架构是一个合适的选择。- 复杂业务系统:随着业务扩展,可能需要转向微服务架构以应对复杂性。

事件驱动型架构简介事件驱动型架构是另一种流行的架构风格,它侧重于事件的产生、检测、消费和响应。

分层架构和事件驱动型架构各有优势,选择哪种架构风格取决于具体的业务需求和团队的技术栈。领域驱动设计的思想和模式可以在任何选择的架构中得到应用,以提高软件的质量和可维护性。

CQRS与领域驱动设计实践

概述在CQRS(命令查询责任分离)架构中,操作基于事件驱动。客户端发起修改请求时,命令处理器会根据聚合根ID从仓储读取事件,重建聚合状态,并在修改后产生领域事件。这些事件会被保存并派送到事件总线,触发查询数据库的更新或其他业务逻辑。

领域事件(Domain Events)- 定义:发生在领域层的事件,如属性修改。- 作用:触发查询数据库更新或内部状态机,实现状态转换。

事件溯源(Event Sourcing)- 概念:系统记录所有领域事件,实现状态回溯。

CQRS架构特点1. 领域模型:不含规约,聚合行为仅派发领域事件。2. 实体属性:属性只读,修改通过领域事件。3. 仓储职责:保存聚合,读取聚合根ID对应的聚合,不包含查询方法。4. 事件存储:单一数据表或文档,记录序列号、对象类型、ID、事件类型等信息。

实践案例 - WeText- 介绍:基于CQRS的完整案例,代码公开在Github。- 特点:技术可能过时,但架构为事件驱动型,实现CQRS和领域驱动设计要素。

架构图参考 WeText架构图

结论CQRS模式通过分离读写职责,允许异构平台开发,提供了系统状态的完整历史记录和灵活的状态管理能力。

CQRS模式与事件驱动型架构

CQRS模式的实现复杂,通常只应用于特定的界定上下文。并非所有业务都需要事件存储或命令消息总线。在事件驱动型架构中,CQRS并非必需,但若要实践领域驱动设计,则CQRS是值得学习的一种架构模式。

微服务架构概述

微服务架构适用于业务领域庞大,分层架构无法支撑的情况。微服务间独立,可使用不同技术栈,数据存储系统,甚至仅处理数据而不存储。微服务架构的挑战在于服务间的协作与数据一致性。

微服务的划分模式1. 按业务能力分解:Decompose by business capability2. 按子域分解:Decompose by subdomain,与领域驱动设计对应3. 自包含服务:Self-contained service4. 每个团队一个服务:Service per team

领域驱动设计与微服务- 界定上下文:确保通用语言的明确性,避免二义性- 上下文映射:Context Mapping,解决跨界定上下文的交互问题- 防腐层:Anti-corruption Layer,实现不同上下文间的无缝沟通

微服务架构的优势与挑战### 优势- 良好的延展性- 动态资源调配- 技术栈多样性- 敏捷开发实践- 云平台支持

挑战- 配置管理- 服务发现- 服务间通信- 分布式事务- 部署和测试复杂度- 安全策略

分布式事务与Saga模式Saga模式是实现跨服务事务的一种方式,分为编排式和协调式两种实现方式。编排式适用于参与服务少、逻辑简单的场景;协调式则适用于服务多、逻辑复杂的场景。

数据库与前端的微服务实践- 数据库:推荐每个服务拥有自己的数据库(Database per service)- 前端:微前端框架整合不同团队开发的前端界面

结论微服务架构虽先进,但实践不易。需根据业务规模和团队能力权衡利弊。架构设计无绝对对错,关键在于合理性与平衡。

微软官方微服务案例- eShopOnContainers:一个开源的电商零售网站案例,展示了完整的微服务架构实现。

架构图

微服务架构与领域驱动设计的实践

微服务架构概述微服务架构是一种将应用程序作为一组小型服务的架构风格,每个服务实现特定的业务功能,并通过轻量级的通信机制(通常是HTTP RESTful API)进行交互。eShopOnContainers是一个采用微服务架构的示例项目,它支持多种客户端体验,包括移动客户端、基于ASP.NET Core MVC的浏览器客户端以及基于Angular的单页面应用(SPA)。

客户端体验- 移动客户端:适用于移动设备的应用。- 浏览器客户端:传统的基于Web的应用。- 单页面应用(SPA):基于Angular的动态Web应用。

服务端实现服务端通过两套API网关来代理所有的API请求,与后端的微服务进行通信。

认证与授权- 使用基于ASP.NET Identity的IdentityServer4实现。

子领域划分eShopOnContainers将业务领域分为三个子领域:- Catalog子领域:维护商品信息。- Ordering子领域:处理订单。- Basket子领域:管理购物篮信息。

微服务技术实现各个微服务根据子领域进行划分,并采用不同的技术实现。

Catalog微服务- 使用Data Service/CRUD API模式。- 后台数据库:SQL Server。

Ordering微服务- 采用CQRS体系结构模式。- 基于领域事件运作。- 后台数据库:SQL Server。

Basket微服务- 基于领域驱动设计的分层模式。- 使用Redis作为数据持久化机制。

微服务间通信微服务之间通过事件总线(如RabbitMQ或Azure Service Bus)完成通信,并采用Saga模式实现分布式事务。

容器化与编排整个后端架构都是容器化的,运行在容器编排集群中,如docker-compose或Kubernetes。

领域驱动设计的应用领域驱动设计在微服务架构中可以灵活运用,不同团队可以在不同微服务中以不同程度引入领域驱动设计的思想,以解决业务分析与系统开发中的难点。

架构选择的思考在决定是否引入复杂的架构风格和模式时,需要考虑项目的实际需求。对于多数项目而言,可能一个面向数据的CRUD服务或单体架构已足够。

推荐阅读以下是一些推荐阅读,以深入了解领域驱动设计和微服务架构:

  • 《领域驱动设计:软件核心复杂性应对之道》Eric Evans- 《企业应用架构模式(PoEAA)》Martin Fowler- 《实现领域驱动设计》Vaughn Vernon- 《微服务架构设计模式》Chris Richardson- 《.NET Microservices:Architecture for Containerized .NET Applications》Microsoft

Github Repo推荐作者还推荐了几个Github Repo,展示了不同架构风格下的领域驱动设计实现:

结语领域驱动设计和微服务架构是软件架构领域的重要概念。选择合适的架构风格和模式,可以有效地指导软件设计,解决业务问题,并推动技术进步。