DDD 的知识体系包含众多名词,如领域、子域、核心域、通用域、支撑域、限界上下文、聚合、聚合根、实体、值对象等。这些都是关键概念,但由于比较晦涩难懂,可能会让人们在还没开始实践 DDD 时就望而却步。因此,在基础篇中,我们要做好实践前的准备工作。
需要注意的是,在微服务设计和开发过程中,不一定会用到所有这些名词,但它们有助于理解 DDD 的核心设计思想和理念。而这些思想和理念,在 IT 战略设计、业务建模和微服务设计中都具有借鉴意义。
从这部分内容开始,我们将围绕这些 DDD 关键概念进行讲解,帮助大家理清它们与微服务的关系,以及它们在微服务设计中的作用。今天重点了解领域、子域、核心域、通用域和支撑域等重要概念。
如何理解领域和子域?
首先看领域的定义。汉语词典中解释领域是从事一种专门活动或事业的范围、部类或部门,百度百科则解释为一种特定的范围或区域。这两个解释的共同点是 “范围”,这也是 DDD 在设计中强调边界的原因。
在研究和解决业务问题时,DDD 会按照一定规则对业务领域进行细分。当细分到一定程度后,就会在特定边界内建立领域模型,并用代码实现该模型来解决业务问题。简单来说,DDD 的领域就是在这个边界内要解决的业务问题域。
由于领域是用来限定业务边界和范围的,所以它有大小之分,领域越大,业务范围就越大。
领域可以进一步划分为子域,划分出来的多个子域分别对应更小的问题域或更小的业务范围。
DDD 是处理高度复杂领域的设计思想,它旨在分离技术实现的复杂度。面对复杂的业务领域,DDD 使业务变得简单且易于理解、技术实现更容易的方法与自然科学研究类似。在自然科学研究中,遇到复杂问题时,通常会将问题逐步细分,然后针对细分后的问题域逐个深入研究,建立子域的知识体系。当所有子域的研究完成后,就形成了整个领域的完整知识体系。
我们来看上面的图,图中的例子是关于如何为桃树构建完整的生物学知识体系,初中生物课就提到了这种研究方法,其研究过程如下:
一、确定研究对象(研究领域)研究对象是一棵桃树,这相当于 DDD 中的研究领域。
二、对研究对象进行细分(划分子域)将桃树细分为器官,器官又分为营养器官(根、茎、叶)和生殖器官(花、果实、种子)。桃树整体的知识体系就是要研究的问题域(对应 DDD 的领域),而根、茎、叶、花、果实和种子这些器官就是细分后的问题子域(类似于 DDD 将领域划分为子域的过程)。
三、进一步细分器官(子域再细分)例如把叶子这个器官细分为保护组织、营养组织和输导组织等,这相当于 DDD 中将子域进一步细分的过程。
四、细分组织为细胞(确定最小单元)将组织细分为细胞,细胞是研究的最小单元,细胞之间的细胞壁确定了研究的最小边界。
并且,细胞核、线粒体、细胞膜等物质构成细胞,这些物质协同作用使细胞具备特定生物功能。这里可以把细胞看作 DDD 中的聚合,细胞内的这些物质看作聚合中的聚合根、实体和值对象等,在聚合内这些实体协作完成特定业务功能,这类似 DDD 设计中确定微服务内功能要素和边界的过程。
总结来说,每个细分的领域都有一个知识体系,即 DDD 的领域模型。当完成所有子域的研究后,就能建立全域的知识体系和全域的领域模型。
以上用自然科学研究方法说明了通过将领域细分为子域可以降低研究复杂度,接下来将切换到保险行业(作者所从事行业)来对比验证二者细分过程是否一致。
保险是一个较为庞大的领域。在早期,保险核心系统采用单体系统来实现所有功能。然而,随着保险业务的发展,单体系统逐渐无法满足需求,于是保险公司开始进行中台转型,采用分布式微服务架构来取代单体系统。在分布式微服务架构下,需要划分业务领域边界、建立领域模型并实现微服务落地。
为了对保险领域进行建模和建设微服务,可以依据业务关联程度以及流程边界,把保险领域细分为承保、收付、再保、理赔等子域。其中,承保子域还能够进一步细分为投保、寿险的保全、财险的批改等子子域。
在投保这个限界上下文当中,可以构建投保的领域模型,而这个投保的领域模型最终会映射到系统中,形成投保微服务。这就是保险领域细分和微服务建设的流程。
或许你会觉得,如果你不是保险行业的从业者,很难理解这个过程。但实际上,尽管不同行业的业务模型可能各异,然而领域建模和微服务建设的流程与方法大体上是相似的。其核心要点在于逐步分解问题域,从而降低业务理解和系统实现的难度。
如何理解核心域、通用域和支撑域?
在领域持续细分的进程中,领域会分化出各式各样的子域,而依据子域自身的重要性以及功能特性,可将其归为三大类别:核心域、通用域和支撑域。
核心域堪称重中之重,它是决定产品及公司核心竞争力的关键所在,承载着业务成功的关键要素,凝聚着公司独一无二的核心竞争力,是企业脱颖而出的制胜法宝。
通用域,所涵盖的是那些缺乏鲜明个性化诉求,却能被多个子域频繁共用的通用功能子域,它为不同子域提供标准化、通用性的服务,使得整体业务流程更为顺畅高效。
支撑域同样不可或缺,它属于一种功能性子域,虽然不具备决定产品和公司核心竞争力的关键功能,也并非通用功能,但却是维持业务正常运转必需的基础支撑部分。
对比这三类子域,核心域的地位无疑最为突出,后续在阐述相关目的时,还会以核心域为典型进行详尽剖析。要是将通用域和支撑域对应到企业系统中来举例说明的话,通用域就好比企业日常运营中所需用到的通用系统,像认证、权限管理这类应用,市面上随处可见,几乎不受企业特定属性的限制,购买后稍作调整甚至无需定制化就能直接投入使用。而支撑域则带有鲜明的企业个性特征,不具备广泛通用性,诸如数据代码类的数据字典等系统,专为企业自身特定的数据管理需求而打造。
那为什么要划分核心域、通用域和支撑域,主要目的是什么呢?
咱们还是以上图中的桃树为例。之前,我们把桃树细分成了根、茎、叶、花、果实和种子这六个子域,那桃树到底有没有核心域呢?要是有的话,究竟哪个才是呢?
要知道,不同的人看待桃树的视角各异。假设这棵桃树长在公园里,在园丁的眼中,他们盼着阳春三月能呈现 “人面桃花相映红” 的美景,此时,花就成了桃树的核心域。可要是桃树扎根在果园里,果农心心念念的是在丰收季收获沉甸甸、硕果累累的桃子,这样一来,果实便当之无愧地成为桃树的核心域。
很明显,处于不同场景,人们对桃树核心域的理解截然不同,相应地,对桃树的照料方式也大不一样。园丁会着重关注桃树花期所需的营养,果农却更聚焦于桃树落果期的营养补给,有时为了保障果实有充足的养分,甚至会剪掉那些疯长的茎和叶,而这些茎和叶就类似于通用域或支撑域。
同理,公司在进行 IT 系统建设的时候,鉴于预算和资源往往有限,对于不同类型的子域,自然得采取不同的关注度与资源投入策略,毕竟要懂得好钢用在刀刃上。
许多公司的业务乍一看颇为相似,实则商业模式与战略方向存在天壤之别,这就使得公司的关注点有所不同,进而在划分核心域、通用域和支撑域时,结果也会大相径庭。
就拿电商平台来说,淘宝、天猫、京东和苏宁易购同属电商范畴,可商业模式却各有千秋。淘宝是典型的 C2C 网站,也就是个人卖家面向个人买家;天猫、京东以及苏宁易购属于 B2C 网站,即公司卖家对接个人买家。即便苏宁易购与京东都采用 B2C 模式,二者的商业模式也不尽相同,苏宁易购是由传统线下卖场华丽转身成为电商,京东则是直营结合部分平台的运营模式。
正是由于商业模式的差异,才导致核心域的划分结果千差万别。有些公司的核心域或许聚焦于客户服务,有些可能侧重于产品质量,还有些可能锁定在物流环节。所以,公司在进行领域细分、构建领域模型以及推进系统建设时,务必要紧密结合公司的战略重点与商业模式,精准找出核心域,并且着重予以关注。
倘若你的公司恰好有意向转型微服务架构,我在此建议你和你的技术团队,务必将核心域的建设摆在首位,最好能具备绝对的掌控能力与自主研发能力。要是资源实在紧缺,不妨在支撑域或者通用域上动动脑筋,暂时采用外购的方式也不失为一种可行之举。
领域的核心理念在于把问题域层层拆解,一步一步细分下去,以此降低业务理解方面的难度,同时也让系统实现起来更加简便易行。借助这种领域细分的手段,能够逐步收窄微服务需要应对的问题范畴,进而构建出契合实际需求的领域模型。而一旦将领域模型投射到实际系统当中,就转化成了微服务。
再看核心域、支撑域以及通用域,它们存在的主要目的是:利用领域划分这一方式,清晰界定出不同子域在公司内部所具备的各异功能特性以及重要程度。如此一来,公司便能依据这些差异,针对各个子域制定不一样的资源投入计划与建设方案,在关注程度上自然也会有所区分。