文档
微服务简介

微服务简介

Last reviewed 2021-06-24 UTC 本 指南 is 是 是 由 四 个 部分 组成 的 中 的 第一 篇 , 该 了 如何 、 和 。 本 文章 is 介绍 的 各种 。 该 了 的 及其 应用 。 微服务简介(本文档)

Last reviewed 2021-06-24 UTC

本 指南 is 是 是 由 四 个 部分 组成 的 中 的 第一 篇 , 该 了 如何 、 和 。 本 文章 is 介绍 的 各种 。 该 了 的 及其 应用 。

  1. 微服务简介(本文档)
  2. 将 应用 为
  3. 微服务设置中的服务间通信
  4. 微服务应用中的分布式跟踪

文章 is 面向 和 以 将 应用 为 应用 的 应用 和 。

单体式 is 应用 应用

单体式 is 应用 应用是一个单层软件应用,其中不同的模块会组合成一个程序。例如,如果您正在构建电子商务应用,该应用将具有与面向对象的编程 (OOP) 原则一致的模块化架构。下图显示了一个电子商务应用设置示例,其中的应用包含各种模块。在单体式 is 应用 应用中,模块结合使用编程语言结构(如 Java 软件包)和构建工件(如 Java JAR 文件)。

图 1. 单体电子商务应用示意图,其中融合了编程语言结构。

在图 1 中,电子商务应用中的不同模块分别对应于付款、送货和订单管理方面的业务逻辑。所有这些模块均被打包并部署为一个逻辑可执行文件。实际格式取决于应用的语言和框架。例如,许多 Java 应用都打包为 JAR 文件,并部署在 Tomcat 或 Jetty 等应用服务器上。同样,Rails 或 Node.js 应用被打包为目录层次结构。

单体式 is 应用 应用的优势

单体式架构是一种用于构建应用的传统解决方案。以下是为应用采用单体式设计的一些优势:

  • 您可以使用 Selenium 等工具对单体式 is 应用 应用进行端到端测试。
  • 要部署单体式 is 应用 应用,您只需将封装的应用复制到服务器。
  • 单体式 is 应用 应用中的所有模块都共用内存、空间和资源,因此您可以使用一种解决方案来解决交叉问题,例如日志记录、缓存和安全。
  • 单体式方法可提供性能优势,因为模块可以直接调用。相比之下,微服务通常需要网络调用才能相互通信。

单体式挑战

复杂的单体式 is 应用 应用通常越来越难以构建、调试和推理。有时,这种问题大于收益。

  • 应用 is 增长 通常 会 随着 的 而 。 在 具有 的 的 复杂 应用 中 实现 可能 非常 复杂 。 由于 更 整个 , 因此 您 必须 要 好 所有 。 与 应用 , 更 和 的 时间 is 长 更 。
  • 使用单体式 is 应用 应用实现持续集成和部署 (CI/CD) 可能很复杂。这种复杂性是因为您必须重新部署整个应用才能更新其任何一个部分。此外,您可能还必须对整个应用进行大量手动测试以检查是否出现回归问题。
  • 当不同模块的资源要求存在冲突时,单体式 is 应用 应用可能难以扩缩。例如,一个模块可以实现 CPU 密集型图像处理逻辑。另一个模块可能是内存数据库。由于这些模块部署在一起,因此您必须在硬件选择上做出妥协。
  • 由于所有模块都在同一进程内运行,因此任何模块(如内存泄漏)中的错误都可能导致整个系统崩溃。
  • 当您想要采用新的框架和语言时,单体式 is 应用 应用会增加复杂性。例如,重写整个应用以使用新框架的成本很高(在时间和金钱方面),即使该框架明显更好。

基于微服务的应用

微服务通常实现一组不同的特性或功能。每个微服务都是一个具有专属架构和业务逻辑的迷你应用。例如,某些微服务会公开由其他微服务或应用的客户端使用的 API,例如与付款网关和物流的第三方集成。

