问题域与解决方案域
领域驱动设计的整个过程,其实就是从问题域到解决方案域的过程。问题域属于需求分析阶段,重点是明确这个系统要解决什么问题,能够提供什么价值,也就是关注系统的 What 与Why。解决方案域属于系统设计阶段,针对识别出来的问题域,寻求合理的解决方案,也就是关注系统的How。在领域驱动设计中,核心领域(Core Domain)与子领域(Sub Domain)属于问题域的范畴,限界上下文(Bounded Context)则属于解决方案域的范畴,它们之间的关系如图:
很多人总是困惑于核心领域/子领域与限界上下文之间的关系
一对一、一对多,或者多对多?然而就上图所示,由于二者出现在不同阶段,关注的重心也不尽相同,因此准确地说,它们之间并没有所谓的映射关系。前者关注于系统的价值与功能,因而对它们的识别,只限于从业务上对它们的分解。之所以要区分核心领域与子领域,不过是为后续的解决方案域提供实现成本的考量。对于核心领域,我们应付出更多的开发成本,组建更好的团队为其建立稳定正确的领域模型;至于子领域,就可以降低设计与开发要求,甚至可以引入外包团队对其进行开发,或者购买提供通用功能的组件或服务。
从问题域到解决方案域,实际上就是从需求分析到设计的过程,也是我们逐步识别限界上下文的过程。限界上下文是解决方案域的架构基石。一些开发人员在接触领域驱动设计时,常常会疑惑限界上下文究竟是什么?他们往往会结合自身的开发经验,想要将限界上下文视为模块、组件、包或服务。这实际违背了Eric Evans引入限界上下文的初衷。在从问题域推演至解决方案域时,限界上下文仅仅是一种业务边界的划分,在这个时候,根本就不应该考虑它究竟是模块、组件、包还是服务,因为这会导致技术决策对领域分析的干扰。只有在初步确定了限界上下文之后,进入实现阶段时,才开始考虑它究竟该映射为模块、组件、包还是服务,这一决策会直接影响整个系统的架构。
限界上下文
领域驱动设计对微服务设计的辅助(或者说推动)作用,主要体现在战略设计阶段。其中,限界上下文(Bounded Context)扮演了最关键的角色,是推动整个微服务设计的“核心引擎”
什么是限界上下文?
让我们来读一个句子:wǒyǒu kuài dì 到底是什么意思?