云原生时代,领域驱动设计思想(ddd)如何落地?

华为云开发者社区 华为云开发者社区     2023-02-27     159

关键词:

摘要:随着数字化世界的持续演进,软件架构设计思想在碰撞中不断优化。云原生时代的到来,加速了行业对于领域驱动设计理念(Domain-Driven Design)的实践落地诉求。

本文分享自华为云社区《云原生时代,领域驱动设计思想(DDD)如何落地?》,作者:敏捷的小智 。

随着数字化世界的持续演进,软件架构设计思想在碰撞中不断优化。云原生时代的到来,加速了行业对于领域驱动设计理念(Domain-Driven Design)的实践落地诉求。

在刚刚结束的DDDChina2021领域驱动设计峰会上,华为云数据建模架构师凌云分享了自己对领域驱动设计理念的理解和实践。

软件架构的演进

近些年随着经济和科技的迅猛发展,各行各业或多或少都有软件系统的应用,电商、银行等行业的迅速发展带来的业务复杂度提升、访问并发量提高,都对软件的可靠性、稳定性提出了更高的要求。因此软件架构在近些年经历了从单体架构、到分布式架构、再到目前比较主流的微服务架构,以及逐渐兴起的Serverless架构的演进过程。

什么是领域驱动设计思想(DDD)呢?

DDD的全称为Domain-Driven Design,即领域驱动设计,是在一定领域内,发现问题,抽象共性不变的流程,进而提供问题解决方案的过程。它的方法是通过一个统一语言领域建模、领域划分等一系列手段来降低复杂度,并基于面向对象分析(OOP)技术进行了分层规划,对软件开发全生命周期使用语言进行统一,并强调业务与技术相结合的一种过程。

-为什么要建模?

建模通过可视化的模型,让懂业务的人和懂技术的人可以互相交流沟通。同时,我们做了一个模型之后可以很方便的复用传播,在其它项目中进行改造,最后还可以对做出的决策进行文档化。

-什么是“领域”模型?

领域的逻辑就是显性的专业知识。比如现在需要开发一款法务人员使用的软件系统,那么就会存在这样的问题:法务人员不懂软件开发,开发人员不懂法律条文信息,而在开发过程中二者又需要进行不断的沟通和确认,法律领域的模型就是连接二者的一个桥梁,领域模型主要倾向于将领域的知识给描述出来,管理合规性。

-领域建模和软件架构的关系

DDD如何落地

下面通过一个具体的数据建模软件的案例来给大家说明一下如何落地DDD。

以一款数据建模软件开发为例,逻辑模型和物理模型如下图:

逻辑模型

物理模型

我们可以通过如下步骤实现DDD的落地:

1、与领域专家交流

与领域专家交流是整个流程的重中之重,在该过程中业务建模人员需要对概念、操作、行为、约束等较为熟悉,因此,领域建模的第一步,是明确业务边界,将系统的所有行为收缩到可视化建模子领域以内。其次需要理解数据变化的逻辑,在可视化建模的概念-逻辑-物理正向设计过程中,概念驱动逻辑,逻辑驱动物理,针对不同角色的用户,所关注的阶段并不同。从业务角度看,实体变更将驱动表变化;从用户角度看,业务逻辑变更要求系统演变适配。最后与领域专家验证需求,正向推送逻辑:实体变更审核通过,则驱动对应表发生变化。此变化在物理模型上,开发者应根据表的变更,修改软件系统的实现。

2、实现对应的领域模型

合理规划业务对象的关系、继承,实体包含属性、表包含字段、表包含索引、关系关联两个实体、ER图包含实体、关系等。确定聚合关系,实体头信息和属性列表构成实体、表头信息和字段列表+索引列表构成表、版本状态与流程构成版本化。接下来需要确定值对象,如字段类型、索引类型、操作动作类型等,最后领域模型验证需求,通过以上的流程我们实现了一个领域模型,如下图:

根据建立的领域模型,把通用部分抽象出来,相应的UML图也进行了一些修改,领域模型就已经创建完成了。

3、设计原型界面和交互逻辑

实现对应的一个领域模型,接下来设计原型界面和交互逻辑,交互逻辑可以理解为这个领域模型的各种事件、事件驱动。

4、领域模型自动生成结构框架代码

通过领域模型构建的UML图可直接生成项目框架代码,在框架代码中会生成相应的实体类,以及各种事件也生成了相应的event代码。

UML图自动生成框架代码

5、在框架中进行细化和优化

代码框架可以直接使用,如果还需要扩展其它的内容,比如除了增删改以外,还希望具有查询历史版本的功能,这种event在领域图上难以表达,或者是表达了之后生成的也不一定准确,所以这种情况的代码需要软件开发者来编写。但是已经不需要再关注那些框架性的接口或者服务层的问题了,只需要在相应的地方,对特性能力进行增强即可。

通过以上步骤完成的建模软件系统落地, 既能自动生成代码又能做好看护,保持架构与DDD模型的一致性。

通过以上讲解,您对领域驱动设计(DDD)理念有初步的了解了吗?任何理念的应用都需要深入的体会和反复的实践,希望本文能给大家一些启发和帮助。

点击关注,第一时间了解华为云新鲜技术~

ddd领域驱动设计如何进行工程化落地

📣📣📣📣📣📣📣🎍大家好,我是慕枫🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识🎍在这里和大家分享一线互联网大厂面... 查看详情

ddd领域驱动设计如何进行工程化落地

