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.pswp.cn/pingmian/78913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78913.shtml
英文地址,請注明出處:http://en.pswp.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;類似于給大模型安裝了一個“外掛工具箱…