Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么在做微服务设计的时候需要DDD?

为什么在做微服务设计的时候需要DDD?

作者头像
xcbeyond
修改于 2021-03-14 05:22:40
修改于 2021-03-14 05:22:40
1.3K0
举报
文章被收录于专栏:技术那些事技术那些事

记得之前在规划和设计微服务架构的时候,给了我一个至今依然记忆深刻的提示:『你的设计蓝图里为什么没有看到DDD的影子呢?』

随着对充血模型的领域认知的加深,我越加感觉到DDD的重要性。于是网上一顿海找,并做了学习笔记。

DDD内容繁多,个人浅见,它不同于传统贫血的最核心的一点就是把原先传统的贫血模型里的业务逻辑层拎出来,融入到Domain层,这样面对复杂业务的规模化变更,我们只需要专注于Domain即可。

回到主题,我们要了解的是微服务DDD到底有什么关系呢?

因为在互联网时代,软件所面临的问题域比以往要复杂得多,这种复杂性来源于不断扩展的问题域自身,也来源于创新变化,以及这种规模性增长所带来的挑战。

然而一个人一个团队,他对复杂的事物的认知是有极限的,面对这种复杂问题唯一的方法就是分而治之。分主要考虑的是如何去分;治意味着分出来的每一个部分要能够独立的运行,能够互相的协作,完成整体的目标,能够一来应对外部变化所带来的冲击。

微服务的缺陷

微服务架构在分和治两个方面都给出了很好的理论指导和最佳实践,那微服务是不是解决复杂问题的银弹呢?其实不然,很多团队在应用了微服务架构来构建他们的系统以后,发现并没有完全解决这种复杂性问题,甚至还带来了一些其他的问题。比如:

  • 服务并没有解决复杂系统如何应对需求变化这个问题,甚至还加剧了这个问题。
  • 当一个需求变化了,需要花大量的精力去识别这个变化影响到了哪些微服务,这些服务的多个团队之间,需要通过无休止的扯皮去决定哪个服务多一些,哪些服务少改一些。
  • 然后测试团队还需要做昂贵的这种联调测试
  • 即便如此呢,开发团队依然不放心,还要通过一系列的开关控制,小心翼翼的去做切流,去做灰度发布。

从业务层面来看,微服务架构没有避免这种散弹式的修改。甚至反而加重了他,这是为什么呢?一个重要的原因是微服务架构在分的这个纬度考虑的并不全面。

DDD功能

当我们去做分的这种工作的时候,需要考虑哪些维度呢?我觉得我们至少要考虑三个维度:

  • 功能纬度
  • 质量纬度,比如性能,可用性
  • 工程纬度

微服务对第2个给出了很好的指导,对第3个也给出了一些建议。但是,对第1个功能纬度只给出来非常有限的指导,就是为什么随着微服务的流行,领域驱动设计(DDD)又被重新重视起来的原因。

DDD弥补了微服务在功能划分方面没有给出很好指导的缺陷。所以他们在面对复杂问题和构建系统时候是一种互补的关系,在系统拆分的时候可以很好的协作。

只是他们看待系统拆分这个角度是不同的。微服务当中的服务所关注的范围正是DDD所推崇的六边形架构中的领域层。

拆分案例

接下来结合DDD和微服务来拆分一个复杂系统。

关于领域

我们称企业的业务范围和在这个范围里进行的活动为领域,和软件系统无关。领域会分成多个子域,比如我们一个电商系统,会有:

  • 商品子域
  • 订单子域
  • 库存子域等等。

在不同的子域里,不同的概念有不同的含义。所以我们在进行领域建模的时候,必须要有一个明确的领域边界,也就是DDD里称做的限界上下文,它是系统内部的一个架构边界,决定了这个系统架构。

划分系统内部架构边界

架构简洁之道这本书里边就说过:『系统架构是由系统的内部架构边界以及边界之间的依赖关系所决定的,与系统中各个组件之间的通信和调用的方式是无关的』。我们常说的微服务的服务调用本身只是一种比函数调用方式成本稍高的,分割应用程序行为的一种形式,系统架构无关。

 所以,复杂系统划分的第一重要的是要划分内部的架构边界,即划分清楚这个上下文,以及明确他们之间的关系,这对应于我们之前说的功能的维度。这正是DDD用武之处。其次我们才考虑基于非功能的维度如何划分,这是微服务能够发挥其优势的地方。

