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

19 | 总结(一):微服务设计和拆分要坚持哪些原则?

复杂领域建模
简单领域建模
基于技术异构等因素
基于安全边界
基于组织架构和团队规模
基于应用性能
基于业务需求变化频率
基于领域模型
自己能hold住的微服务
职能清晰的分层
边界清晰的微服务
领域驱动设计
DDD只适用于微服务
重战术设计而轻战略设计
全部采用DDD战术设计方法
所有的领域都用DDD
单体遗留系统
新建系统
另起炉灶策略
修缮者策略
绞杀者策略
微服务拆分需要考虑的因素
微服务设计原则
DDD使用的误区
不同场景下的领域建模策略
微服务的演进策略
思考题
面对微服务设计和拆分的差异
总结(一):微服务设计和拆分要坚持哪些原则?

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

你好,我是欧创新。
我们前面已经讲了很多 DDD 的设计方法和实践案例。虽然 DDD 的设计思想和方法很好,但由于企业发展历程以及企业技术和文化的不同,DDD 和微服务的实施策略也会有差异。那么面对这种差异,我们应该如何落地 DDD 和微服务呢?今天我们就来聊聊微服务的设计原则和演进策略。

微服务的演进策略

在从单体向微服务演进时,演进策略大体分为两种:绞杀者策略和修缮者策略。

1. 绞杀者策略

绞杀者策略是一种逐步剥离业务能力,用微服务逐步替代原有单体系统的策略。它对单体系统进行领域建模,根据领域边界,在单体系统之外,将新功能和部分业务能力独立出来,建设独立的微服务。新微服务与单体系统保持松耦合关系。
随着时间的推移,大部分单体系统的功能将被独立为微服务,这样就慢慢绞杀掉了原来的单体系统。绞杀者策略类似建筑拆迁,完成部分新建筑物后,然后拆除部分旧建筑物。

2. 修缮者策略

修缮者策略是一种维持原有系统整体能力不变,逐步优化系统整体能力的策略。它是在现有系统的基础上,剥离影响整体业务的部分功能,独立为微服务,比如高性能要求的功能,代码质量不高或者版本发布频率不一致的功能等。
通过这些功能的剥离,我们就可以兼顾整体和局部,解决系统整体不协调的问题。修缮者策略类似古建筑修复,将存在问题的部分功能重建或者修复后,重新加入到原有的建筑中,保持建筑原貌和功能不变。一般人从外表感觉不到这个变化,但是建筑物质量却得到了很大的提升。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

微服务设计和拆分需要遵循一些原则,包括领域驱动设计、边界清晰、职能分层和适度拆分。在微服务拆分时需要考虑领域模型、业务需求变化频率、应用性能、组织架构和安全边界等因素。此外,深刻理解DDD的设计思想和内涵,结合企业文化和技术特点,灵活运用战术设计方法,选择最适合的技术和方法解决实际问题。文章内容涵盖了微服务设计的原则、拆分因素、领域建模策略以及DDD的使用误区。

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

