DDD和微服务之间是什么关系?

2019 年 5 月 20 日

DDD和微服务之间是什么关系?

随着微服务架构的不断流行,很多企业开始在自己的业务中落地微服务。他们觉得采用微服务架构会让系统的开发与运维管理变得简单高效,并且还能提高系统的可用性。


但是当他们实际执行的时候,才发现就算采用了微服务架构也不能解决他们的问题,反而带来很多开发与运维上的负担。


于是他们就试着去找解决方案,最后很多人发现其实是自己划分微服务的方法错了,他们应该用 DDD(领域驱动设计) 的思想去指导微服务的实践。


那什么是 DDD 呢?DDD 与微服务之间到底有着什么样的联系?DDD 资深专家、Event Storming 之父 Alberto Brandolini 给出了自己的答案。


用一句话来说,DDD 是一种在面向高度复杂的软件系统时,关于如何去建模的方法论,它的关键点是根据系统的复杂程度建立合适的模型。


具体来讲,DDD 方法论在系统建模过程中,可以为团队中的各个角色提供一套“统一语言”,避免组件划分过程中的边界错位,完成领域图预演、需求分析、架构模型、代码模型、测试等工作。“统一语言”的概念在 DDD 中极为重要,因为在一个系统的构建过程中,往往业务人员关注的是业务架构,而技术人员则关注系统架构的表述方式。这就导致在将业务架构映射到系统架构的时候,需要经过一层“翻译”工作,这就会使工作变得复杂、低效。在 DDD 中,只要使用一个“统一语言”,就可以直接将业务架构与系统架构绑定,不需要进一步去翻译,从而增强系统对业务的响应速度。


另外,DDD 的中文翻译“领域驱动设计”中的“领域”一词指的是要实现的软件系统所要解决的实际问题所处的整个领域范围,它不仅包括系统架构的相关问题,还涉及到系统所支持的业务等内容,但它是与具体的开发技术无关的。也就是说 DDD 关注的是要构建的系统中,关于所要解决的问题的业务、流程和数据等内容是如何工作的,在这些东西理清之后,DDD 去构建出一个模型,接着再去选择具体的实现技术。DDD 强调的是解耦具体实现技术,所以它可以迅速梳理核心业务逻辑。


总结起来,DDD 的一个生命周期是这样的:在设计和实现一个系统的时候,这个系统所要处理问题的领域专家和开发人员以一套统一语言进行协作,共同完成该领域模型的构建,在这个过程中,业务架构和系统架构等问题都得到了解决,之后将领域模型中关于系统架构的主体映射为实现代码,完成系统的实现落地。而用什么方式去做领域模型的构建,方法是多样的,Alberto 自己就为此发明了 Event Storming(事件风暴),并成为了一种经典的 DDD 落地模式。


理解了 DDD 的核心理念,你就不难理解它和微服务的关系了。DDD 的本质是一种软件设计方法,而微服务架构是具体的实现方式。微服务架构虽好,但是他并没有给出如何对复杂系统进行分解的具体方法论,而 DDD 正好就是解决方案。


如上就是 Alberto 对于 DDD 的全部解释,希望对你有所帮助。


2019 年 5 月 20 日 17:2413573
用户头像
郭蕾 做有意思的事情!

发布了 210 篇内容, 共 107.5 次阅读, 收获喜欢 21 次。

关注

评论 1 条评论

