DDD是什么?电商系统举例

一、DDD的基本概念

领域驱动设计(Domain-Driven Design,简称DDD)是由Eric Evans提出的一种软件开发方法论,旨在应对复杂业务系统的设计和实现。它的核心思想是将软件的设计与业务领域紧密结合,通过深入理解业务需求,构建一个反映真实业务逻辑的模型,并用代码清晰地表达出来。

在传统的开发模式中,我们常常以技术为中心,先设计数据库表结构或API接口,再围绕这些技术组件填充业务逻辑。而DDD则反其道而行之,它强调**领域(Domain)**是软件的核心,技术只是实现领域的工具。换句话说,DDD的目标是通过代码和架构让业务逻辑成为系统的“主角”。

DDD的核心原则
  1. 聚焦领域:软件的核心是解决业务问题,而不是技术本身。
  2. 统一语言(Ubiquitous Language):开发团队和领域专家使用一致的术语,确保沟通无歧义。
  3. 模型驱动设计:通过领域模型将业务概念抽象为对象、关系和行为,并映射到代码中。
  4. 分层架构:将系统划分为多个层次,隔离关注点,提升可维护性。
  5. 限界上下文(Bounded Context):为不同的业务子域定义清晰的边界,避免概念混淆。
DDD的两个阶段
  • 战略设计:关注宏观层面,比如划分限界上下文、定义子域、建立上下文映射。
  • 战术设计:关注微观层面,比如如何设计实体(Entity)、值对象(Value Object)、聚合(Aggregate)、领域服务(Domain Service)等。

为什么需要DDD?

假设你正在开发一个电商系统,里面涉及商品、订单、库存、支付等功能。如果没有清晰的领域划分,可能出现以下问题:

  • 商品的“价格”在不同模块中有不同定义,导致逻辑混乱。
  • 订单和库存的耦合过于紧密,改动一处牵动全身。
  • 随着业务扩展,代码变得难以维护,新增功能需要改动大量现有代码。

DDD通过领域模型和限界上下文解决了这些问题。它鼓励你先理解业务的全貌,再通过分层和模块化设计,让每个部分的职责清晰,降低耦合性。

DDD的分层架构

DDD通常采用以下四层架构:

  1. 表现层(Presentation Layer):处理用户交互,比如API接口、Web页面。
  2. 应用层(Application Layer):协调业务用例,调用领域层完成具体操作,不包含业务逻辑。
  3. 领域层(Domain Layer):核心层,包含业务逻辑、实体、聚合等。
  4. 基础设施层(Infrastructure Layer):提供技术支持,比如数据库访问、消息队列、外部服务调用。

二、在Spring Cloud Alibaba微服务架构中应用DDD

假设我们现在要设计一个基于Spring Cloud Alibaba的电商微服务系统,包含商品管理、订单管理、库存管理和支付管理等模块。我们可以用DDD来规划架构和文件结构。

系统背景

  • 技术栈:Spring Cloud Alibaba(Nacos配置/注册中心、Sentinel限流、Seata分布式事务等)。
  • 业务需求:用户可以浏览商品、下订单,系统需要实时更新库存并处理支付。
  • 微服务划分:按业务能力拆分为商品服务、订单服务、库存服务和支付服务。

DDD在微服务中的应用

  1. 限界上下文:每个微服务对应一个限界上下文,例如订单服务关注订单的创建和状态管理,库存服务关注库存的分配和扣减。
  2. 聚合根:每个限界上下文有一个核心实体作为聚合根,比如订单服务中的“Order”、库存服务中的“Stock”。
  3. 领域事件:通过事件驱动(比如Spring Cloud Stream + RocketMQ)实现服务间协作,例如订单创建后发布“OrderCreatedEvent”通知库存服务扣减。

三、典型的DDD文件框架(电商系统)

以下是一个基于Spring Cloud Alibaba的电商微服务系统的DDD文件框架。我们以订单服务(Order Service)为例,展示其目录结构。其他服务(如商品服务、库存服务)可以参照类似结构。

