手把手教你落地 DDD
钟敬
Thoughtworks 首席咨询师、数字化转型与运营团队 DDD 负责人
19697 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
AIGC特别策划 (2讲)
结束语&结课测试 (2讲)
手把手教你落地 DDD
15
15
1.0x
00:00/00:00
登录|注册

30|限界上下文(下):限界上下文之间如何集成?

你好,我是钟敬。
上节课我们进一步深入学习了上下文映射,并且开始根据限界上下文进行架构设计,主要谈的是单体架构。
在某些场合里,采用单体架构比较适合。不过,我们现在开发的是一个基于云原生的 SaaS 应用。在云原生的情况下,一般不会采用单体架构,微服务才是最佳实践。那么微服务应该怎么设计呢?
这节课,我们会继续学习微服务的设计。之后,会讨论限界上下文之间的集成。所谓限界上下文的集成,就是通过在代码中实现限界上下文的映射,完成跨限界上下文的业务功能。

微服务的设计

我们先了解一下微服务的设计方法,再进一步讨论为什么要根据限界上下文设计微服务。

微服务的设计方法

设计微服务,我们可以先假定每个限界上下文对应一个微服务。然后,再综合考虑多方面的因素,决定是否需要进一步细分。下面是几种常见的情况。
第一,不同的可伸缩性要求。如果一个上下文里有些部分,需要随着使用情况,动态部署到更多的容器,比如说“双十一”促销的时候。而另外的部分性能要求比较稳定,不需要动态伸缩。那么,如果不同部分都混在一个微服务中,那么当扩展到更多容器的时候,成本就会比较高了。这时候,我们可以考虑根据可伸缩性的不同,划分成两个微服务。
第二,不同的安全性要求。比如说,有些功能要接入互联网,有些部分在内网用,需要部署在防火墙的不同位置。这时候,也需要划分成不同的微服务。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在云原生环境下设计微服务及限界上下文集成的文章中,首先介绍了微服务的设计方法,强调了根据可伸缩性、安全性和技术异构性来划分微服务。然后从功能性和非功能性需求两方面探讨了为什么要根据限界上下文设计微服务,强调了微服务划分应有利于保证系统概念的一致性、灵活扩展功能,并且解决团队协作和概念一致性问题。接着,文章讨论了限界上下文间的集成策略,包括数据同步策略和API调用策略,以及同步调用和异步调用的实现方式。最后,强调了不同的实现策略可以根据性能、时效性、技术复杂度、数据可靠性等多个维度进行权衡。此外,还介绍了防腐层的作用以及战略设计和战术设计的概念。总的来说,本文深入浅出地介绍了在云原生环境下微服务的设计和限界上下文之间的集成,为读者提供了宝贵的技术指导。

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

全部留言(8)

  • 最新
  • 精选
  • 李威
    问题一:假设两个限界上下文是由两个团队负责的微服务,当两个限界上下文只有少量相同的逻辑,最好就各自维护自己的,用少量的重复来换取两个团队之间的沟通成本,当两个限界上下文出现了很多的重复逻辑那就可以考虑把相同的逻辑抽取成一个单独的微服务,并提供给之前的那两个微服务去调用。 问题二:仓库作为防腐层屏蔽了实体的获取细节,其实Controller也是防腐层,它屏蔽了不同的请求协议。

    作者回复: 非常好

    2023-02-22归属地:湖南
    14
  • 努力的C-C
    对于从单体应用--->微服务应用的设计图有一点疑问, 在单体应用中EffrotItemService会直接调用EmpRepository来获取Emp. 但是在微服务应用的设计里EffrotItemService只依赖了EMP .没有看到如何通过EmpRepository来获取Emp . 请问在微服务应用的设计中EffrotItemService是如何通过EmpRepository获取EMP的

    作者回复: 画漏了一条线,在微服务中,EffortItemService也要依赖EmpRepository.谢谢指出问题!

    2024-02-19归属地:湖北
  • Geek_2ba566
    防腐层我一直没搞明白,一般放在哪个调用模块中还是被调用模块中呢?有没有示例代码,可供参考学习学习?

    作者回复: 可以写在被动适配器。

    2023-09-09归属地:中国香港
  • 荣耀39
    几个限界上下文在同一个微服务中,互相间的调用都通过反腐层调用的方式,会多出不少的转化的代码,特别是dto转domain对象,这个代价相对于收益是否划算?我们是否也可以两个领域对象Emp间进行转化呢?要拆分微服务的时候再去做防腐层调用及dto转domain对象

    作者回复: 也可以,找一个合适的平衡点

    2023-03-14归属地:广东
  • aoe
    来自新必应对思考题的回答: 问题一 这是一个很好的问题。限界上下文是用来细分领域,从而定义通用语言所在的边界1。限界上下文之间可能存在依赖或重叠,这时候就需要考虑是否抽取成可重用的模块。 根据我的搜索结果,有以下几种可能的做法: 如果两个限界上下文之间有类似或相同的部分,但是它们的含义和行为不一样,那么就不应该抽取成可重用的模块,而是应该保持各自独立。 如果两个限界上下文之间有类似或相同的部分,并且它们的含义和行为一致,那么可以抽取成可重用的模块,并且在物理层面上进行无缝集成3。这种情况下,需要注意避免开发人员绕过防腐层直接调用另一个限界上下文的代码。 如果两个限界上下文之间有类似或相同的部分,并且它们的含义和行为基本一致,但是有些细节不同,那么可以抽取成可重用的模块,并且在逻辑层面上进行隔离3。这种情况下,需要使用防腐层进行模型或协议的转换。 问题二 防腐层是一种用于隔离两个系统的模式,可以在不知道对方领域知识的情况下进行集成¹。防腐层主要进行的是两个系统之间的模型或协议的转换。 除了在仓库里以外,防腐层还可以作为应用程序内的组件或作为独立服务实现。但是,防腐层也有一些问题和注意事项,比如可能增加调用延迟、管理和维护成本、缩放方式等。 我的读后感 1. 好强大的设计:不论采用哪种策略,概念层面的映射关系都是一样的,只是实现层面不同 2. 又学到了一个根据不同实现技术分层的原则:访问数据库用 persistence、访问别的 service 用 gateway 或 proxy

    作者回复: 人工智能还是很强大,主要意思都没问题。不过有些部分我也没看懂说什么。

    2023-02-28归属地:浙江
    2
  • 铿然
    是否重用跟技术难度和组织也有很大关系,难度不大谁都能写直接就写了;组织中如果专门有人负责公共组件并且有制度约束那重用概率就大。 限界上下文划分微服务要看粒度,很多时候作为一个小模块,子功能就可以,不需要拆分微服务,不能为了拆而拆,不同上下文的概念映射,数据同步带来了复杂性,要权衡是否必要。
    2023-06-20归属地:江苏
  • buoge
    作为AI语言模型,我认为抽取成可重用的模块是有必要的。这样可以避免重复的代码,提高代码的可维护性和可重用性。而且如果有多个限界上下文中需要使用相同的部分,抽取成模块可以方便地在各个上下文中进行使用和维护,同时还能降低代码的耦合性,提高系统的灵活性和可扩展性。
    2023-03-22归属地:北京
  • 6点无痛早起学习的和尚
    思考题: 1. 在实际开发过程中,遇到上下文的实体重复,我们会把 xxRequest、xxResponse 放在一个 common 包里,多个服务用一个 common jar 包 2. 有时候能否也在应用层去实现,应用层一边调用领域层,然后再调用其他上下文,转换逻辑放在调用层里的上下文映射实体里
    2023-02-27归属地:北京
    2
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部