DDD 实战课
欧创新
人保资深架构师
55517 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 26 讲
开篇词 (1讲)
DDD 实战课
15
15
1.0x
00:00/00:00
登录|注册

08 | 微服务架构模型:几种常见模型的对比和分析

中台和微服务设计
三种架构模型的对比和分析
六边形架构
整洁架构
DDD分层架构
微服务架构模型

该思维导图由 AI 生成,仅供参考

你好,我是欧创新。
在上一讲中我重点介绍了 DDD 分层架构,同时我也提到了微服务架构模型其实还有好多种,不知道你注意到了没?这些架构模型在我们的实际应用中都具有很高的借鉴价值。
那么今天我们就把 DDD 分层架构(详情介绍如有遗忘可回看 [第 07 讲] )、整洁架构、六边形架构这三种架构模型放到一起,对比分析,看看如何利用好它们,帮助我们设计出高内聚低耦合的中台以及微服务架构。

整洁架构

整洁架构又名“洋葱架构”。为什么叫它洋葱架构?看看下面这张图你就明白了。整洁架构的层就像洋葱片一样,它体现了分层的设计思想。
在整洁架构里,同心圆代表应用软件的不同部分,从里到外依次是领域模型、领域服务、应用服务和最外围的容易变化的内容,比如用户界面和基础设施。
整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。
在洋葱架构中,各层的职能是这样划分的:
领域模型实现领域内核心业务逻辑,它封装了企业级的业务规则。领域模型的主体是实体,一个实体可以是一个带方法的对象,也可以是一个数据结构和方法集合。
领域服务实现涉及多个实体的复杂业务逻辑。
应用服务实现与用户操作相关的服务组合与编排,它包含了应用特有的业务流程规则,封装和实现了系统所有用例。
最外层主要提供适配的能力,适配能力分为主动适配和被动适配。主动适配主要实现外部用户、网页、批处理和自动化测试等对内层业务逻辑访问适配。被动适配主要是实现核心业务逻辑对基础资源访问的适配,比如数据库、缓存、文件系统和消息中间件等。
红圈内的领域模型、领域服务和应用服务一起组成软件核心业务能力。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了微服务架构中的整洁架构、六边形架构和DDD分层架构,并对它们进行了对比和分析。整洁架构以洋葱模型为基础,强调依赖原则,将应用软件分为领域模型、领域服务、应用服务和外围内容。六边形架构通过端口与外部进行交互,实现了核心业务逻辑与外部资源的隔离。文章指出,这三种架构模型的设计思想体现了微服务架构的高内聚低耦合原则,以领域模型为中心。作者强调了领域模型和微服务的合理分层设计对中台和微服务设计的重要性,建议在中台设计中聚焦领域模型。此外,文章还探讨了微服务之间的层次依赖关系和服务集成方式,以及应用和资源的解耦与适配。总的来说,本文通过对不同架构模型的分析,为读者提供了对微服务架构设计的深入理解和实践指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《DDD 实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(93)

  • 最新
  • 精选
  • ANYI
    微服务之间通过服务内部的应用层来连接多个微服务,微服务之间的相互调用;有两个疑问:1,微服务之间互相调用应该是什么样子?会不会就出现了网状微服务的调用关系结构了 2,是把这个夸多个微服务的应用层独立起来成为一个微服务(类似BFF微服务,没有领域)减少微服务之间调用关系?微服务之间就应该减少依赖调用?

    作者回复: 微服务之间要分两种情况,一种是项目级的少量微服务之间的调用。这样的调用可以放在微服务内的应用层,没必要再单独拿出一个微服务来进行服务组合和编排。 另外一种是复杂的企业级微服务调用和组合。拿出一个独立的BFF微服务的主要目的,一个是避免在一个微服务内组合太多的微服务的应用服务。二是,通过BFF微服务编排组合,可以减少由于前台的需求变化,传导到后端微服务中,可以降低后端微服务的发版频率,保持后端微服务的稳定。

    2019-11-06
    5
    40
  • IT_matters
    您好,关于分层架构和六边形架构区别,在您给别人的评论中看到区别这样一段话。 ------------------------------ 主要区别还是在外围的适配上,端口适配器会给每个不同的场景,设计一个端口提供调用服务,这种是主动适配。还有一种是资源方面服务,是被动适配的方式。所有的外围对象都是平等的,可以是自动化的测试工具,也可以是APP。 DDD是通过接口层来对外提供服务接口,基础资源通过仓储依赖倒置使用资源,并实现解耦。 ------------------------------ 我感觉这二者还是一样的啊,如果分层架构在接口层,实现各种适配器,比如job,soa,rest。就可以说它是六边形架构了吗?有具体代码的例子吗,一望便知。从评论区来看,很多读者都对二者的区别比较疑惑。

    作者回复: 其实这三种架构是一种演化的关系。2003年DDD诞生,它是一种上下层的关系。六边形架构是在2005年提出,将这种上下层的关系演变为内外关系,内部代表了应用的业务逻辑,外部代表应用的驱动逻辑。但六边形架构的内层的业务逻辑还没有明显的领域模型的概念。2008年洋葱架构出现,六边形架构实际上是洋葱架构的一个超集。它与六边形架构有着相同的思路,都是通过编写适配器代码将应用逻辑从对基础设施的依赖中解放出来,避免基础设施代码渗透到应用逻辑中。洋葱架构在业务逻辑中加入了一些在领域驱动设计的分层的概念,比如用户接口层、应用层、领域层和基础层,另外它还明确了外层依赖内层,内层对外层无感知的这种依赖关系。虽然这三者之间在表达形式上存在差异,但它们的核心职责都是要做到核心业务逻辑和技术实现细节的分离和解耦。

    2020-03-25
    2
    21
  • steven
    应用层与领域层的区别,一般情况下还是很容易的。但是有些复杂的,也是经常会遇到的场景:比如某个A领域和B领域在C应用层作拼装时,会有业务判断的情况(比如需要综合判断A领域与B领域的对象,才能继续作后续的业务操作),此种情况下,如何设计才能避免这类问题呢? 尽量避免跨领域的业务聚合是一种方法,但是很多情况下很难避免这类现象。

    作者回复: 这种情况是经常遇到的,所以在开发的时候,在应用服务对聚合与聚合之间的服务编排时不要采用对象依赖,采用ID的方式。因为如果未来聚合被拆分到不同的微服务的时候,原来在一个微服务内的对象依赖就不存在了,你需要调的代码量就会比较多。

    2020-03-22
    6
    13
  • 瓜瓜
    看完后,就是没区别。

    作者回复: 没有差异就不会有这么多叫法😄。它们几个其实是一点一点继承和发展过来的,在大的分层上基本上没什么太大的差异,思路基本是一致的,都是以领域模型为中心,加上用于编排的应用层逻辑。但是在分层的内部有一些小的差异。包括外部的适配方式也有差异。

    2019-10-30
    12
  • Geek_d94e60
    如果有了BFF这一层做统一编排,微服务内部还需要编排吗?如果碰到如下两种方案 A调用B, B再调用C A调用B , A再调用C 刚开始识别不出复用性,两个方案感觉都可行,如何抉择,有什么原则指导吗?

    作者回复: BFF做微服务之间的编排。微服务内的应用服务主要做领域服务的编排和聚合之间的协调。BFF是微服务之间的,应用服务是微服务内的。

    2019-11-13
    10
  • sundy
    始终不理解soa与中台有啥区别,感觉在技术上没什么创新

    作者回复: 中台体现的主要还是企业级的复用能力,它的价值不在技术上,可以说中台更偏业务。SOA或者微服务只是一种实现方式的不同。中台强调企业级内的整体解决方案。

    2020-03-14
    8
  • Jxin
    回答问题: 1.为了支持外部应用,内部核心业务必须增加新逻辑。这种情况主要是要提高对价值的意识和风险的敏感。尽量不去加核心逻辑的代码,如果加了,必须是有足够价值的特性,且风险点可控或无。 2.为了支持外部应用,内部核心业务存在现有功能逻辑,但需调整兼容。这种情况就对该核心逻辑做进一步抽象,将通用部分复用,常变部分做抽象,实现更细力度的配置策略的定制能力。(当然也是要有足够价值)。 提问: 老的大项目并没有合理的架构分层。套到整洁架构上来看。 1.领域服务层会干领域模型的活。(贫血领域模型) 2.领域服务层会干应用层的活。(领域层大量rpc调用外部服务,并依托外部服务返回的dto做大量业务) 3.基础层会干领域服务的事。(dao层写业务,发mq,存solr,redis) 对于以上情况,做既有代码改善的小步重构,老师可有好套路或则思路?毕竟这种项目要大改规范,成本(时间)和风险(线上事故)都是接受不了的。(我重构了一遍,但是是业务架构上的。领域服务和基础层的职责越界并没有全量调整,仅是跟着需求,若涉及到就修修补补)

    作者回复: 这里你可以考虑单体架构的演进方式。可以先对系统做整体的领域建模分析,分解成多个不同的子域,建立领域模型。再根据优先级将部分领域模型对应的功能和数据从原来的单体应用中拆分出来,拆分为微服务。对原来的单体系统的前端提供API服务,原有系统的前端界面保持不变,整个架构演变用户无感知。当所有领域模型的微服务建设完成后,就可以抛弃原来的单体应用了。

    2019-10-30
    4
    7
  • kevin
    有个点一直不太理解,还望老师解惑。 文章提到抽象出一个仓储的接口,与基础层的数据库进行解耦,方便后续有替换数据库。这种情况在实际场景中很少出现,选用合适的存储中间件是一件重要的事情,一般在项目初期就确定了,中途替换的概率很小,为了这样的小概率事件,是不是有些过度设计?

    作者回复: 现在技术发展这么快,一切皆有可能的。这样做其实也是将领域模型和资源逻辑解耦的过程。

    2020-01-02
    4
    6
  • TH
    想起了一句话:软件开发中遇到的所有问题,都可以通过增加一层抽象来解决。 对于依赖倒置的实现不是很清楚,按我的理解就是面向接口编程,由调用方将基础设施层的具体实现传入到被调用的服务,老师可以详细解释一下吗?

    作者回复: 是这样的。直白一点就是业务的归业务,基础的归基础,两者通过一层来适配,具体就是通过接口的方式。

    2019-10-30
    5
    6
  • y3
    请问老师,在设计微服务接口编排的时候,有哪些需要注意的地方?最好可以在github上给一个demo。

    作者回复: 你是说应用服务的编排吗? 你把这种编排理解成在同一个微服务内,一个方法对多个不同方法的调用就可以了,如果涉及到外部微服务的接口调用,你需要做DO与DTO的数据转换。

    2019-11-19
    2
    4
收起评论
显示
设置
留言
93
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部