发布
用户头像
第一眼看没几个字,也没有小标题,没有结构化。
细看了内容确实说出了精要,非常好,内容的信息量很大,很浓缩且不是浮云。
2019 年 10 月 24 日 10:20
回复
没有更多评论了
  • 领域驱动设计实现之路

    距离Eric Evans的那本《领域驱动设计——软件核心复杂性应对之道》出版,至今已有10年的时间。我想,多数有经验的程序开发者都应该听说过DDD,并且尝试过将其应用在自己的项目中。不知你是否遇到过这样的场景:你创建了一个资源库(Repository),但一段时间之后发现这个资源库和传统的DAO越来越像了,你开始反思自己的实现方式是正确的吗?或者,你创建了一个聚合,然后发现这个聚合是如此的庞大,它为什么引用了如此多的对象,难道又是我做错了吗?其实你并不孤单,我相信多数同仁都曾遇到过相似的问题。现在,我们有了《实现领域驱动设计》,作为该书的译者,我有幸通读了本书,受益匪浅,得到的结论是:好的软件就应该是DDD的。

  • 架构风格和架构模式速览

    应用架构指南2.0(微软模式和实践)的第6章讨论了诸如消息总线、分层架构、SOA之类的架构风格。除了这些风格,还有很多架构模式,比如插件、点对点、发布-订阅。有些作者对架构风格、模式和隐喻进行了区分。

  • 微服务架构深度解析与最佳实践 - 第一部分

    本文将从微服务架构相关问题的深度分析出发,阐述微服务架构落地的一些设计原则和利弊取舍,结合微服务架构过程的很多最佳实践经验,希望给读者带来一定的启发和思考,避免在实际应用过程中走弯路,能够多快好省的落地实现微服务架构。

    2020 年 4 月 22 日

  • Vaughn Vernon 谈论响应式领域驱动设计

    《Implementing Domain-Driven Design》一书的作者Vaughn Vernon最近举办了一个关于使用Scala与Akka(Actor模型的一种实现)结合DDD进行开发的讲座,这种设计方式能够避免在传统的事件驱动或Hexagonal架构中所经常面对的一些架构上的负担。

  • 下一代微服务安全架构

    2018 年 5 月 16 日

  • 聚合和聚合根:怎样设计聚合?

    为什么要在限界上下文和实体之间增加聚合和聚合根这两个概念?它们的作用是什么?怎么设计聚合?

    2019 年 10 月 23 日

  • 探索六边形架构

    分层系统是一种架构风格,它的本质是避免软件的可维护性最大的敌人——耦合的出现。端口和适配器架构风格,也叫做六边形架构,就是这种分层系统的一个示例。lan Cooper在一次演讲中为听众解释了各种架构风格的特性,尤其着重讲解了六边形架构的内容。

  • 架构师训练营 - 微服务,DDD

    架构师训练营 -Week10-Summary-Homework

    2020 年 8 月 11 日

  • 架构的本质:如何打造一个有序的系统?

    这一讲,主要我会和你分享架构的本质,让你对架构形成一个体系化的认知。

    2020 年 2 月 19 日

  • 视频:从实践出发探索架构的本质

    架构是什么?架构设计就是设计接口吗?如何成为一个好的架构师?架构种类很多,开发人员如何选择?如何划分用例的粒度?架构设计过程中一定要引入很多的文档吗?如何将需求转化成一个良好设计的架构?UMLChina首席专家潘加宇和资深咨询顾问温昱与读者分享了他们对这些让人迷惑的问题的看法。

  • DevOps 下的架构设计和实践思考

    本次分享将从架构驱动的角度,分享企业在实践 DevOps 的过程中,需要解决的问题和具备的能力。

  • 第 1 周 架构方法 浮皮潦草之总结

    浮皮潦草之我见

    2020 年 9 月 20 日

  • 战略设计:如何划分系统的模块?

    战略设计,就是将不同的模型进行分组。

    2020 年 7 月 31 日

  • 简述 JVM 垃圾回收原理和秒杀系统难点

    简述JVM垃圾收集原理和秒杀系统难点及架构思路。

    2020 年 8 月 5 日

  • 基于 DDD 的微服务设计实例代码详解

    带你看用DDD方法设计和开发出来的微服务代码到底是什么样的。

    2020 年 1 月 2 日

  • Week_01 学习总结

    怎么架构

    2020 年 9 月 20 日

  • 从事件和 DDD 入手来构建微服务

    领域驱动设计(Domain-Driven Design,DDD)是一项很伟大的技术,它拉近了设计与程序实际所服务的领域,但是通常我们会关注结构,从而太早地做出决策,这并非DDD的本意。相反,在领域中,我们应该从事件开始,Russ Miles描述了在构建微服务时,采用“事件优先”的方式所具有的优势。

  • 当 DDD 遇上 DCI(Data, Context, Interactive)架构模式丨 Archsummit

    DCI是数据、场景、交互(Data、Context、Interactions)简称,重点是关注数据的不同场景的交互行为,是面向对象系统状态和行为的一种范式设计;DCI在许多方面是许多过去范式的统一,多年来这些模式已经成为面向对象编程的辅助工具。

  • 分离关注点:软件设计至关重要的第一步

    在设计中,将一个模块的不同维度分开,有一个专门的说法,叫分离关注点,它是我们在做设计的时候,需要时时绷起的一根弦。

    2020 年 5 月 27 日

  • Week1

    软件架构由架构元素和元素间的关系组成,架构不单单指软件代码。硬件服务器,业务架构,部署架构,开发架构等等等等,都是软件架构的一部分。所有系统都需要有架构设计。

    2020 年 6 月 9 日

