对于拥有真实世界经验的人来说,将一块巨石打破成单独的模块和服务。
我问这个问题已经阅读了Martin Fowler撰写的MonolithFirst博客文章。当采用整体材料并将其分解为微服务时,尺寸为"尺寸"等式的元素是我最常思考的元素。具体来说,如何打破整体应用程序(我们正在谈论2001:A Space Oddessy;就像在那里那么古老而那么大)进入微服务而不会过于精细化或保持过于单一化。最终目标是创建单独的模块,可以独立升级和独立扩展。
基于将整体块体分解为微服务的个人经验,有哪些推荐的最佳实践?
答案 0 :(得分:1)
经验法则是基于有界上下文打破整体。定义有界上下文的最常用方法是使用BU(业务单位)。例如,实际支付的模块大多是单独的BU。
要考虑的第二件事是开销微服务带来的。在完全破坏服务之前,您应该分析硬件,监控,infra。我所看到的是人们从巨石中取出较小的微服务,而不是去写和写10个新服务并贬低巨石。
我的建议是采用增量方法。从第一块BU中取出正在使用的BU。这也将为整个团队提供一个goos学习曲线。
答案 1 :(得分:1)
您应该明确区分您所在域的子域区域(有界上下文)。
通常(如果您的架构一切正常),您的整体应用程序中已经有一些独立的组件负责每个子域。这些组件在一个过程中相互作用 (在整体应用程序中)你应该考虑如何将它们放入单独的进程中。当然,当将整体的一个部分移动到微服务时,你需要产生大量的重构。
永远记住每个微服务都负责某个子域。
我强烈建议您学习域驱动设计。
还要了解CQRS pattern
一开始你还应该决定你的micservices如何相互作用。 有几种选择:
您可以组合这些选项,例如查询请求可以通过Dispatcher Service处理,命令和事件通过消息总线处理。
根据我的经验,最大的问题是离开单个数据库, 通常使用哪些整体应用程序。
此外还有一些好的做法:
某些旅游行业应用的子域(有界上下文)示例。 每个有界的上下文都可以由微服务提供服务。
答案 2 :(得分:1)
我们也开始了一段时间的旅程,我开始写一个完全相同的博客系列:https://dzone.com/articles/how-i-started-my-journey-in-micro-services-and-how
基本上我理解的是打破我的差异问题。微服务,我需要一个领域驱动设计提供的设计框架(Vaugh Vernon的Domain Driven Design Distilled Book)。
然后实施设计(使用CQRS和事件采购......)我需要一个提供上述所有支持的框架。
我发现Lagom对此很好。(最终,Spring Microservices是其他一些选择)。
示例微服务使用Microsoft的域驱动设计进行域分析:https://docs.microsoft.com/en-us/azure/architecture/microservices/domain-analysis
另外一项分析是:http://cqrs.nu/tutorial/cs/01-design
阅读领域驱动设计后,我认为lagom及以上链接将帮助您构建端到端应用程序。如果还有任何疑问,请加注:)