当前位置: 首页 > 后端技术 > Java

你知道这几年火起来的DDD是怎么出现的吗?以及与微服务的关系

时间:2023-04-01 15:08:49 Java

DDD为什么能火起来?先不讨论DDD的定义,先梳理一下DDD流行的背景。按照我学习的套路,总是先why,再解决什么问题,是什么,最后怎么用。我们都知道这几年随着设备和技术的发展,软件架构发生了很多变化,从最初的单机(BS/CS)架构到后来的集中式架构,再到今天的微服务架构,现在它基本上可以说,在微服务架构盛行的时代,DDD早在2004年就由EricEvans提出,但一直处于不温不火的状态,直到MartinFowler的《Microservices》引起了大家的关注,也就是微服务盛行之后(这里需要说明的是,微服务最早的提出者不是MartinFowler,而是FredGeorge),DDD又重新回到了人们的视野。为什么?先来看看三种技术架构的演进和主要区别:第一阶段是单机架构,其特点是整个开发围绕数据库进行设计和开发。第二阶段是三层集中式架构,采用面向对象的设计方法。业务逻辑分为业务层、逻辑层和数据访问层。这种架构很容易在一层或几层变得臃肿,可扩展性加之摩尔定律失效,单机性能有限。第三阶段是微服务架构。在集中式架构中,系统分析、设计、开发往往是独立进行的,每个阶段的负责人可能不同,因此涉及到通信信息丢失的问题。另外,项目从分析开始,开发过程很长,最终的开发设计很容易和需求不一致。微服务在第二阶段主要解决这些痛点,实现应用之间的解耦,解决单体应用的扩展性问题。微服务存在的问题进入微服务后,集中式架构的单体应用的很多问题都解决了,但是新的问题也应运而生。微服务的粒度应该多大?如何设计微服务?如何拆分微服务?微服务边界在哪里?很久以来人们都没有解决这个问题,就连MartinFowler在提出微服务架构的时候也没有告诉我们如何拆分微服务。甚至长期以来,人们对微服务的拆分存在一些误解。有人认为:“微服务很简单,就是把以前的单体应用拆分成多个部署包,或者把原来的单体应用架构拆分成多个部署包,换成支持微服务的技术架构,就是微服务了。”有人认为微服务应该拆分的越小越好,鉴于上述情况,很多项目由于前期拆分过多导致过于复杂,导致后期运维困难甚至上线。可以得出结论,微服务分裂困境的根本原因是不知道业务或微服务边界在哪里。也就是说,一旦确定了业务边界和应用边界,这个困境就迎刃而解了。DDD解决了确定业务边界的问题。可见DDD并不是一种技术架构,而是一种划分业务领域范围的方法论。DDD的兴起,是因为很多熟悉领域驱动建模(DDD)的工程师发现,在设计微服务时,利用DDD思想进行业务排序,可以很好地规划服务边界,可以很好地实现“高层次”的内外部微服务.内聚,低耦合”。于是越来越多的人把DDD作为业务划分的指导思想。那么,什么是DDD呢?确定业务边界,是一个高度复杂的领域设计思想,它把我们的问题一个一个地划分到领域中,试图通过分离技术实现的复杂性,主要解决软件难以理解和演化的问题,DDD不是架构,而是一种架构方法论,目的是简化复杂的问题域,帮助我们设计一个清晰的域和边界,能够很好的实现技术架构的演进。DDD由两部分组成,战略设计部分和战术设计部分。战略设计主要从业务角度出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,限界上下文可以作为微服务设计的参考边界。战术设计从技术角度出发,着眼于领域模型的技术实现,完成软件的开发与实现,包括聚合根、实体、值对象、领域服务、应用服务、资源的代码逻辑设计与实现图书馆。DDD战略设计会建立领域模型。这四个字放在一起,会让人感慨万千。其实就是纸老虎。一般来说,它是模拟某个领域的模型。这种模式比较抽象,但是方便人们交流。举个例子:公园里有一棵桃树。如果要研究桃树,应该怎么研究呢?桃子好吃吗?是不是很贵?种类?如何种植?它种植在哪里?做成红木剑?桃叶的药用价值?你看,每道题都这样去研究是有道理的,但是很费解。还记得初中生物书上的研究是这样的吗?按照大家的理解,植物首先分为多个器官,如桃、桃叶、桃花等,然后每个器官再根据功能再细分为组织,再根据形状和形态又分为不同的器官。该组织中每个细胞的其他功能。Cell,你看看这是不是很有条理的分析方法。DDD也是如此。当我们面对桃树这样一个复杂的业务时,我们首先根据内在的理解将其划分为多个器官(领域),然后再根据一定的维度(这里是功能)将其划分为每个领域的多个器官(这里是功能)。一个组织(聚合体),而每个组织又由许多细胞(实体)组成,这是一种策略,有什么好处?它可以保证我们讨论的边界,即讨论的事物是一个领域,一个维度。对于桃树来说,桃子、桃花、桃叶、树干都是不同的域。划分不同域的边界在这里称为域。Boundary,当我们确定了这些字段后,就可以保证我们讨论的是同一部分字段。这样做的好处是我们可以定义一些概念,或者说术语,在以后讨论的时候尽量少用信息丢失。DDD战略设计会建立一个领域模型,用来指导微服务的设计和拆分。DDD的第一步是头脑风暴,可以理解为一起讨论对业务的理解。把我们的业务域一个一个地分解,就像刚才那棵桃树一样。首先要做的是尽可能多地分析,确保每个领域都能得到关注。在实践中,经常使用用例分析和场景分析以及用户旅程分析,这是一个发散的过程。在头脑风暴阶段,会产生许多领域对象,例如实体、命令和事件。我们从不同维度对它们进行聚类,形成聚合、限界上下文等边界,建立领域模型。这是一个收敛过程。具体来说,我们可以分三步确定领域模型和微服务边界。Step1:梳理事件风暴中业务流程中的用户操作、事件、外部依赖,并根据这些元素梳理出领域实体等领域对象。步骤2:根据领域实体之间的业务关联,将与业务密切相关的实体组合起来形成聚合,并确定聚合中的聚合根、值对象和实体。在这个图中,聚合之间的边界是第一层边界,它们运行在同一个微服务实例中,这个边界是逻辑边界,所以用虚线表示。第三步:根据业务和语义边界等因素,在有界上下文中定义一个或多个聚合,形成领域模型。在这个图中,有界上下文之间的边界是第二层边界,这可能是未来微服务的边界。不同限界上下文中的领域逻辑是隔离的,运行在不同的微服务实例中,相互物理交互。隔离,所以是物理边界,边界用实线表示。除了域、聚合、实体之外,上面还出现了聚合根、值对象等词。此外,还有统一建模语言、子域、核心域、通用域、支持域等,其实都是纸老虎。之后,为了方便讨论某个领域,往往会形成一些概念。这些概念将由一些名词来概括。上面的名词就是这么来的。这称为统一建模语言。以下文章将解释这些词的含义。这里主要讨论DDD解决了哪些问题。梳理一下DDD和微服务的关系。DDD是一种架构设计方法,微服务是一种架构风格。两者本质上都是为了追求高响应性,从业务角度分离应用系统构建的复杂性。方法。两者都强调从业务出发,其核心本质是强调根据业务发展合理划分领域边界,不断调整现有架构,优化现有代码,保持架构和代码的生命力,这就是我们通常称为进化架构。.DDD主要侧重于从业务领域的角度划分领域边界,构建高效沟通的通用语言,通过业务抽象建立领域模型,保持业务与代码之间的逻辑一致性。注:运行时进程间通信、容错和故障隔离,实现去中心化的数据管理和去中心化的服务治理,专注于微服务的自主开发、测试、构建和部署。最后,本文主要讨论DDD为什么火起来的原因,它解决了哪些行业问题,DDD的主要思想,以及DDD的大致实现步骤。留个小问题:单体应用适合DDD吗?