举个例子,我们把系统分成ABC三个个上下文,三个上下文的代码可以在一个部署单元里运行,通过进程内调用来完成操作,这就是典型的单体架构:

也可以各自在一个独立的部署单元里运行,通过远程调用来完成操作,这就是现在流行的微服务架构。

边界清晰的好处

我们更多的是两种架构模式的一个混合,比如A和B一起是一个部署单元,C是另外一个独立的部署单元,这种情况往往是因为C非常重要,他并发的访问量非常大,或者它的需求变更比较频繁。将C拆分出来的有以下几个好处:

  • 资源倾斜
  • 使用弹力设计模式:比如重试,熔断,降级
  • 使用特殊技术:比如Go语言
  • 具备独立代码库:有独立团队和运维人员,和A和B的运行期做到隔离不互相影响

这四点正是服务架构所关注的,它是基于非功能纬度的视角来看待拆分这件事情的,他关注的不是系统架构的逻辑边界,更多的关注的是应用程序行为的分隔。

那为什么不把A和B都拆成一个独立的部署单元?

这会带来更多的好处,也会带来额外的成本,架构应该是可以演进的,在业务发展的早期,应该关注系统架构的逻辑边界,保持逻辑边界的清晰和关系的正确,随着业务量的增加,逐步在做拆分,这是组合应用DDD和微服务架构带来的最大的好处。

在单体架构中,保持架构逻辑边界不被突破是有一定难度。如果逻辑边界不清晰,在需要服务器拆分的时候,就未必能拆得出来了。另外没有人一下子就可以把逻辑边界定义正确,即使这个上下文定义的不太正确,在DDD聚合根这个概念可以保障我们能够演进出更适合的上下文。

DDD界限上下文内部通过实体和值对象来对领域概念进行建模,一组实体和值子对象归属于一个聚合根。那按DDD要求:

  • 聚合根用来保证内部实体规则的正确性和数据的一致性
  • 外部对象只能通过ID来引用聚合根,不能引用聚合根内部的实体
  • 聚合根之间不能共享一个数据库事务,它们之间的数据一致性需要通过最终的一致性来保障

