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

Best Practices when Migrating to Microservices

对于任何有将整体分解成单独的模块和服务的现实世界经验的人。

我问这个问题已经阅读了 Martin Fowler 的 MonolithFirst 博客文章。当采用单体并将其分解为微服务时,等式中的 "size" 元素是我考虑最多的元素。具体来说,如何将单体应用程序(我们说的是 2001 年:A Space Oddessy;因为它又老又大)分解为微服务,而不会变得过于细粒度或保持过于单一。最终目标是创建可以独立升级和独立扩展的独立模块。

根据将整体拆分为微服务的个人经验,推荐了哪些最佳实践?

经验法则是打破基于有界上下文 的单体应用。定义限界上下文最常用的方法是使用 BU(业务单元)。例如实际支付的模块大部分是一个独立的BU。

第二个要考虑的是微服务带来的开销。在完全中断服务之前,您应该分析硬件、监控和基础设施。我所看到的是,人们从整体中取出较小的微服务,而不是去写 10 个新服务并贬低整体。

我的建议是循序渐进。从整体中取出第一个正在处理的 BU。这也将为整个团队提供一个 goos 学习曲线。

您应该清楚地区分sub-domain 区域(限界上下文) 与您的域。

通常(如果您的体系结构一切正常)您的整体应用程序中已经有一些单独的组件负责每个 sub-domain。这些组件在一个进程中相互交互 (在整体应用程序中)并且您应该考虑如何将它们放入单独的进程中。当然,在将单体应用一个一个地迁移到微服务时,你需要进行大量的重构。

永远记住,每个微服务都负责一些 sub-domain。

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

也学CQRS pattern

一开始你还应该决定你的微服务如何相互交互。 有几种选择:

  • 从一项服务直接调用另一项服务
  • 通过某些调度程序服务发送消息 它从被调用(目标)服务所在的位置的知识中抽象出客户端服务。 这种方法类似于 NGINX 等代理服务器的工作方式。
  • 通过某些 消息传递总线(中间件) 进行交互,例如 RabbitMQ

您可以组合这些选项,例如 Query 请求可以通过 Dispatcher Service 处理,Commands 和 Events 通过消息总线处理。

根据我的经验,最大的问题是摆脱单一数据库, 通常使用哪些整体式应用程序。

此外还有一些好的做法:

  • 将每个微服务放在自己的存储库中 - 这与直接在另一个微服务中使用一个微服务的代码的能力隔离开来。 您还可以在 CI.
  • 上更快地签出和构建每个微服务
  • 与任何服务的交互只能通过其 public 合同.
  • 进行
  • 每个微服务都有自己的数据库是很有必要的

某些旅游业应用程序的 sub-domains(限界上下文)示例。 每个限界上下文都可以由微服务提供服务。

一段时间前我们也开始了我们的旅程,我开始为完全相同的事情写一个博客系列:https://dzone.com/articles/how-i-started-my-journey-in-micro-services-and-how

基本上我的理解是解决我的问题。微服务,我需要一个领域驱动设计提供的设计框架(Vaugh Vernon 的领域驱动设计精粹书)。

然后为了实现设计(使用 CQRS 和事件溯源以及...)我需要一个提供上述所有支持的框架。

我发现 Lagom 很适合这个。(最终,Spring 微服务是一些其他选择)。

Microsoft 使用域驱动设计的示例微服务域分析:https://docs.microsoft.com/en-us/azure/architecture/microservices/domain-analysis

再分析一个是:http://cqrs.nu/tutorial/cs/01-design

阅读领域驱动设计后,我认为 lagom 和以上链接将帮助您构建端到端应用程序。如果还有疑问,请提出:)