order-service/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── ecommerce/
│   │   │           └── order/
│   │   │               ├── presentation/         # 表现层
│   │   │               │   ├── controller/       # REST API控制器
│   │   │               │   │   └── OrderController.java
│   │   │               │   └── dto/              # 数据传输对象
│   │   │               │       ├── OrderRequest.java
│   │   │               │       └── OrderResponse.java
│   │   │               ├── application/          # 应用层
│   │   │               │   ├── service/          # 应用服务
│   │   │               │   │   └── OrderAppService.java
│   │   │               │   └── event/            # 领域事件处理
│   │   │               │       └── OrderEventPublisher.java
│   │   │               ├── domain/               # 领域层
│   │   │               │   ├── entity/           # 实体
│   │   │               │   │   ├── Order.java   # 聚合根
│   │   │               │   │   └── OrderItem.java
│   │   │               │   ├── valueobject/      # 值对象
│   │   │               │   │   └── Address.java
│   │   │               │   ├── repository/       # 仓储接口
│   │   │               │   │   └── OrderRepository.java
│   │   │               │   ├── service/          # 领域服务
│   │   │               │   │   └── OrderDomainService.java
│   │   │               │   └── event/            # 领域事件
│   │   │               │       └── OrderCreatedEvent.java
│   │   │               ├── infrastructure/       # 基础设施层
│   │   │               │   ├── repository/       # 仓储实现
│   │   │               │   │   └── OrderRepositoryImpl.java
│   │   │               │   ├── mq/               # 消息队列集成
│   │   │               │   │   └── RocketMQProducer.java
│   │   │               │   └── config/           # 配置类
│   │   │               │       └── NacosConfig.java
│   │   ├── resources/
│   │   │   ├── application.yml                   # Spring Boot配置文件
│   │   │   └── nacos-config.properties           # Nacos配置
│   └── test/
│       └── java/
│           └── com/
│               └── ecommerce/
│                   └── order/
│                       └── OrderServiceTest.java
├── pom.xml                                       # Maven依赖文件
└── README.md                                     # 项目说明
文件结构说明
  1. 表现层(presentation)

    • OrderController:对外暴露REST API,比如创建订单、查询订单。
    • OrderRequest/OrderResponse:DTO用于接收和返回数据,避免直接暴露领域模型。
  2. 应用层(application)

    • OrderAppService:协调业务用例,比如调用领域服务创建订单、发布事件。
    • OrderEventPublisher:将领域事件发布到消息队列(如RocketMQ)。
  3. 领域层(domain)

    • Order:聚合根,包含订单的核心逻辑,比如添加订单项、计算总价。
    • OrderItem:实体,表示订单中的商品项。
    • Address:值对象,表示订单的配送地址。
    • OrderRepository:仓储接口,定义订单的持久化操作。
    • OrderDomainService:处理复杂的领域逻辑,比如订单状态转换。
    • OrderCreatedEvent:领域事件,表示订单已创建。
  4. 基础设施层(infrastructure)

    • OrderRepositoryImpl:仓储的具体实现,使用Spring Data JPA或MyBatis。
    • RocketMQProducer:集成RocketMQ发送消息。
    • NacosConfig:配置Nacos服务发现和配置管理。

四、贫血模型与充血模型

这两个模型是领域驱动设计中常见的设计模式:

贫血模型

在贫血模型中,领域对象只有属性和简单的 get/set 方法,所有的业务逻辑都放在服务(Service)中。虽然实现简单,但容易导致:

  • 领域模型与业务逻辑脱节。

  • 对象的行为和状态分散,不利于维护。

示例:POJO(Plain Old Java Object)形式的订单实体。

充血模型

充血模型是面向对象的体现。领域对象除了保存状态外,还负责与自身状态相关的行为。

示例:充血模型的订单实体。

充血模型的优势在于逻辑内聚,但需要适度设计,避免过于复杂。

参考文章:

  1. DDD是什么?用一个电商的例子来入门
  2. DDD新手入门:领域模型设计的七个核心概念

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S ConfigMap 快速开始

