DDD划分领域、子域、核心域、支撑域的目的

本文以桃树为例,详细解析领域驱动设计(DDD)中的领域、子域、核心域、通用域及支撑域的概念及其重要性,并阐述如何通过领域划分来明确业务重点。

在《DDD兴起的原因以及与微服务的关系》中曾举了一个研究桃树的例子,如果要研究桃树,将桃树根据器官分成根、茎、叶、花、果实、种子,这每一种器官都可以认为是一个研究领域,而领域又有更加具体的细分,分成子域、核心域、通用域、支撑域等,下面回顾桃树这个例子

看上面这张图 ,如果研究桃树是我们的业务,那么如何更加快速有效的研究桃树呢?根据回忆,初中课本是这样研究的:

第一步: 确定研究的对象,即研究领域 ,这里是一棵桃树。

第二步: 根据研究对象的某些维度,对其进行进一步的拆分,例如拆分成器官,而器官又可以分成营养器官,生殖器官,其中营养器官包括根、茎、叶,生殖器官包括花、果实、种子,那么这些就是我们要研究的子域。

第三步: 现在就可以最子域进行划分了,找出核心域,通用域,支撑域,至于为什么要这么划分,后面再解释,当我们找到核心域之后,再各个子域进行深一步的划分,划分成组织,例如分成保护组织,营养组织,疏导组织,这就儿也可以理解成将领域继续划分为子域的过程。

第四步:对组织进行进一步的划分,可以分成细胞,例如根毛细胞、导管细胞等等

我们有没有必要继续拆分细胞呢?这个取决于我们研究的业务,例如在之前光学显微镜时,研究到细胞也就截止了,具体到其他业务,也是研究到某一步就不需要继续拆分,而这最小层次的领域,通常就是我们所说的实体,聚合、聚合根、实体以及值对象等内容会在后面深入了解。

下面归纳一下上面提到的几个名词的概念 :

领域:往往就是业务的某一个部分 , 例如电商的销售部分、物流部分、供应链部分等, 这些对于电商来说就是各个领域(模块),领域主要作用就是用来驱动范围, DDD 会将问题范围限定在特定的边界内,在这个边界内建立领域模型,进而用代码实现该领域模型,解决相应的业务问题。简言之,DDD 的领域就是这个边界内要解决的业务问题域。

子域:相对的一个概念, 我们可以将领域进行进一步的划分 , 这时候就是子域, 甚至可以对子域继续划分形成 子子域(依旧叫子域),就好比当我们研究植物时,如果研究的对象是桃树,那么果实根茎叶是领域,可是如果不仅仅要研究果实,还要研究组织甚至细胞,那么研究的就是果实的子域、组织的子域。

核心域:所有领域中最关键的部分 , 什么意思呢, 就是最核心的部分, 对于业务来说, 核心域是企业根本竞争力, 也是创造利润里最关键的部分 , 例如电商里面那么多领域, 最重要的是什么?就是销售系统, 无论你是2B还是2C, 还是PDD ,这些核心模块就是核心域。

通用域:除了核心域之外, 还需要自己做的一些领域, 例如鉴权、日志等, 特点是可能被多个领域公用的部分。

支撑域:系统中业务分析阶段最不重点关注的领域, 也就是非核心域非通用域的领域, 例如电商里面的支付、物流,仅仅是为了支撑业务的运转而存在, 甚至可以去购买别人的服务, 这类的领域就是支撑域。

需要注意的是,这些名词在实际的微服务设计和开发过程中不一定用得上,但是可以帮助理解DDD的核心设计思想以及理念,而这些思想和理念在实际的IT战略设计业务建模和微服务设计上都是可以借鉴的。

为什么要划分核心域、通用域、支撑域 ?

通过上面可以知道,决定产品和公司核心竞争力的子域是核心域,它是业务成功的主要因素和公司的核心竞争力。没有太多个性化的诉求,同时被多个子域使用的通用功能子域是通用域。还有一种功能子域是必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域。

这三类子域相较之下,核心域是最重要的,我们下面讲目的的时候还会以核心域为例详细介绍。通用域和支撑域如果对应到企业系统,举例来说的话,通用域则是你需要用到的通用系统,比如认证、权限等等,这类应用很容易买到,没有企业特点限制,不需要做太多的定制化。而支撑域则具有企业特性,但不具有通用性,例如数据代码类的数据字典等系统。

那么为什么要划分出这些新的名词呢?先想一个问题,对于桃树而言,根、茎、叶、花、果实、种子六个领域哪一个是核心域?

是不是有不同的理解?有人说是种子,有人说是根,有人说是叶子,也有人说是茎等等,为什么会有这种情况呢?

因为每个人站的角度不一样,你如果是果农,那么果实就是核心域,你的大部分操作应该都是围绕提高果实产量进行,如果你是景区管理员,那么芳菲四月桃花盛开才是你重点关注,如果比是林场工作人员,那么树干才应该是你重点关注的领域,看到没,对于同一个领域划分的子域,每个人都有不同的理解,那么要通过讨论确定核心域,确保大家认同一致,对于实际业务开发来说,参与的人员众多,有业务方面的,有架构师,有后端开发人员,营销市场等等,势必要最开始就确定我们的核心域,除了统一大家的认识之外还有什么好处呢?

对于一个企业来说,预算以及时间是有限的,也就意味着时间以及精力甚至金钱要尽可能多的花在核心的的地方。就好比电商,电商企业那么多,每一家核心域都有所差别,造成的市场结果也千差万别,那么公司战略重点和商业模式应该找到核心域,且重点关注核心域。