有了聚合根,基于这些约束,未来可以根据需要把聚合根升级为上下文,甚至拆分成微服务都是比较容易的。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深度解析DDD中台和微服务设计
导读:本文来源于 2020 年第四届 DDD 中国峰会主题演讲:《当中台遇上 DDD,如何设计微服务》。DDD 非常强调统一语言,而 DDD、中台与微服务产生于不同的时代,三者分别属于不同的方法体系,而方法论的融合首要在于建立统一语言,那么:
IT阅读排行榜
2021/02/05
9330
深度解析DDD中台和微服务设计
领域驱动设计(DDD)理论启示
过去几年通天塔一直处于快速的业务能力建设和架构完善的阶段,以应对不断增长的业务需求和容量、高可用等技术需求,现在通天塔平台已经能满足集团主站的大部分活动、频道搭建和运营能力,主流程的新需求越来越少,个性化需求和非标准化流程的数据源和服务接入的需求越来越多,有些甚至是京东零售体系外的,同时通天塔技术和产品也在积极主动寻求变化和创新,这些因素结合在一起驱动通天塔孵化出了一个以技术为导向的项目:通天塔积木,旨在构建一个基于完全开放的前端SDK和后端数据源&服务、高度灵活和强大的积木画布、能够快速移植和部署到任何第三方IT环境的活动搭建解决方案,这套方案的初衷和设计理念也契合了京东国际化赋能和PaaS化的战略。目前通天塔积木已经取得阶段性成果,已开始赋能京东国内和国际站,但如何应对异常复杂的积木业务逻辑和不可预知的业务变化,构建业务和底层技术基础实施的完全解耦的系统,一直是我们面对的巨大挑战。也是时候从更高视角来看清问题和源头,思考一种能应对和控制业务复杂度、具备强扩展性和弹性的解决方案。纵观我们的目标,DDD这个词不知不觉映入了我的眼帘。
物流IT圈
2020/03/16
1.8K0
领域驱动设计(DDD)理论启示
驱动领域DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案。 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴领域驱动设计思想,指导微服务项目团队进行设计和开发(理论篇详见《当中台遇上 DDD,我们该如何设计微服务?》)。本文包括三部分内容:第一部分讲述领域驱动设计基本知识,包括:分层架构、服务视图、数据视图和领域事件发布和订阅等;第二部分讲述微服务设计方法、过程、模板、代码目录、设计原则等内容;最后部分以一个项目为例讲述基于 DDD 的微服务设计过程。
星哥玩云
2022/07/29
7611
驱动领域DDD的微服务设计和开发实战
如何使用 DDD 指导微服务拆分?
软件架构的发展经历了从单体架构、垂直架构、SOA架构到微服务架构以及到现在最新的service mesh(网格服务架构)的过程。借用dubbo的网站架构发展图和说明:
架构精进之路
2021/07/30
1.9K0
如何使用 DDD 指导微服务拆分?
从架构演进谈 DDD 兴起的原因以及与微服务的关系
我们先不讨论DDD的定义, 先梳理一下DDD火起来的背景, 根据我学习的套路, 永远是为什么为先,再是解决什么问题,是什么东西, 最后如何使用。我们都知道这些年随着设备以及技术的发展,软件架构发生了很多变化,从最初的单机(BS/CS)架构到后面的集中式架构,再到如今的微服务架构。
玄姐谈AGI
2021/07/06
5110
从架构演进谈 DDD 兴起的原因以及与微服务的关系
人人都在跟风学微服务,却不知道DDD领域驱动设计?
最先介绍领域驱动设计(domain-driven design)的是在程序员 Eric Evans 2004年出版的《领域驱动设计:复杂软件核心复杂应对之道》书籍中,领域驱动设计是领域概念的扩展和应用,并且将它应用在软件开发中。它的目标是将软件相关部分连接到不断发展的模型中,以此更容易创建复杂的应用。
Lvshen
2022/05/05
4490
人人都在跟风学微服务,却不知道DDD领域驱动设计?
04期:领域驱动设计与微服务
这里记录的是学习分享内容,文章维护在 Github:studeyang/leanrning-share。
杨同学technotes
2023/03/20
4000
04期:领域驱动设计与微服务
可落地的DDD(4)-如何利用DDD进行微服务的划分(2)
在前面一篇介绍了如何通过DDD的思想,来调整单体服务内的工程结构,为微服务的拆分做准备。同时介绍了我们在进行微服务拆分的时候踩过的一些坑。 这篇介绍下我们最终的方案,不一定对,欢迎留言讨论。
方丈的寺院
2019/08/05
7500
可落地的DDD(4)-如何利用DDD进行微服务的划分(2)
DDD实战课--学习笔记
我认为,要想应用 DDD,首要任务就是要吃透 DDD 的核心设计思想,搞清楚 DDD、微服务和中台之间的关系。中台本质是业务模型,微服务是业务模型的系统落地,DDD 是一种设计思想,它可以同时指导中台业务建模和微服务设计,它们之间就是这样的一个铁三角关系。DDD 强调领域模型和微服务设计的一体性,先有领域模型然后才有微服务,而不是脱离领域模型来谈微服务设计。
郑子铭
2021/03/12
1.1K0
DDD实战课--学习笔记
如何基于DDD构建微服务架构
微服务构建本质上是软件构建过程中长期演进积累的一系列理念、架构原则、工具和最佳实践。
程序猿DD
2021/08/09
5700
为什么DDD是设计微服务的最佳实践
在本人的前一篇文章《不要把微服务做成小单体》中,现在很多的微服务开发团队在设计和实现微服务的时候觉得只要把原来的单体拆小,就是微服务了。但是这不一定是正确的微服务,可能只是一个拆小的小单体。这篇文章让我们从这个话题继续,先看看为什么拆出来的是小单体。
rocket
2018/10/15
1.7K0
使用 DDD 指导微服务拆分的逻辑
对于服务拆分的逻辑来说,是先设计高内聚低耦合的领域模型,再实现相应的分布式系统。服务的划分有一些基本的方法和原则,通过这些方法能让微服务划分更有操作性。最终在微服务落地实施时也能按图索骥,无论是对遗留系统改造还是全新系统的架构都能游刃有余。
ThoughtWorks
2020/12/22
6830
使用 DDD 指导微服务拆分的逻辑
DDD领域驱动设计的概念解析
在学习 DDD领域驱动设计 的过程中,这种方法包括特别的抽象概念,晦涩难懂,本文结合作者理解,对其方法论中的一些概念进行解析。
憧憬博客
2021/06/02
1.2K0
DDD领域驱动设计落地实践:微服务拆分之道
在前面的两篇文章中,笔者给大家介绍了DDD核心思想、重要概念以及如何进行DDD进行微服务实践的大致过程,后续的文章中将逐渐深入DDD的实践细节,包括领域模型与代码模型的映射以及具体的微服务设计实例等。当下微服务盛行,微服务架构解决了单点系统的可用性问题、突破单节点服务的性能瓶颈同时提升了整个系统的稳定性。因此各大公司纷纷转向微服务架构,但是在实际的微服务拆分过程中也会遇到不少的问题。而DDD中的领域模型构建以及边界上下文的划分天然的和微服务划分有着异曲同工之妙,因此结合DD领域驱动设计来进行微服务拆分是一种比较好的微服务拆分方案。那么今天就和大家聊聊怎么进行微服务拆分。
慕枫技术笔记
2023/03/20
7580
DDD领域驱动设计落地实践:微服务拆分之道
探秘微信业务优化:DDD从入门到实践
引言 | 本文作者从微信团队维护的带货类项目所遇卡点出发,尝试用领域驱动设计方法(简称DDD),保障在快节奏、多人协作的项目迭代中,维持系统的可维护性、可拓展性、高内聚低耦合和稳定性。作者首先剖解相关概念原理,之后代入亲身参与的微信团队实际项目、围绕DDD方法进行优化实操。 DDD 全称 Domain-Driven Design,中文叫领域驱动设计,是一套应对复杂软件系统分析和设计的面向对象建模方法论。它由Eric Evans于2003年提出,但一开始不愠不火。直到MartinFowler于2014年发表论
腾讯云开发者
2022/12/09
1.1K0
探秘微信业务优化:DDD从入门到实践
学习分享:DDD领域驱动设计指导微服务实践
把问题空间分割为规模更小且易于处理的若干子问题。分割后的问题需要足够小,以便一个人单枪匹马就能够解决他们;其次,必须考虑如何将分割后的各个部分装配为整体。分割得越合理越易于理解,在装配成整体时,所需跟踪的细节也就越少。即更容易设计各部分的协作方式。评判什么是分治得好,即高内聚低耦合。以火车为例,每个车厢都要符合承重要求,行李车厢承重能力要高于其他车厢,车厢间的连接要牢固且易于拆解,有足够的灵活性方便转弯。另外大件行李应该单独存放,避免占用普通车厢的空间,餐车应该在整个列车的中间,方便用餐
公众号_松华说
2019/07/16
1K0
学习分享:DDD领域驱动设计指导微服务实践
大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
前言 至少30年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans将其定义为领域驱动设计(Domain-Driven Design,简称DDD)。在互联网开发“小步快跑,迭代试错”的大环境下,DDD似乎是一种比较“古老而缓慢”的思想。 然而,由于互联网公司也逐渐深入实体经济,业务日益复杂,我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。本文就先来讲一下这些问题,然后再尝试在实践中用DDD的思想来解决这些问题。 问题 过度耦合 业务初期,我们的功能大都
美团技术团队
2018/03/13
2.5K0
大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
微服务与领域驱动设计,架构实践总结
如果软件系统存在持续的迭代周期,那么其中业务、技术、架构的复杂性都会直线拉升,其相应的开发难度也会提高,可以用一句话总结其根本原因:唯一不变的就是变化;
知了一笑
2022/06/14
4830
微服务与领域驱动设计,架构实践总结
谈一谈 DDD
最近 10 年的互联网发展,从电子商务到移动互联,再到“互联网+”与传统行业的互联网转型,是一个非常痛苦的转型过程。在这个过程中,一方面会给我们带来诸多的挑战,另一方面又会给我们带来无尽的机会,它会带来更多的新兴市场、新兴产业与全新业务,给我们带来全新的发展机遇。然而,在面对全新业务、全新增长点的时候,我们能不能把握住这样的机遇呢?
冬夜先生
2021/12/06
5070
「查缺补漏」,DDD 核心概念梳理
DDD 是什么,DDD 的英文全称是 Domain-Driven Design,翻译过来就是领域驱动设计。
悟空聊架构
2022/05/13
8620
「查缺补漏」,DDD 核心概念梳理
推荐阅读
相关推荐
深度解析DDD中台和微服务设计
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档