一、什么是 ConfigMap? ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的 API 对象,支持以键值对(Key-Value)或文件的形式存储配置,允许将配置与镜像解耦,实现配置的集中管理和动态更新。 二、主要用…

Prometheus使用Recoding Rules优化性能

通过PromQL可以实时对Prometheus中采集到的样本数据进行查询,聚合以及其它各种运算操作。而在某些PromQL较为复杂且计算量较大时,直接使用PromQL可能会导致Prometheus响应超时的情况。这时需要一种能够类似于后台批处理的机制能够在后台完成这些复杂运算…

C++ RAII 编程范式详解

C RAII 编程范式详解 一、RAII 核心概念 RAII(Resource Acquisition Is Initialization,资源获取即初始化) 是 C 的核心编程范式,通过将资源生命周期与对象生命周期绑定实现安全、自动化的资源管理。 核心原则: 资源…

Rust 学习笔记:枚举与模式匹配

Rust 学习笔记&#xff1a;枚举与模式匹配 Rust 学习笔记&#xff1a;枚举与模式匹配定义枚举&#xff08;Enum&#xff09;枚举变量Option 枚举及其相对于 NULL 的优势match 和枚举与 Option\<T\> 匹配match 应该是详尽的Catch-all 模式和 _ 占位符使用 if let 和 let e…

《WebGIS之Vue进阶教程》(13)ref的实现

1 为什么需要ref 由于proxy只能代理引用类型数据(如: 对象, 数组, Set, Map...), 需要一种方式代理普通类型数据(String, Number, Boolean...) 设计ref主要是为了处理普通类型数据, 使普通类型数据也具有响应式 除此之外, 通过reactive代理的对象可能会出现响应丢失的情况. 使…

Redis 缓存并发问题深度解析:击穿、雪崩与穿透防治指南

Redis-缓存并发 引言&#xff1a;缓存&#xff0c;高性能架构的基石与并发挑战一、 缓存击穿&#xff1a;热点 Key 失效引发的“单点风暴”1.1 什么是缓存击穿&#xff1f;1.2 缓存击穿的风险1.3 缓存击穿的解决方案1.3.1 互斥锁&#xff08;Mutex Lock&#xff09;/ 分布式锁 …

Python 数据智能实战 (4):智能用户分群 - 融合行为

写在前面 —— 超越 RFM 标签,结合用户行为与 LLM 文本洞察,实现更精准、更立体的客户细分 欢迎回来!在前面的学习中,我们已经为 Python 数据智能工具箱添置了与大语言模型 (LLM) 交互的能力,特别是掌握了如何利用 LLM 将非结构化的文本信息转化为包含深层语义的数值向量…

FreeMarker语法深度解析与Node.js集成实践指南

一、FreeMarker核心语法体系 1.1 基础模板结构 <#-- 注释语法 --> ${expression} <#-- 输出表达式 --> <#directive paramvalue> <#-- 指令语法 -->1.2 数据类型处理 标量类型深度处理&#xff1a; <#assign num 123.45?floor> <#--…

【计算机视觉】目标检测:深度解析YOLOv5:下一代实时目标检测框架实战指南

深度解析YOLOv5&#xff1a;下一代实时目标检测框架实战指南 技术演进与架构设计YOLO系列发展脉络YOLOv5核心架构1. 骨干网络&#xff08;Backbone&#xff09;2. 特征融合&#xff08;Neck&#xff09;3. 检测头&#xff08;Head&#xff09; 环境配置与快速开始硬件要求建议详…

STM32 定时器TIM

定时器基础知识 定时器就是用来定时的机器&#xff0c;是存在于STM32单片机中的一个外设。STM32总共有8个定时器&#xff0c;分别是2个高级定时器(TIM1、TIM8)&#xff0c;4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM6、TIM7)&#xff0c;如下图所示: STM32F1…

OpenObserve API Usage Guide for Log Management

OpenObserve API Usage Guide for Audit Log Management 1. 概述 1.1 目标 本文档旨在详细介绍 OpenObserve 的 API 使用方法&#xff0c;帮助用户通过 API 实现日志管理功能&#xff0c;包括日志摄入、查询、模糊匹配&#xff08;类似 SQL 的 LIKE&#xff09;、stream 管理…

