19 | 总结(一):微服务设计和拆分要坚持哪些原则?
19 | 总结(一):微服务设计和拆分要坚持哪些原则?
讲述:欧创新
时长18:19大小12.56M
微服务的演进策略
1. 绞杀者策略
2. 修缮者策略
不同场景下的领域建模策略
1. 新建系统
2. 单体遗留系统
DDD 使用的误区
1. 所有的领域都用 DDD
2. 全部采用 DDD 战术设计方法
3. 重战术设计而轻战略设计
4. DDD 只适用于微服务
微服务设计原则
微服务拆分需要考虑哪些因素?
总结
思考题
赞 22
提建议
精选留言(29)
- 南山2019-11-27老师这篇是看的最慢的一篇,一边看,一边思考现在团队负责的业务以及服务,有很多很多值得警惕和借鉴以及深思的地方! 前面在看微服务实例讲解的时候一度陷入战术模型中出不来,想着现在团队微服务的结构以及实现方式像,也不像ddd。一直也知道战略比战术更重要,直到看到今天的文章,才恍然,从ddd学到的更多是他的分析过程的方法论,设计思想,至于实际落地,要结合各种因素来权衡利弊做更合适现状的架构设计方案和具体实现方式。 注重道而不是术!展开
作者回复: 把DDD当成工具和方法,不要让它束缚了思想。
28 - silentyears2020-02-04请问老师,DDD,必须采用充血模型吗?
作者回复: DDD主要采用面向对象的设计方式,不同于三层架构的贫血模型,实体只有get和set方法,所有的业务逻辑都放在业务逻辑层,耦合度比较高。采用充血模型后,会让领域模型更接近实际场景,也会让四层架构中各个实体行为,领域服务等职责更加清晰,便于进行服务和方法的组合和解耦。
共 2 条评论9 - Peter Yu2021-01-06老师,我有个疑惑:比如有个服务AB被拆分为服务A和服务B,在拆分之前有个service调用: Adto fetchAbyId(Long id),拆分后这个方法提供了远程调用,B服务调用这个远程方法时需要一个对象来接收结果,问题:是在B服务里面建一个类似Adto的类用于包装结果,还是引用A服务的一个common包依赖进来(里面有Adto的定义)。个人感觉如果用引入依赖的方式,会暴露较多信息,耦合度也高了;但是重新在B服务里面建一个新类,微服务拆分时工作量会比较高(A和B之间调用比较多的情况)。感觉都挺头疼的…望老师指教展开
作者回复: 个人建议采用在B服务中建立一个新类的方法。 采用依赖包的方式会混淆限界上下文边界,A微服务中很多内容可能会不自觉的渗透到B微服务内,而且像你说的那样,两者之间会产生高耦合。
共 5 条评论8 - 悠闲喵2020-12-25欧老师你好,我们有个消息发送平台,主要是发短信、邮件、站内信功能;目前想拆分为 任务接收、任务拆分、消息发送、消息跟踪等几个微服务。请问是否存在过度拆分的问题?
作者回复: 不清楚您这个消息发送平台数据和业务量大不大。我来分析一下,看看是否正确? 从业务边界来考虑,另外,再考虑尽量减少微服务之间的数据传输和交互,我感觉任务接收和任务拆分,属于任务管理的限界上下文,而且数据关联度相对较高,它们可以放在一个微服务内,这样可以减少微服务之间的数据交互。而消息发送以及消息跟踪,属于消息管理限界上下文,它们可以放在一个微服务内。 我们可以做好这四个不同聚合的边界,然后拆分为任务管理和消息管理两个微服务。如无必要,尽量不要过度拆分。
5 - 狮锅艺2020-03-18实践的过程中,要时常来回顾一下这些原则。5
- 小谢同学2020-02-28感觉ddd和devops这些系统化概念都应该结合企业自身实际情况进行逐步的落地,一是不能盲目跟风,二是不能贪图一时之快,还是要因地制宜
作者回复: 是的。
3 - Jxin2019-11-27感谢老师的分享。限于篇幅啊,意犹未尽的感觉。
作者回复: 很多的感悟,^_^。
3 - vivi2019-12-05刚开课就跟着学习,课程结束了把新项目用DDD实践了下,收获满满。非常感谢作者~
作者回复: 以后多交流。
2 - y32019-11-29考虑新老系统之间服务和业务的兼容,必要时可引入防腐层。请问老师,这里的防腐层指的是什么?
作者回复: 防腐层是为了屏蔽系统之间的相互影响,保证领域模型的纯洁性,在微服务增加一些代码进行业务适配,比如新老系统的协议转换等。
2 - by2021-02-06老师 我有一个疑问 最近项目也在做DDD的重构。看了老师的Demo,有一些不理解的地方。 1.LeaveRepositoryInterface 这样的命名方式是DDD的规范吗,确实很少看到这样的命名方式,是不是这样更好 lleaveService。 2.LeaveDomainService为什么要加一个Domain。
作者回复: 1、DDD在实际战术落地的时候其实没有具体的规范,你可以根据团队的习惯来定义这些名称,只要大原则不出问题即可。 2、因为在DDD分层架构中有两种类型的服务:应用服务和领域服务,加domain是为了有所区分。
1 - 北天魔狼2019-11-27感谢老师!依赖倒置,代码复用,这俩是最浅显的好处。按照严格模式分层,天然支持微服务,支持多开发语言。🙏🙏🙏
作者回复: 谢谢你的陪伴。
1 - 兔子2022-12-10 来自北京请问10-12人,是维护一个微服务的团队规模吗
- Steven2022-04-19不知道老师是否还关注这里,有问题不太明白: “拆分后的微服务项目团队规模保持在 10~12 人左右为宜。”,这个是不是有点多啊? 虽然说是“两个披萨”原则,但看国外一般是说不超过10个人,还有说不超过9个的。 microservices.io,说是5-9个人。 国内还有一种说法“三个火枪手”。 其它同学对此怎么看?展开
- 徐李2021-12-22充血模型,是在解除老师的专栏之后才了解到的。目前我们开发用的mvc三层架构,基本都是贫血模型,业务处理都在service层。对于DDD. 充血模型更适合,在实体中,值对象中完成一定的业务处理,就在这个实体里面闭环掉了,就更像是实际的生产情况。这里比以前的面向对象编程更面向对象。
- trier2021-10-28过了很久又回来看这个专栏,这次是带着问题来的,不知道老师还有没有空回来解答。 我们在落地时,会发现在应用层会很多不同领域间实体的转换,而且导致代码看起来很繁琐,不知道这些问题该如何解决。是不是应该在应用层再定义一层防腐层去处理领域间实体的转换? 如果是,目录结构如何比较好?
- paulmin2021-10-04拆分后的微服务项目团队规模保持在 10~12 人左右为宜。 -- 这个是特指后端研发的人员规模吗? 但若是建设企业大中台,按商业能力中心来划分模型和落地微服务,这个人数是偏少了。
- 百威2021-03-29我理解ddd的战略设计应该更加也是更优先被推广出来吧,战术的实现可以多种,但战略上的领域设计应该是明确不变的
- 厚德载物2021-02-21太美了,我有信心了,我在没看视频前就是计划用绞杀模式,修缮无法根治,炉罩压力太大,赞赞赞
- 金龟2020-11-13老师,我们在做语音助手。其中有个服务是做对话,也就是一句query的回答。 然后对于一句话,我们其实会配置多个回复,每个回复上我们会有些判断条件,然后这些判断条件会去读取对象存储上的文件,用来判断条件是否满足。满足就进行回复。我想问下这个服务应该怎么设计会比较好
作者回复: 你们这些回复是不是要在很多问题上要复用?这些判断条件是不是一些规则,也需要复用? 如果是,问题可以是一个聚合,它会引用回复ID以及名称等信息,形成一对多的引用关系。判断规则可以作为配置信息独立为一个聚合,主要提供规则查询服务,根据规则找出回复记录。 由于不太清楚更具体的场景,不知道分析的对不对。
- 风2020-11-10深刻理解 DDD 的设计思想和内涵,把握好边界和分层这个大原则,结合企业文化和技术特点,灵活运用战术设计方法,选择最适合的技术和方法解决实际问题,切勿为了 DDD 而做 DDD!