
界限上下文(Bounded Context)和领域子域(Subdomain)不是同一个东西。它们分别属于“问题空间”和“解决方案空间”。
•是什么: Domain指的是“一个组织所做的事情以及其中所包含的一切”,也就是业务问题本身。它是一个知识范围、一个影响范围。•例子: 比如“电子商务”是一个领域,“保险理赔”是一个领域,“银行信贷”也是一个领域。它定义了我们要解决的是什么问题。•类比: 整个“医疗”行业就是一个庞大的领域。
•是什么: 在庞大的领域(Domain)中,为了管理和理解的方便,我们会将其拆分成更小的、逻辑上内聚的部分,这些部分就是子域。子域是领域的一部分,代表了业务的某个方面。•目的: 帮助我们分析问题,识别出哪些部分是核心,哪些是辅助支撑的。•分类:
•核心域 (Core Domain): 公司的核心竞争力所在,是业务成功的关键。公司应该将最优秀的人才和资源投入在这里。例如:电商平台的“商品推荐系统”、“交易系统”。•支撑子域 (Supporting Subdomain): 不是核心竞争力,但对核心业务是必不可少的,专门为核心域提供支持。例如:电商平台的“库存管理系统”、“物流跟踪系统”。 它们通常是内部定制开发的。•通用子域 (Generic Subdomain): 非常常见、通用的功能,几乎每个公司都需要,但没有业务差异性。通常直接购买或使用开源方案更划算。例如:“用户身份认证”、“权限管理”、“支付网关集成”。
•类比: 在“医疗”领域(Domain)中,“心脏科”、“骨科”、“药房”、“行政管理”都是其子域(Subdomain)。其中“心脏科”可能是这家医院的核心域。
•是什么: 这是DDD中最关键的设计和技术概念。它定义了一个显式边界,在这个边界内,领域模型(如实体、值对象、聚合)是一致且无歧义的。它主要目的是解决模型重复和术语混淆的问题。•目的: 指导我们如何设计软件模型,如何划分微服务边界。一个界限上下文对应一套统一的通用语言(Ubiquitous Language)。•关键点:
•同一个术语(如“产品”),在不同的界限上下文中,可能意味着完全不同的东西,拥有不同的属性和行为。•它不是一个模块或一个类,而是一个逻辑上的边界,通常对应一个微服务、一个应用程序或一个业务能力。
•例子:
•在电商平台中,“产品”在商品目录上下文中,意味着展示和描述,拥有名称、描述、图片等属性。•同一个“产品”在订单上下文中,意味着一次交易的快照,拥有价格、下单时的SKU等属性,并且一旦生成就不能更改。•这两个“产品”模型是不同的,它们存在于不同的界限上下文中。
•类比: 在医院里,“药房”是一个界限上下文,它有自己的一套术语和工作流程(例如“处方”、“药品批次”)。而“心脏科门诊”是另一个界限上下文,它也有自己的一套术语(例如“心电图”、“诊断报告”)。这两个部门(上下文)需要协作,但它们的内部模型和语言是独立的。
现在我们来回答你的核心问题:它们是一回事吗?
不是。但它们之间存在强烈的映射关系。
特性 | 领域子域 (Subdomain) | 界限上下文 (Bounded Context) |
|---|---|---|
所属空间 | 问题空间 (Problem Space) | 解决方案空间 (Solution Space) |
目的 | 分析业务,识别核心、支撑和通用部分 | 设计软件,定义模型边界,避免歧义 |
本质 | “它是什么?” - 对业务能力的划分 | “我们如何实现它?” - 对软件实现的划分 |
驱动者 | 业务架构师、领域专家 | 软件架构师、开发人员 |
关系 | 描述问题的边界 | 描述解决方案的边界 |
理想情况下,我们希望一个子域(尤其是核心域)恰好被一个界限上下文所实现。这种一对一的映射关系最清晰、最理想。
•例如:“商品推荐”这个核心子域,最好由一个独立的“推荐服务”(即一个界限上下文)来实现。
但在现实中,由于历史、技术或组织原因,关系可能更复杂:
1.一个界限上下文可能实现多个子域: 在一个单体应用中,可能一个大的应用程序(一个界限上下文)包含了核心域、支撑子域和通用子域的代码。2.一个子域可能由多个界限上下文协作实现: 一个复杂的“订单处理”子域,可能会被拆分成“订单服务”、“支付服务”、“库存服务”等多个界限上下文来共同完成。
总结来说:子域是我们要解决的问题的划分,而界限上下文是我们设计的解决方案的划分。我们通过分析子域来帮助我们找到设计界限上下文的切入点。
用一个最终的比喻来帮你巩固理解:
•领域 (Domain) = 你要开一家医院•子域 (Subdomain) = 你对医院业务的规划:哪个是核心科室(核心域),哪个是药房(支撑子域),哪个是财务后勤(通用子域)。•界限上下文 (Bounded Context) = 你为医院设计的各个部门:每个部门有独立的办公室、自己的工作流程、自己的文件术语。它们之间通过清晰的接口(如会诊单、化验申请单)进行协作。
所以,界限上下文不是领域子域。子域是关于“是什么”的业务问题,而界限上下文是关于“如何做”的技术解决方案。理解二者的区别和联系是成功运用DDD的关键。
界限上下文(Bounded Context)、领域子域(Subdomain)和微服务(Microservice)这三者构成了从业务问题分析到技术解决方案落地的完整链条。
它们之间的关系可以用一句话概括:
领域子域用于划分问题空间,界限上下文用于划分解决方案空间(软件模型),而微服务是实现界限上下文的一种主流物理部署形式。
维度 | 领域子域 (Subdomain) | 界限上下文 (Bounded Context) | 微服务 (Microservice) |
|---|---|---|---|
所属层次 | 业务架构 (Business Architecture) | 系统架构 (System Architecture) | 技术架构/部署架构 (Technical/Deployment Architecture) |
核心关注点 | “什么” (What) - 业务的核心竞争力和能力是什么? | “如何”建模 (How to Model) - 软件模型如何设计才能无歧义地表达业务? | “如何”实现 (How to Implement) - 软件如何开发、部署和运行? |
划分依据 | 业务能力 (Business Capability) | 语义边界 (Semantic Boundary) & 通用语言 (Ubiquitous Language) | 技术边界 (Technical Boundary) & 自治性 (Autonomy) |
本质 | 对问题域的逻辑划分 | 对解决方案模型的逻辑划分 | 一个可独立部署的物理单元 |
驱动者 | 业务专家、产品经理、业务架构师 | 架构师、开发团队 | 架构师、运维团队、开发团队 |