发现更多内容

央行数字货币:第三方支付产业新变量

CECBC区块链专委会

数字货币 DCEP 区块链技术

一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?

朱月俊

消息队列(二)如何保证消息队列的高可用?

奈何花开

Java MQ 消息队列

太厉害了!阿里年薪120W架构师整理的学习笔记,看完收获良多

互联网架构师小马

Java 阿里巴巴 程序员 学习笔记 架构师

CECBC带你一图看懂区块链

CECBC区块链专委会

CECBC 区块链技术 去中心化

《架构师训练营》第四周命题作业

谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert

newbe36524

C# MySQL 数据库 mongodb Reactive

极客时间 - 架构师培训 - 4 期作业

Damon

原来使用Postman如此简单,API测试之Postman使用全指南

软测小生

接口 Postman 接口测试 API API测试

《架构师训练营》第四周总结

消息队列(三)如何保证消息不被重复消费?

奈何花开

Java MQ 消息队列

ARTS-WEEK5

一周思进

ARTS 打卡计划

MyBatis标签trim,你不会以为我是去空格的吧?

Java小咖秀

Java mybatis Java 面试

阿里待遇那么好,你为什么从阿里离职?

互联网架构师小马

Java 阿里巴巴 程序员 找工作 离职

区块链冷链食品追溯系统

CECBC区块链专委会

区块链技术 上链 溯源 浙冷链

【源码系列】Spring Cloud Eureka

Alex🐒

源码 Spring Cloud Eureka

一文带你学会 Blob(含 7 个使用场景)

pingan8787

JavaScript 前端 Web Blob

架构师训练营作业 -Week4

wyzwlj

极客大学架构师训练营

系统架构感想

朱月俊

架构师训练营 - 第四周 - 学习总结

stardust20

大型互联网公司技术方案与手段浅析

俊俊哥

分布式 高可用 大型软件 高并发 解决方案

架构师训练营第四周学习总结

锦澄

快来解锁Pepper机器人新技能,够酷Pepper就跟你回家!

阿甜

编程 开发者 App 开发 机器人

每周学习总结 - 架构师培训 4 期

Damon

清华百万年薪架构师,精心编写多线程与高并发实战PDF

互联网架构师小马

Java 程序员 多线程 架构师 多线程与高并发

小师妹学JVM之:JIT中的PrintAssembly

程序那些事

JVM 小师妹 性能调优 JIT 汇编

关于编码的一点“思考”

damnever

golang 思考 抽象 分层架构 编码

学习总结 - 第 4 周

饶军

SQL运行内幕:从执行原理看调优的本质

arthinking

MySQL 数据库

信息的表示与存储-浮点数的运算

引花眠

计算机基础

ARTS打卡 第5周

引花眠

ARTS 打卡计划

浅谈银行数据仓库

浅谈银行数据仓库

DDD和微服务之间是什么关系?-InfoQ