消防岗位技能竞赛流程方案策划

一、比赛目的&#xff1a; 为大力倡导“11.9”全国消防安全活动月&#xff0c;紧紧围绕“人人参与消防&#xff0c;共创平安和谐”的活动主题&#xff0c;结合公司实际情况&#xff0c;特开展一次消防技能竞赛活动。开展一场比思想、比工作作风、比消防业务技能、比业余文化生…

DAY9-USF4.0技术文档笔记

目录 1.概述 2.参考协议标准 3.术语与定义 4.引言 5.UFS架构 6.UFS电气特性&#xff1a;时钟、复位、信号与电源 7.复位、加电升压和断电降压 8. M-PHY 9.UniPro 10.UTP 11.SCSI 12.UFS安全 13.UFS功能描述 14.描述符、标志与属性 15.UFS机械标准 SCSI 查询命令 1.重要产品…

安装kubernetes 1.33版本

一、环境准备 1、内核升级 #升级内核&#xff1a; yum -y install kernel-ml-5.10.3-1.el7.elrepo.x86_64.rpm kernel-ml-devel-5.10.3-1.el7.elrepo.x86_64.rpm# 查询可用内核版本 # awk -F\ $1"menuentry " {print i " : " $2} /etc/grub2.cfg# 调整默…

【IPMV】图像处理与机器视觉:Lec8 Image Pyramid 图像金字塔

【IPMV】图像处理与机器视觉 本系列为2025年同济大学自动化专业**图像处理与机器视觉**课程笔记 Lecturer: Rui Fan、Yanchao Dong Lec0 Course Description Lec3 Perspective Transformation Lec7 Image Filtering Lec8 Image Pyramid 持续更新中 文章目录 【IPMV】图像处…

产品经理.产品设计.产品设计工具

一、 产品经理常用工具 1. 业务流程图---系统流程图 业务流程图&#xff0c;面向用户调研&#xff0c;描述业务的流转和数据的处理要求&#xff0c;跟用户和业务方确认&#xff1b;---业务角色的泳道流程图。 系统流程图&#xff0c;面向产品需求设计&#xff0c; prd系描述各…

6轴、智能、低功耗惯性测量单元BMI270及其OIS接口

BOSCH惯性传感器IMUs 芯片代码 通过00寄存器读回的芯片编码可以判断芯片型号,BMI270为(0x24) &#xff0c;如不是该值&#xff0c;则说明不是BMI270。 型号芯片代码BMI085CHIP_ID ( 0x1F)BMI088CHIP_ID ( 0x1E)BMI160CHIP_ID (0xD1)BMI270CHIP_ID (0x24)BMI323CHIP_ID (0x004…

【文献速递】邻位连接技术(PLA)在细胞器相互作用中的应用

在神经科学研究领域&#xff0c;细胞死亡机制一直是关注的重点&#xff0c;尤其是与神经退行性疾病相关的细胞死亡形式。荷兰格罗宁根大学的研究人员在2025年发表了“Regulation of calcium signaling prevents neuronal death mediated by NIST DEP in xenoferroptotic cell d…

六.割草机技术总结--6.RTK定位精度分析

六.割草机技术总结–6.RTK定位精度分析 6.1 1cm+1ppm 中的ppm是什么意思? 精度 RTK 位置精度(在 RTK 时)1 cm + 1 ppm ( 水 平 ) 1 . 5 cm + 1 ppm ( 垂 直 ),其中的ppm是什么意思? 在RTK(实时动态定位)技术中,ppm表示 Parts Per Million(百万分之一),是一种与距离…

MCP的基础知识

一、了解MCP的基础知识 1.函数调用Function Calling Function Calling是openai在2023年推出的一个非常重要的概念&#xff1a;Function Calling&#xff08;函数调用&#xff09;本质上就是提供了大模型与外部系统的交互能力&#xff0c;类似于给大模型安装了一个“外挂工具箱…