📣📣📣📣📣📣📣🎍大家好,我是慕枫🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识🎍在这里和大家分享一线互联网大厂面... 查看详情

ddd领域驱动设计落地实践系列:战略设计和战术设计

...一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导。但是对于如何具体落地使用DDD,可能大家还是一脸懵B的状态,因此从本文开始以及后面的文章将对如何进... 查看详情

领域驱动设计实战-ddd

领域驱动设计实战领域驱动(DDD,DomainDrivenDesign)为软件设计提供了一套完整的理论指导和落地实践,通过战略设计和战术设计,将技术实现与业务逻辑分离,来应对复杂的软件系统。本系列文章准备以实战的角度来介绍DDD,首... 查看详情

学习:ddd领域驱动设计

DDD:Domain-drivenDesign(领域-驱动->设计)->领域驱动领域模型设计->领域模型驱动代码实现 摘自网络(汤雪华的博客)《概念总结》领域就是问题域,有边界,领域中有很多问题;任何一个系统要解决的那个大问题都对应... 查看详情

领域驱动设计(ddd)实践之路:如何设计聚合

...:https://mp.weixin.qq.com/s/oAD25H0UKH4zujxFDRXu9Q作者:wenbozhang【领域驱动设计实践之路】往期精彩文章:《领域驱动设计(DDD)实践之路(一)》主要讲述了战略层面的DDD原则《领域驱动设计(DDD)实践之路(二):事件驱动与CQRS》分析了如何应... 查看详情

ddd领域驱动设计落地实践系列:微服务拆分之道

...,后续的文章中将逐渐深入DDD的实践细节,包括领域模型与代码模型的映射以及具体的微服务设计实例等。当下微服务盛行,微服务架构解决了单点系统的可用性问题、突破单节点服务的性能瓶颈同时提升了整个系统... 查看详情

十年开发老司机,感悟ddd领域驱动设计的战略设计到底是什么?

...分首先需要明确:问题是什么我们要解决的问题就是领域问题,相关概念如,子域、核心域、支撑域、通用域等 查看详情

ddd领域驱动设计基本理论知识总结

 原文:DDD领域驱动设计基本理论知识总结 领域驱动设计之领域模型加一个导航,关于如何设计聚合的详细思考,见这篇文章。2004年EricEvans发表Domain-DrivenDesign–TacklingComplexityintheHeartofSoftware(领域驱动设计),简称EvansDDD... 查看详情

领域驱动实战-支付系统

参考技术A在Airwallex,领域驱动设计(DDD)方法被用来指导我们的工程师如何对复杂的业务问题和系统设计建模。在这篇博客中,我们提供了一个全面的工作流,我们使用DDD模式进行建模,然后对支付系统进行落地。全球支付系统是... 查看详情

ddd(领域驱动设计)从入门到精通

参考技术A一、DDD领域驱动设计-基本原理1、DDD领域驱动设计-入门介绍2、DDD领域驱动设计-基本概念    2.1.DDD领域驱动设计-领域和子域    2.2.DDD领域驱动设计-限界上下文    2.3.DDD领域驱... 查看详情

ddd领域驱动设计-ddd概览

参考技术A#DDD概览##启迪领域可以理解为业务,领域专家就是对业务很了解的人。限界上下文也就是微服务的边界,也可以理解为微服务,一个限界上下文=一个微服务。个人理解领域驱动设计就是微服务驱动设计,从战略上先进... 查看详情

互联网的未来架构之道-ddd领域驱动设计

DDD真的来了。后微服务时代,软件系统越来越庞大,也越来越老化。需求越来越模糊,代码越来越混乱,测试越来越困难,技术演进也基本不可能。大型软件项目很快从充满朝气的,充满竞争力的青年࿰... 查看详情

ddd核心概念与domainprimitive(代码片段)

...MartjnFowler提出微服务架构后,DDD才真正迎来了自己的时代。​DDD首先从业务领域入手,划分业务领域边界,采用事件风暴工作坊方法,分析并提取业务场景中的实体、值对象、聚合根、聚合、领域事件等领域对象&... 查看详情

可落地的ddd-如何利用ddd进行微服务的划分

...划分问题分析上篇介绍过我们一开始的服务划分标准一个领域一个服务的规则去拆分,同时为了保证领域的纯洁性,我们区分了领域服务,和前台服务。领域服务就是领域逻辑,不直接对前端暴露。前台服务组装各个领域服务,... 查看详情

什么是领域驱动设计 (DDD)? [关闭]

】什么是领域驱动设计(DDD)?[关闭]【英文标题】:WhatisDomainDrivenDesign(DDD)?[closed]【发布时间】:2010-11-1609:10:07【问题描述】:我不断看到DDD(域驱动设计)在文章中被大量使用-我已经阅读了有关DDD的Wikipedia条目,但仍然无法弄... 查看详情

ddd专栏4:ddd如何保护领域模型

04、DDD如何保护领域模型​上一讲中,我们已经提到了领域服务、实体和值对象的重要性,基于这些基础对象,就能够形成一个基础的领域模型。我们对这个领域模型进行一些贫血模型和充血模型的设计,就能搭建出一套基于领... 查看详情

浅析领域驱动设计

1.概要DDD(Domain-drivendesign,模型驱动设计)是一种软件设计的指导思想,而非固定的一套公式化开发模板(这样就会导致网络上出现各种基于自己或业务上的理解而产出的DDD落地的实现,会让很想学习的开... 查看详情