迁移到微服务时的最佳实践

时间:2016-05-13 15:05:28

标签: refactoring microservices

对于拥有真实世界经验的人来说,将一块巨石打破成单独的模块和服务。

我问这个问题已经阅读了Martin Fowler撰写的MonolithFirst博客文章。当采用整体材料并将其分解为微服务时,尺寸为"尺寸"等式的元素是我最常思考的元素。具体来说,如何打破整体应用程序(我们正在谈论2001:A Space Oddessy;就像在那里那么古老而那么大)进入微服务而不会过于精细化或保持过于单一化。最终目标是创建单独的模块,可以独立升级和独立扩展。

基于将整体块体分解为微服务的个人经验,有哪些推荐的最佳实践?

3 个答案:

答案 0 :(得分:1)

经验法则是基于有界上下文打破整体。定义有界上下文的最常用方法是使用BU(业务单位)。例如,实际支付的模块大多是单独的BU。

要考虑的第二件事是开销微服务带来的。在完全破坏服务之前,您应该分析硬件,监控,infra。我所看到的是人们从巨石中取出较小的微服务,而不是去写和写10个新服务并贬低巨石。

我的建议是采用增量方法。从第一块BU中取出正在使用的BU。这也将为整个团队提供一个goos学习曲线。

答案 1 :(得分:1)

您应该明确区分您所在域的子域区域(有界上下文)

通常(如果您的架构一切正常),您的整体应用程序中已经有一些独立的组件负责每个子域。这些组件在一个过程中相互作用 (在整体应用程序中)你应该考虑如何将它们放入单独的进程中。当然,当将整体的一个部分移动到微服务时,你需要产生大量的重构。

永远记住每个微服务都负责某个子域。

我强烈建议您学习域驱动设计

还要了解CQRS pattern

一开始你还应该决定你的micservices如何相互作用。 有几种选择:

  • 从一项服务直接拨打另一项服务
  • 通过调度程序服务发送消息 它从被叫(目的地)服务所在的知识中抽象出客户服务。 这种方法类似于像NGINX这样的代理服务器。
  • 通过一些消息传递总线(中间件)进行交互,例如RabbitMQ

您可以组合这些选项,例如查询请求可以通过Dispatcher Service处理,命令和事件通过消息总线处理。

根据我的经验,最大的问题是离开单个数据库, 通常使用哪些整体应用程序。

此外还有一些好的做法:

  • 将每个微服务放在自己的存储库中 - 这与直接使用另一个微服务的代码的能力隔离开来。 您还可以更快地检查和构建CI上的每个微服务。
  • 与任何服务的互动应仅通过其公共合同
  • 进行
  • 有必要确保每个微服务都有自己的数据库

某些旅游行业应用的子域(有界上下文)示例。 每个有界的上下文都可以由微服务提供服务。

Application sub-domains

答案 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及以上链接将帮助您构建端到端应用程序。如果还有任何疑问,请加注:)