领域
用以确定边界。 DDD按规则细分业务领域,细分到一定程度,DDD会将问题范围限定在特定边界,在该边界内建立领域模型,进而用代码实现该领域模型,解决相应业务问题。
领域就是该边界内要解决的业务问题域。其越大,则业务范围越广。
领域模型的特点
对业务领域做了建模
- 细粒度的类,易于扩展,容易复用
- 可以应对复杂的业务逻辑
- 需要经验才能掌握 简单的领域模型
- 几乎和数据库中的表 一一对应
- 复杂领域模型
- 一使用了继承,组合,设计模式等各种手段
子域
领域可进步划分为子领域。划分出来的多个子领域称为子域,每个子域对应一个更小的问题域或业务范围。
DDD是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂度。 DDD的研究方法与自然科学类似。当人们在自然科学遇到复杂问题时,通常将问题步步细分,再针对细分出来的问题域,逐个深入研究,探索和建立所有子域的知识体系。当所有问题子域完成研究时,我们就建立了全部领域的完整知识体系了。
每个细分的领域都有一个知识体系,即DDD的领域模型。在所有子域研究完后,就建立了全域的知识体系(领域模型)。
以笔者所在的酒店行业为例。一开始的酒店核心系统是把所有功能放在一个系统,即单体架构。后来业务发展,开始转型中台,引入微服务架构。微服务架构就需划分业务领域边界,建立领域模型,并实现微服务落地。 为实现酒店领域建模和微服务建设,可根据业务关联度及流程边界将酒店领域细分为:网上预定,入住,退房,客房服务,点餐等领域事件。
- 网上预订,入住,退房。是酒店领域一定要有的功能,这就是核心子域。
- 客房服务,点餐等不影响主要功能的就是支撑子领域。
- 在预订这个限界上下文内可以建立预订的领域模型的领域模型最后映射到系统就是预订微服务。
这就是一个酒店领域的细分和微服务的建设过程。
不同行业的业务模型可能会不一样,但领域建模和微服务建设的过程和方法基本类似,其核心思想是将问题域逐步分解,降低业务理解和系统实现的复杂度。
领域可细分为不同子域,子域可根据自身重要性和功能属性划分为三类子域:
核心域
决定产品和公司核心竞争力的子域是核心域,它是业务成功的主要因素和公司的核心竞争力。
通用域
没有太多个性化诉求,同时被多个子域使用的通用功能子域是通用域。比如认证、权限等,这类应用很容易买到,没有企业特点限制,无需太多定制化。
支撑域
既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,但又是必需的支撑域。支撑域具有企业特性,但不具通用性,例如数据代码类的数据字典等系统。
划分核心域/通用域/支撑域的意义
不同场景下,不同的人对桃树核心域的理解不同。
核心域、支撑域和通用域的主要目标是:通过领域划分,区分不同子域在公司内的不同功能属性和重要性,从而公司可对不同子域采取不同的资源投入和建设策略,其关注度也会不一样。 由于预算和资源有限,对不同类型子域应有不同关注度和资源投入策略。商业模式和战略方向决定公司在划分核心域、通用域和支撑域时的结果。
都是电商平台的淘宝、天猫、京东和苏宁易购,商业模式却不同:
- 淘宝是C2C
- 京东和苏宁易购则是B2C
- 苏宁易购是传统线下卖场转型成为电商
- 京东是直营加部分平台模式
导致其核心域划分结果自然也不同。在公司领域细分、建立领域模型和系统建设时,就要结合公司战略重点和商业模式,找到核心域,且重点关注核心域。
总结
领域的核心思想是将问题域逐级细分,降低业务理解和系统实现的复杂度。 通过领域细分,逐步缩小微服务需要解决的问题域,构建合适的领域模型,而领域模型映射成系统就是微服务。