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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【DevOps运维】构建面向应用的运维管理新思维
很多问题一直在困扰、在思考,为什么CMDB大部分项目都是失败的?为什么讨论的更多的是运维自动化而不是IT自动化?为什么线上问题永远是运维人的黑锅?带着这些问题我们来一探究竟。
用户1593318
2019/11/19
2.3K0
袋鼠云平台代码规范化编译部署的提效性改进实践
作为全链路数字化技术与服务提供商,袋鼠云提供了从数据湖、大数据基础平台、离线开发、实时开发、数据服务、数据治理、指标管理、客户数据洞察、数据孪生可视化等全产品体系的服务。
袋鼠云数栈
2022/11/07
5330
袋鼠云平台代码规范化编译部署的提效性改进实践
企业如何落地DevOps(下)
常用的版本和配置管理相关的工具,比如Ansible、Git、Apollo、CMDB等,都是被大家所熟知和广泛应用的工具,也是工程实践的一部分。工具和技术的选型根据各自的具体情况选择合适的即可,但其中有几点注意事项:
老_张
2023/08/09
2060
企业如何落地DevOps(下)
持续部署,并不简单!
这几年,持续集成随着敏捷在国内的推广而持续走热,与之相伴的持续部署也一直备受关注。自前两年,持续交付这个延续性概念又闯进了国内IT圈,慢慢开始在社区和会议中展露头角。许多不明真相的群众跟风哭着喊着要“上”,而许多前CI的半吊子玩家换件衣服就接着干,有的甚至衣服都来不及换......国内的这些土财主如果不巧请了某些所谓的战略家,除了建了一堆持续集成环境,以及每天嚷嚷着要这个要那个,混乱的状况在根本上没有得到改善。本文无意费力探讨持续集成和持续交付的概念,而是打算谈谈对于大型软件企业,以持续集成为基础实现持续部署(交付)时,所要面对的问题以及可行的解决方案。地主老财们,夜黑风正猛,山高路又远,注意脚下......
明哥的运维笔记
2019/01/30
5590
统一运维平台建设的一些思路和实践
企业构建一站式运维平台的目的是为了提升运维效率。那么一个成熟的运维系统应该要解决哪些问题呢?笔者认为首先是运维对象要被管理起来,然后是监控这些对象,接着是这些对象的自动化运维,最后是所有的运维操作都要有所规范。概括起来对应的系统就是CMDB、统一监控、自动化平台、ITSM,如下图所示。
用户1107783
2023/10/31
1.3K0
统一运维平台建设的一些思路和实践
运维平台规划体系全介绍
在之前的文章中,谈到过【运维的本质--可视化】,在可视化的篇幅中,着重介绍自动化的可视化和数据的可视化;在后续的篇章中又介绍了【互联网运维的价值体系】,里面分解了几个维度:质量、成本、效率、安全等。以上都是为了清楚的梳理运维的内容边界,基于这个边界,我们再考虑如何进行平台支撑。可以说前两篇文章都是为今天这篇文章作为铺垫,用理念先行,然后在考虑平台落地,最后在细化其中每个内容。我更习惯用如下的方式来整体表达运维的工作方法和思路;
用户1593318
2019/11/18
4.4K0
运维平台体系,你们真的有好好规划吗?
在之前的文章中,谈到过“运维的本质——可视化”,在可视化的篇幅中,着重介绍自动化的可视化和数据的可视化;在后续的篇章中又介绍了“互联网运维的价值体系”,里面分解了几个维度:质量、成本、效率、安全等。以上都是为了清楚地梳理运维的内容边界,基于这个边界,我们再考虑如何进行平台支撑。可以说前两篇文章都是为今天这篇文章作为铺垫,用理念先行,然后再考虑平台落地,最后再细化其中每个内容。我更习惯用如下的方式来整体表达运维的工作方法和思路:
小小科
2018/07/31
2.3K0
运维平台体系,你们真的有好好规划吗?
美国持续网络训练环境(PCTE)内容简报
美国陆军在2019年11月25号发布了最新的持续网络培训环境(PCTE)的项目CYBER TRIDENT(网络培训、就绪、集成、交付和企业技术)网络培训合同要求的最新信息。项目合同额度将近9.570亿美元。PCTE最主要的建设目标是为美国网络司令部网络任务部队提供一个云端的可以从世界任何地方登录以进行培训和演习任务的强大网络培训环境。
时间之外沉浮事
2020/01/02
2K0
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
南京柯基数据科技有限公司成立于2015年,提供一站式全生命周期知识图谱构建和运维、智能应用服务,致力于“链接海量数据,从大数据中挖掘智慧“。帮助企业运用知识图谱技术打造世界领先的认知工作自动化智能引擎。
Rainbond开源
2021/09/03
6660
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
【平台篇】可视化持续部署系统的设计与实现
持续部署(Continuous Deploy)的收益是全面的,体现在运维规范、自动化和团队合作等方面。
用户1593318
2019/11/19
1.9K0
【平台篇】可视化持续部署系统的设计与实现
01 . Zabbix简介原理及部署
1> 数据采集: 可用性和性能检测,自动发现,支持agent,snmp,JMX,telnet等多种采集方式,支持主动和被动数据传输、支持用户自定义插件,自定义间隔收集数据.
iginkgo18
2020/09/27
7280
01 . Zabbix简介原理及部署
企业级 Kubernetes 监控体系设计与实践
主要都是 kube-state-metrics 收集的, K8s 内置的资源对象 , 只需要添加启动参数即可
SRE运维进阶之路
2025/04/01
1690
企业级 Kubernetes 监控体系设计与实践
携程事件:运维债务的深度剖析与解决方案
********本文是BLUES【公众号ID:bluemidou】向老王约稿,特授权blues独家首发,现转载如此,哈哈********
用户1593318
2019/11/19
1.1K0
企业如何落地DevOps(上)
前面几篇文章,分别从devops的定义和价值、落地路线图以及落地三要素进行了分析。
老_张
2023/03/01
3140
企业如何落地DevOps(上)
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
南京柯基数据科技有限公司成立于2015年,提供一站式全生命周期知识图谱构建和运维、智能应用服务,致力于“链接海量数据,从大数据中挖掘智慧“。帮助企业运用知识图谱技术打造世界领先的认知工作自动化智能引擎。
Rainbond开源
2021/09/10
5020
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
DevOps 三步工作法之持续反馈的技术与案例
导言 很高兴参与DevOps时代社区的拆书联盟第一季活动,有幸能与几位DevOps大牛一起解读《DevOps Handbook》一书,这本书作者牛,内容也很牛,就连著名的培训机构把这本书作为DevOp
DevOps时代
2018/02/02
1.6K0
DevOps 三步工作法之持续反馈的技术与案例
使用Rainbond实现离线环境软件交付
在传统行业,如政府、能源、军工、公安、工业、交通等行业,为了防止数据泄露和运行安全考虑,一般情况下网络会采取内外网隔离的策略,以防范不必要的风险,毕竟在安全防护方面,网络物理隔离是网络安全防御最有效的手段,而网络隔离在软件交付过程中,对于外部软件开发厂商来说将会带来一系列的交付难题,也增加大量成本投入。例如:
Rainbond开源
2021/11/18
9780
使用Rainbond实现离线环境软件交付
系统架构 | 基于微服务架构,改造企业核心系统之实践
背景与挑战 随着公司国际化战略的推行以及本土业务的高速发展,后台支撑系统已经不堪重负。 在吞吐量、稳定性以及可扩展性上都无法满足日益增长的业务需求。对于每10万元额度的合同,从销售团队准备材料、与客户签单、递交给合同部门,再到合同生效大概需要3.5人天。随着业务量的快速增长,签订合同的成本急剧增加。 合同管理系统是后台支撑系统中重要的一部分。当前的合同系统是5年前使用.NET,基于SAGE CRM(http://www.sagecrm.com/)二次开发的产品。一方面,系统架构过于陈旧,性能、可靠性无法满足
张逸
2018/03/07
1.8K0
系统架构 | 基于微服务架构,改造企业核心系统之实践
深度解析:持续交付将如何拯救IT运维?
作者简介 刘劲辉(微信号:akito_hui),前阿里移动事业群高级运维工程师,现优维科技运维与平台研发专家,专注于DevOps、应用运维和平台架构设计,参与实施监控平台设计、运维规范设计、虚拟化应用、效率提升等相关工作,在若干大中型项目的建设和运维中,积累了丰富的系统运维、架构设计、项目实施经验。 前言 在深入探讨持续交付之前,我们先来看一个典型的场景: A 公司最近很苦恼。 A 是一个传统行业的公司,物流运输为主营业务,IT部门作为支撑部门辅助业务发展。但是随着业务的快速发展,IT 部门开始感觉到有点力
数据和云
2018/03/06
2.1K0
深度解析:持续交付将如何拯救IT运维?
运维的本质---可视化
没有比“可视化”更好的一个词能概括运维的本质,而“可视化”又应该分成两部分:可视化的服务交付和可视化的服务度量!
用户1593318
2019/11/18
1.4K0
推荐阅读
相关推荐
【DevOps运维】构建面向应用的运维管理新思维
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档