总的来说,核心域、支撑域和通用域的主要目标是:通过领域划分,区分不同子域在公司内的不同功能
属性和重要性,从而公司可对不同子域采取不同的资源投入和建设策略,其关注度也会不一样。

出处:https://www.cnblogs.com/Courage129/p/14853600.html

DDD领域驱动设计)中,**子域(Subdomain)** 是一个总括性概念,而 **核心支撑域、通用** 是对子域的分类。理解它们之间的关系和区别,是进行战略设计(Strategic Design)的关键。 --- ### 回答问题: #### 1. 什么是“子域”(Subdomain)? - **定义**:子域是对业务领域的逻辑划分,代表系统中的某个功能区或业务范围。 - 在复杂的大型系统中,整个业务会被拆分为多个子域,每个子域聚焦解决一类问题。 - 子域不是技术分层,而是从业务角度出发的划分。 > ✅ 所有系统都可以被划分为若干个子域。 --- #### 2. 子域的三种类型 | 类型 | 英文名 | 特点 | |------|--------|------| | **核心** | Core Subdomain | 体现企业竞争优势、最具业务复杂度的部分 | | **支撑域** | Supporting Subdomain | 必需但不具差异化,需定制开发的支持性功能 | | **通用** | Generic Subdomain | 标准化、可复用、可用现成方案实现的技术组件 | 这三者都是“子域”的具体类别。 --- ### 详细解释与区分 #### ✅ 核心(Core Subdomain) - **为什么重要?** - 是企业的“护城河”,决定了产品能否在市场上胜出。 - 需要由最优秀的团队投入最多资源去设计和迭代。 - **判断标准**: - 如果这个模块做得不好,整个产品就失败了; - 竞争对手很难复制你的实现方式。 - **示例**: - 电商平台的“促销引擎”(支持复杂优惠叠加规则); - 视频平台的“推荐算法”(基于用户行为建模); - 外卖平台的“智能调度系统”(骑手路径规)。 ```java // 包结构示意 com.example.platform.promotion.engine // 优惠计算核心逻辑 com.example.platform.recommendation.ai // 推荐模型服务 ``` --- #### ✅ 支撑域(Supporting Subdomain) - **为什么存在?** - 它不是核心竞争力,但为业务运行提供必要支持; - 通常具有一定的业务专属性,不能直接使用通用产品替代。 - **特点**: - 不对外形成差异,但内部不可或缺; - 可能需要一定程度的定制开发。 - **示例**: - 商家入驻审核流程(仅适用于本平台政策); - 内部结算系统(按商家分成比例自动对账); - 工单管理系统(处理客服投诉流转)。 > ⚠️ 虽然不是核心,但如果缺失会影响整体运作。 ```java // 包结构示意 com.example.platform.merchant.onboarding // 商家入驻 com.example.platform.settlement.internal // 内部结算 ``` --- #### ✅ 通用(Generic Subdomain) - **本质**:非业务性的、通用的技术能力或基础设施。 - **目标**:稳定、可靠、开箱即用,避免重复造轮子。 - **特点**: - 市面上已有成熟解决方案(如 Redis、MQ、OAuth2); - 多个子域共用; - 不体现业务独特性。 - **示例**: - 用户认证与权限管理; - 文件上传与存储服务; - 发送短信/邮件通知; - 日志记录与审计; - 消息队列封装、Redis 缓存工具、定时任务调度等。 > 🛠️ 原则上应优先选择第三方框架或中间件,而不是自研。 ```java // 包结构示意 com.example.platform.generic.auth // 认证服务(封装 Spring Security) com.example.platform.generic.cache // Redis 工具类 com.example.platform.generic.mq // 消息发送客户端 com.example.platform.generic.schedule // 定时任务抽象层 ``` --- ### 如何区分这四个概念?——总结对比表 | 概念 | 类型 | 是否业务相关 | 是否需自研 | 示例 | |------|------|-------------|------------|-------| | **子域(Subdomain)** | 总称 | ✅ 是 | —— | 整体业务划分单位 | | **核心** | 子域的一种 | ✅ 强业务相关 | ✅ 必须自研 | 促销引擎、推荐系统 | | **支撑域** | 子域的一种 | ✅ 中等业务相关 | ✅ 通常需定制 | 结算系统、工单流程 | | **通用** | 子域的一种 | ❌ 技术通用型 | ❌ 尽量不用自研 | 登录、缓存、MQ | > 🔍 简单记忆: > “子域”是一个容器,它包含三种类型的子域:**核心、支撑、通用**。 --- ### 实际应用建议 1. **战略优先级排序**: - 投入 70% 的精力到 **核心**; - 对 **支撑域** 保证可用性和可维护性; - 对 **通用** 尽量使用成熟方案(如 Spring 生态、Redis、Kafka)。 2. **组织架构匹配**: - 核心 → 成立专职团队; - 支撑域 → 由业务团队兼任或共享服务团队维护; - 通用 → 由基础架构组统一提供 SDK 或微服务。 3. **代码结构体现领域划分**: ```java // 示例:典型 DDD 项目包结构 com.company.ecommerce ├── core │ ├── promotion // 核心:促销引擎 │ └── order // 核心:订单系统 │ ├── supporting │ ├── merchant // 支撑域:商家管理 │ └── afterSales // 支撑域:售后流程 │ └── generic ├── auth // 通用:认证 ├── cache // 通用:Redis 封装 └── mq // 通用:消息队列客户端 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值