了解单体架构、微服务和分布式单体架构之间的区别
经验不足的团队常常想创建微服务架构,但最终却构建出分布式单体应用。什么是分布式单体应用?为什么应该避免它?
首先,我们需要了解简单的单体架构和微服务架构之间的区别。
巨石
整体式建筑光听名字就气势恢宏,但实际上它是最常见的建筑风格。这种建筑风格的特点是所有元素都包含在一个整体中,或者换句话说,是自成一体的。
建筑学
实际上,单体后端看起来像一个单一的大型代码库,它提供了你所需的所有 API。
现在的问题是,为什么单体架构是传统的架构,以及为什么要创建微服务架构呢?
整体式架构在项目初期更为简单,足以满足大多数项目的需求。
当整个代码库都位于同一位置时,开发、测试、监控和部署就会变得更加直接、快捷和经济。
挑战
但随着应用程序的发展,功能和用户数量不断增加,新的挑战也随之而来。这些挑战可以归纳为两大类:代码库的可维护性和可扩展性。
在单体架构中,通常的做法是通过创建抽象层(例如模块)来组织代码。
但随着时间的推移,这些抽象概念及其边界通常会被打破,类似的代码开始到处传播。
代码库庞大时,很难知道需要在哪里进行更改,这使得修复错误和实现新功能变得更加困难。
规模化
接下来就是可扩展性问题。当系统需要更多资源时,有两种扩展方式:水平扩展和垂直扩展。
垂直扩展是指向现有机器添加更多资源,例如 GPU 或内存。水平扩展是指将应用程序分布在多台机器上,并向资源池中添加更多机器。
垂直扩展可能足够,但在某种程度上会受到限制,因为单台机器所能拥有的资源是有限的。
理论上,水平扩展是无限的。但另一方面,这要求你的应用程序能够在多台机器上正常运行。
即使是单体应用,只要是无状态的,分布在多台机器上也能运行。但单体应用在横向扩展方面存在微服务架构所没有的弱点。
由于单体架构将整个系统包含在单个代码库中,因此所有组件必须一起扩展。如果您只需要扩展部分端点,则别无选择,只能部署整个系统。
微服务
遗憾的是,微服务的描述方式多种多样。
建筑学
我特别喜欢Sam Newman 在《构建微服务》一书中给出的一个简洁定义:
微服务是能够协同工作的小型、自治的服务。
这对于初步了解微服务来说足够了,但缺乏深入理解微服务细节。从“微服务架构”中,我们了解到微服务应该具有以下特征:
- 小巧的尺寸
- 消息功能已启用
- 受上下文限制
- 自主开发
- 可独立部署
- 去中心化
- 利用自动化流程构建和发布
那么,这在实践中意味着什么呢?在现实世界中,你的应用程序会被拆分成多个服务,每个服务都有自己的一套相关功能(同时确保它们之间的低耦合性)。
同时,根据负载情况,同一服务会运行多个实例。它们之间异步通信,以确保消息传递并避免耦合。
挑战
与单体架构相反,为什么微服务的开发、测试、监控和部署速度更慢、成本更高?
多应用场景会带来新的挑战。例如,管理分散但相关的数据库中的数据比管理单一统一数据库中的数据更具挑战性。
接下来,你需要某种服务间的通信方式,通常是通过事件总线。让你的微服务协同工作、正确地测试它们以及部署它们都将是件非常棘手的事情。
最终,你应该预料到微服务架构的开发耗时会更长。复杂性的增加也意味着你需要更大的团队来管理它,仅靠一个小型团队来搭建微服务架构并非明智之举。
规模化
微服务架构的一个主要优势在于,它们可以根据需要轻松部署,并且能够更高效地扩展。
借助微服务架构,您可以只扩展需要扩展的服务,使其能够在更小、性能更低的硬件上运行。这使其速度更快、成本更低。
与单体架构相比,微服务还具有其他优势,例如更高的弹性、更易于部署和更易于替换。由于单体架构包含整个应用程序,因此如果其中一个组件发生故障,其他所有组件都将无法使用。
此外,您可能也体验过重构庞大代码库的难度,而微服务的规模通常是有限的。因此,替换服务的成本也更容易控制。
在涉及众多团队的大型项目中,微服务甚至可能对生产力产生积极影响。
分布式单体架构
分布式单体架构是将单体架构拆分成多个服务的结果,这些服务彼此高度依赖,但没有采用分布式系统所需的模式。
实际上,这是将单体应用拆分成多个独立服务,但保持它们紧密耦合的结果。
这意味着它们之间仍然存在严重的依赖关系。在这种情况下,你既失去了单体架构带来的简洁性,又无法享受到独立微服务的优势。
别这么做!
低频配对并不意味着你们之间完全没有关系。例如,你们可能会互发消息和收听消息。
另外,你应该编写一些集成测试,或者更准确地说,是契约测试(如果你擅长微服务的话)。
这意味着,在某些情况下,您需要了解其他服务的合同信息。它们之间确实存在某种关联,但这并不意味着您的服务是紧密耦合的。
你想了解更多关于微服务的知识吗?
好消息,我开设了一门微服务实践课程。
封面照片由Crawford Jolly拍摄,来自Unsplash。
文章来源:https://dev.to/morintd/understand-the-difference- Between-monolith-microservices-and-distributed-monolith-39kb






