点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

记得之前在规划和设计微服务架构的时候,给了我一个至今依然记忆深刻的提示:『你的设计蓝图里为什么没有看到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来引用聚合根,不能引用聚合根内部的实体

  • 聚合根之间不能共享一个数据库事务,它们之间的数据一致性需要通过最终的一致性来保障



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


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

  • 微服务架构下该如何技术选型呢?

  • 我们设计的是微服务还是小单体应用

  • MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧

  • 解读云原生技术

喜欢就点个"在看"呗,留言、转发朋友圈

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

  1. 中台架构与实现:基于ddd和微服务 下载_为什么在做微服务设计的时候需要DDD?...

    记得之前在规划和设计微服务架构的时候,张队长给了我一个至今依然记忆深刻的提示:『你的设计蓝图里为什么没有看到DDD的影子呢?』 随着对充血模型的领域认知的加深,我越加感觉到DDD的重要性.但是DDD内 ...

  2. 深度解析DDD中台和微服务设计

    导读:本文来源于 2020 年第四届 DDD 中国峰会主题演讲:<当中台遇上 DDD,如何设计微服务>.DDD 非常强调统一语言,而 DDD.中台与微服务产生于不同的时代,三者分别属于不同 ...

  3. 那些没说出口的研发之痛,做与不做微服务的几大理由

    元旦赠书活动还在继续中,欢迎点击下方链接参与: 赠书一:<函数响应式领域建模> 赠书二:<Java函数式编程> 赠书三:<高可用架构> 如果在诸多热门云计算技术中, ...

  4. 规模化微服务——《微服务设计》读书笔记

    改变思维的角度:故障无处不在 当微服务规模化后,故障是无可避免的,以往我们总是想尽力避免故障的发生,而当故障实际发生时,我们往往束手无策.我们花了很多时间在流程设计和应用设计的层面上来阻止故障的发生, ...

  5. 安全——《微服务设计》读书笔记

    身份认证和授权       1.单点登录(SSO) 当主体试图访问一个资源,他会被定向到一个身份提供者那里进行身份验证,身份提供者验明正向后会发消息给服务提供者,让服务提供者来决定是否允许它访问资源. ...

  6. 监控——《微服务设计》读书笔记

    在单块应用的世界里,当我们遇到问题时,我们至少清楚从哪里开始调查.网站访问速度?网站访问异常?CPU占用过高?这些都是单块应用程序的问题,单一的故障点会极大地简化对问题的排查. 而现在我们面对了多个微 ...

  7. 测试——《微服务设计》读书笔记

    一.测试象限(Brain Marick) 二.测试金字塔(Mike Cohn)       1.单元测试 通常只测试一个函数或方法调用,通过TDD或者基于属性而写的测试就属于这一类,在UnitTest ...

  8. 部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记

    一.CI(Continuous Integration)简介  CI规则1:尽量频繁地把代码签入到分支中以进行集成 CI规则2:不光要对语法进行验,也要提供一系列的自动化来验证 CI规则3:CI失败后 ...

  9. 拆分:分解单块系统——《微服务设计》读书笔记

    通常,我们可能已有有一个巨大的单块系统,如何实现微服务,我们需要把它分解. 从哪里开始拆分:接缝 接缝:从接缝处可以抽取相对独立的一部分代码,对这部分代码的修改不会影响系统的其他部分.这些接缝就可以作 ...

最新文章

  1. python接口自动化5-Json数据处理
  2. opencv4.2.0 视频去抖动算法代码
  3. python手机代码识别数字_python实现kNN算法识别手写体数字的示例代码
  4. 简单了解RestTemplate源码
  5. java的调试工具_[Java教程]chrome调试工具
  6. Android插件化开发基础之静态代理模式
  7. iOS开发总结(A0)- Localization
  8. 洛谷 P1508 Likecloud-吃、吃、吃
  9. 上传单.多个文件的函数封装
  10. 能套用的tab栏切换
  11. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法Windows版(手贱强制重启电脑的后果)...
  12. weka的java环境配置_weka环境配置
  13. 哪有没时间这回事-读后感
  14. 苹果mac装双系统对电脑有影响吗?Mac电脑装双系统的利与弊
  15. 西数trex自动版u盘版_当移动硬盘遇上它,改变生活:西数My Passport随行版
  16. 经典的Times 33 哈希算法
  17. svn 423 Locked
  18. Linux系统MySQL自动备份
  19. 大数据千亿级离线数仓项目第一天 环境部署和etl
  20. 个人博客 HTML个人介绍网页 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计

热门文章

  1. 2020年你不应该错过的CSS新特性
  2. python代码手机壁纸_爬虫 抓取王者荣耀所有英雄皮肤高清壁纸+超强注
  3. MapReduce 运行机制
  4. discuz如何关闭个人空间
  5. 页面title加icon
  6. Android初学------系统设置之设置输入法
  7. java高级程序员(Java高级程序员招聘)
  8. cadence导入板框、导出板框、修改板框、绘制Route Keepin方法总结
  9. STM32H743Nucleo ADC使用DMA配置无法读取数据的问题及解决
  10. PPT之ppt设计选项卡