全部留言(31)

  • 最新
  • 精选
  • 南山
    老师这篇是看的最慢的一篇,一边看,一边思考现在团队负责的业务以及服务,有很多很多值得警惕和借鉴以及深思的地方! 前面在看微服务实例讲解的时候一度陷入战术模型中出不来,想着现在团队微服务的结构以及实现方式像,也不像ddd。一直也知道战略比战术更重要,直到看到今天的文章,才恍然,从ddd学到的更多是他的分析过程的方法论,设计思想,至于实际落地,要结合各种因素来权衡利弊做更合适现状的架构设计方案和具体实现方式。 注重道而不是术!

    作者回复: 把DDD当成工具和方法,不要让它束缚了思想。

    2019-11-27
    29
  • silentyears
    请问老师,DDD,必须采用充血模型吗?

    作者回复: DDD主要采用面向对象的设计方式,不同于三层架构的贫血模型,实体只有get和set方法,所有的业务逻辑都放在业务逻辑层,耦合度比较高。采用充血模型后,会让领域模型更接近实际场景,也会让四层架构中各个实体行为,领域服务等职责更加清晰,便于进行服务和方法的组合和解耦。

    2020-02-04
    2
    9
  • Peter Yu
    老师,我有个疑惑:比如有个服务AB被拆分为服务A和服务B,在拆分之前有个service调用: Adto fetchAbyId(Long id),拆分后这个方法提供了远程调用,B服务调用这个远程方法时需要一个对象来接收结果,问题:是在B服务里面建一个类似Adto的类用于包装结果,还是引用A服务的一个common包依赖进来(里面有Adto的定义)。个人感觉如果用引入依赖的方式,会暴露较多信息,耦合度也高了;但是重新在B服务里面建一个新类,微服务拆分时工作量会比较高(A和B之间调用比较多的情况)。感觉都挺头疼的…望老师指教

    作者回复: 个人建议采用在B服务中建立一个新类的方法。 采用依赖包的方式会混淆限界上下文边界,A微服务中很多内容可能会不自觉的渗透到B微服务内,而且像你说的那样,两者之间会产生高耦合。

    2021-01-06
    5
    8
  • 悠闲喵
    欧老师你好,我们有个消息发送平台,主要是发短信、邮件、站内信功能;目前想拆分为 任务接收、任务拆分、消息发送、消息跟踪等几个微服务。请问是否存在过度拆分的问题?

    作者回复: 不清楚您这个消息发送平台数据和业务量大不大。我来分析一下,看看是否正确? 从业务边界来考虑,另外,再考虑尽量减少微服务之间的数据传输和交互,我感觉任务接收和任务拆分,属于任务管理的限界上下文,而且数据关联度相对较高,它们可以放在一个微服务内,这样可以减少微服务之间的数据交互。而消息发送以及消息跟踪,属于消息管理限界上下文,它们可以放在一个微服务内。 我们可以做好这四个不同聚合的边界,然后拆分为任务管理和消息管理两个微服务。如无必要,尽量不要过度拆分。

    2020-12-25
    5
  • 小谢同学
    感觉ddd和devops这些系统化概念都应该结合企业自身实际情况进行逐步的落地,一是不能盲目跟风,二是不能贪图一时之快,还是要因地制宜

    作者回复: 是的。

    2020-02-28
    3
  • Jxin
    感谢老师的分享。限于篇幅啊,意犹未尽的感觉。

    作者回复: 很多的感悟,^_^。

    2019-11-27
    3
  • vivi
    刚开课就跟着学习,课程结束了把新项目用DDD实践了下,收获满满。非常感谢作者~

    作者回复: 以后多交流。

    2019-12-05
    2
  • y3
    考虑新老系统之间服务和业务的兼容,必要时可引入防腐层。请问老师,这里的防腐层指的是什么?

    作者回复: 防腐层是为了屏蔽系统之间的相互影响,保证领域模型的纯洁性,在微服务增加一些代码进行业务适配,比如新老系统的协议转换等。

    2019-11-29
    2
  • by
    老师 我有一个疑问 最近项目也在做DDD的重构。看了老师的Demo,有一些不理解的地方。 1.LeaveRepositoryInterface 这样的命名方式是DDD的规范吗,确实很少看到这样的命名方式,是不是这样更好 lleaveService。 2.LeaveDomainService为什么要加一个Domain。

    作者回复: 1、DDD在实际战术落地的时候其实没有具体的规范,你可以根据团队的习惯来定义这些名称,只要大原则不出问题即可。 2、因为在DDD分层架构中有两种类型的服务:应用服务和领域服务,加domain是为了有所区分。

    2021-02-06
    1
  • 北天魔狼
    感谢老师!依赖倒置,代码复用,这俩是最浅显的好处。按照严格模式分层,天然支持微服务,支持多开发语言。🙏🙏🙏

    作者回复: 谢谢你的陪伴。

    2019-11-27
    1
收起评论
大纲
固定大纲
微服务的演进策略
1. 绞杀者策略
2. 修缮者策略
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部