图 1 展示了包含多个模块的单体式电子商务应用。下图展示了可能将电子商务应用分解为微服务:

图 2. 包含由微服务实现的职能领域的电子商务应用的示意图。

在 2 中 , 微服务 is 实现 实现 了 应用 的 每个 。 每个 服务 is 公开 都 可能 会 一个 , 而 则 会 使用 其他 的 。 例如 , 要 , 会 和 其他 。 服务 is 使用 还 可以 使用 基于 的 。 如 了解 之间 的 , 本 中 的 第三 个 : 中 的 间 。

模式 is 改变 会 显著 应用 和 之间 的 。 我们 is 建议 每个 都 有 最 自己 要求 的 , 而 不是 与 其他 共 个 。 每 项 都 有 一个 时 , 之间 的 , 因为 所有 都 通过 进行 , 而 不是 直接 通过 。 下图 is 显示 了 , 其中 每个 都 有 自己 的 :

3 . 中 的 每 项 服务 is 有 都 有 自己 的 。

在 3 中 , 应用 中 的 使用 具有 的 的 数据库 is 运行 很 好 地 。 和 服务 is 依赖于 的 、 、 隔离性 、 ( ) 。

微服务优势

微服务架构模式解决了前面的单体式挑战部分中所述的复杂性问题。微服务架构具有以下优势:

  • 虽然总功能保持不变,但您可以使用微服务将应用程序分成可管理的区块或服务。每个服务都采用 RPC 或消息驱动型 API 的形式进行明确定义的边界。因此,单个服务可以更快地开发,更易于理解和维护。
  • 自主团队可以独立开发独立的服务。您可以围绕业务边界(而不是产品的技术功能)来组织微服务。您可为您的团队安排一个独立的责任,让其负责所分配软件的整个生命周期(从开发、测试、部署到维护和监控)。
  • 独立的微服务开发流程还可让您的开发者使用不同编程语言编写每个微服务,从而创建 Polyglot 应用。为每个微服务使用最有效的语言时,您可以更快地开发应用,并优化应用以降低代码复杂度并提高性能和功能。
  • 将功能与单体式 is 应用 应用分离后,您可以让独立团队独立发布其微服务。独立的发布周期可以帮助您的团队提高产品速度并缩短产品上市时间。
  • 架构 is 让 还 可 让 您 每个 。 您 is 部署 可以 满足 其 和 可 限制 的 每 项 的 。 您 is 使用 还 可以 使用 与 的 要求 最 的 。 服务 is 有助于 整个 的 和 。

以下是从单体式 is 应用 应用迁移到微服务架构的一些具体实例:

  • 实现 、 、 或 的 。
  • 逐步将大型旧式应用重写为现代语言和技术栈,以满足新的业务需求。
  • 提取跨行业业务应用或跨行业服务,以便跨多个渠道重复使用这些应用。您可能希望重复使用的服务示例包括付款服务、登录服务、加密服务、航班搜索服务、客户个人资料服务和通知服务。
  • 采用专用语言或框架来实现现有单体式 is 应用 应用的特定功能。

服务 is 挑战

