微服务与单体架构

Microservices vs Monolithic Architecture

微服务和单体架构的优缺点是什么?

何时选择微服务架构或单体架构?

虽然我是微服务领域的新手,但我会尽可能完整地回答您的问题。

当你使用微服务架构时,你会增加关注点的解耦和分离。由于您在随意拆分您的应用程序。

这导致您的代码库将更易于管理(每个应用程序都独立于其他应用程序以保持和 运行ning)。因此,如果您做得对,将来向您的应用程序添加新功能会更容易。而对于单体架构,如果您的应用程序很大(并且您可以假设在某个时间点它会如此),这可能会变得非常困难。

此外,部署应用程序更容易,因为您要分别构建独立的微服务并将它们部署在不同的服务器上。这意味着您可以随时构建和部署服务,而无需重新构建应用程序的其余部分。

由于不同的服务很小并且单独部署,很明显更容易扩展它们,优点是您可以扩展应用程序的特定服务(通过整体式扩展完整的 "thing",即使它只是应用程序中负载过大的特定部分)。

但是,对于不打算变得太大而无法在将来管理的应用程序。最好将其保留在单体架构中。由于微服务架构涉及到一些严重的困难。我说过部署微服务更容易,但这只是与大型单体相比才对。使用微服务会增加将服务分发到不同位置的不同服务器的复杂性,您需要找到一种方法来管理所有这些。如果您的应用程序变大,构建微服务将在长期 运行 中为您提供帮助,但对于较小的应用程序,保持整体性更容易。

@Luxo 就在现场。我只想提供一个细微的变化,并提出它的组织观点。微服务不仅允许应用程序解耦,而且还可以在组织级别上提供帮助。例如,该组织将能够分成多个团队,每个团队都可以在团队可能提供的一组微服务上进行开发。

例如,在像亚马逊这样的大型商店中,您可能拥有个性化团队、电子商务团队、基础设施服务团队等。如果您想进入微服务领域,亚马逊就是一个很好的例子。 Jeff Bezos 要求团队在需要访问共享功能时与另一个团队的服务进行通信。有关简要说明,请参阅 here

此外,来自 Etsy and Netflix 的工程师在 Twitter 上也曾就微服务与单体架构进行过一场小型辩论。辩论的技术性较低,但也可以提供一些见解。

这是一个非常重要的问题,因为一些人被围绕微服务的所有嗡嗡声所吸引,并且需要权衡取舍。那么,微服务的优势和挑战是什么(与整体模型相比)?

好处

  • 可部署性:由于构建+测试+部署周期更短,推出新版本服务的灵活性更高。此外,还可以灵活地使用特定于服务的安全性、复制、持久性和监视配置。
  • 可靠性:微服务故障会单独影响微服务及其消费者,而在单体模型中,服务故障可能会导致整个单体崩溃。
  • 可用性:推出微服务的新版本几乎不需要停机,而在单体中推出服务的新版本通常需要整个单体重启速度较慢.
  • 可扩展性:每个微服务都可以使用池、集群、网格独立扩展。部署特性使微服务非常适合云的弹性。
  • 可修改性:更灵活地使用新框架、库、数据源和其他资源。此外,微服务是松散耦合的模块化组件,只能通过它们的合同访问,因此不太容易变成一团泥泞。
  • 管理:应用程序开发 工作分配给规模较小且工作更独立的团队。
  • 设计自主性:团队可以自由地采用不同的技术、框架和模式来设计和实现每个微服务,并且可以独立地更改和重新部署每个微服务

挑战

  • 可部署性:部署单元多得多,因此需要监督部署的复杂作业、脚本、传输区域和配置文件也更多。 (因此,微服务项目非常需要持续交付和 DevOps。)
  • 性能:服务更可能需要通过网络进行通信,而单体中的服务可能受益于本地调用。 (因此,设计应避免 "chatty" 微服务。)
  • 可修改性:对合约的更改更有可能影响部署在其他地方的消费者,而在单体模型中,消费者更有可能在单体中,并将​​在与服务同步。此外,提高自治性的机制(例如最终一致性和异步调用)增加了微服务的复杂性。
  • 可测试性:集成测试更难设置并且运行因为它们可能跨越不同运行时间环境中的不同微服务。
  • 管理:管理操作的工作量增加,因为有更多运行时间组件、日志文件和点点对点互动监督。
  • 内存使用:几个类和库经常在每个微服务包中被复制,并且整体内存占用增加。
  • 运行时自治:整体业务逻辑在整体中并置。对于微服务,逻辑分布在微服务中。因此,在其他条件相同的情况下,微服务更有可能通过网络与其他微服务交互——这种交互会降低自主性。如果微服务之间的交互涉及更改数据,则对事务边界的需求会进一步损害自治性。好消息是,为了避免 运行 时间自治问题,我们可以采用最终一致性、事件驱动架构、CQRS、缓存(数据复制)以及使微服务与 DDD 限界上下文保持一致等技术。这些技术并不是微服务固有的,但我读过的几乎每一位作者都建议过。

一旦我们理解了 these tradeoffs,我们还需要知道一件事来回答另一个问题:微服务和单体哪个更好? 我们需要知道应用程序的非功能需求(质量属性需求)。例如,一旦了解性能与可伸缩性的重要性,您就可以权衡取舍并做出明智的设计决策。