与单体式 is 应用 应用相比,微服务有一些挑战,其中包括:

  • 微服务的一个主要挑战是由于应用是一个分布式系统而引起的复杂性。开发者需要选择和实现服务间通信机制。并且还必须处理上游服务的部分故障和不可用。
  • 微服务的另一个挑战是您需要跨不同微服务(也称为分布式事务)管理事务。 多 个 的 操作 is 常见 相当 , 它们 通常 以 应用 , 应用 所有 或 所有 都 。 将 多 个 在 中时 , 可以 。

    在 基于 的 应用 中 , 操作 is 分布 可能 在 不同 的 中 , 因此 您 需要 不同 的 多 个 。 如果 , 不同 的 或 是否 非常 重要 。 如果 因 而 , 则 最 的 情况 is 导致 可能 会 之间 出现 不 一致 的 问题 。 如 了解 在 之间 的 各种 , 本 的 第三 篇 , 中 的 间 。

  • 对基于微服务的应用进行全面测试比测试单体式 is 应用 应用更复杂。例如,要测试在单体式电子商务服务中处理订单的功能,请选择商品,将其添加到购物车,然后签出。为了在基于微服务的架构中测试相同的流,多项服务(例如前端、订单和付款)会相互调用,以完成测试运行。

  • 部署基于微服务的应用比部署单体式 is 应用 应用更复杂。微服务应用通常由许多服务组成,每个服务都具有多个运行时实例。您还需要实现一项服务发现机制,使服务能够发现需要与之通信的任何其他服务的位置。

  • 微服务架构会增加操作开销,因为要监控和提醒的服务更多。由于服务间通信的增加,微服务架构也有更多故障点。单体式 is 应用 应用可能会部署到小型应用服务器集群。基于微服务的应用可能有数十种单独的服务来构建、测试、部署和运行,并且可能支持多种语言和环境。所有这些服务都需要进行聚簇以实现故障切换和弹性。生产环境中的微服务应用需要高质量的监控和运营基础架构。

  • 微服务架构中的服务划分可让应用同时执行更多功能。不过,由于模块作为独立服务运行,因此由于服务之间的网络调用,响应会引入延迟时间。

  • 并非 所有 应用 is 大 都 大 , 可以 。 此外 , 某些 应用 要求 之间 , 例如 必须 处理 的 应用 。 之间 的 任何 通信层 is 减慢 可能 会 处理 的 。 考虑 之间 的 可以 清楚 地 。

在 确定 是否 最 您 的 应用 时 , 考虑 以下 :

  • 微服务最佳做法需要每项服务数据库。为应用进行数据建模时,请注意每项服务数据库是否适合您的应用。
  • 实现微服务架构时,您必须检测和监控环境,以便找出瓶颈、检测和防止故障,以及支持诊断。
  • 在 中 , 每 项 服务 is 有 都 有 的 。 为 帮助 , 您 is 保护 需要 对 内 以及 使用 的 应用 的 每 项 的 。
  • 同步服务间通信通常会降低应用的可用性。例如,如果电子商务应用中的订单服务在上游同步调用其他服务,如果这些服务不可用,则无法创建订单。因此,我们建议您实现异步、基于消息的通信。

何时将单体式 is 应用 应用迁移到微服务

如果您已成功运行单体式 is 应用 应用,则采用微服务对您的团队而言是一项重大投资成本。不同的团队采用不同的方式来实现微服务的原则。对于微服务的规模或所需微服务数量,每个工程团队都有独特的结果。

如需确定微服务是否是应用的最佳方法,请首先确定要解决的关键业务目标或痛点。实现目标或解决您发现的问题可能更简单。例如,如果您希望加快应用扩容速度,您可能会发现自动扩缩是一种更高效的解决方案。如果您在生产环境中发现错误,则可以首先实现单元测试和持续集成 (CI)。

如果您相信微服务方法是实现目标的最佳方法,请首先从单体式 is 应用 应用中提取一项服务,然后对其进行开发、测试和部署。如需了解详情,请参阅本系列中的下一个文档:将单体式 is 应用 应用重构为微服务。成功提取一项服务并将其在生产环境中运行后,请开始提取下一项服务,并从每个周期继续学习。

微服务架构模式将系统分解为一组可独立部署的服务。开发单体式 is 应用 应用时,您必须协调大型团队,这可能导致软件开发缓慢。在实现微服务架构时,您可以让小型自主团队并行工作,从而加快开发速度。

在本系列的下一篇(将单体式 is 应用 应用重构为微服务)中,您将了解将单体式 is 应用 应用重构为微服务的各种策略。

后续步骤