发布于 2026-01-06 0 阅读
0

微服务入门(第一部分)

微服务入门(第一部分)

在开始之前,我想请大家多多包涵。我的英语不是母语,所以如果有什么错误,请大家多多包涵!我会尽力做到最好。

最近,我为我们公司后端开发人员分会做了一次演讲。演讲主题,你猜对了:微服务架构。

从图中可以看出,微服务是一个非常大的话题!

微服务模式

图 1. 微服务模式 - microservices.io

因此,我的想法是撰写一系列文章,探讨以下几种微服务架构模式:

  1. API 网关
  2. 服务登记和健康检查
  3. 负载均衡器
  4. 服务通信:消息传递;以及
  5. 断路器

我将使用 ASP.NET Core 来编写这些文章中的示例代码,但无论你使用什么语言/框架,思路都是一样的,好吗?

说实话,我很想聊更多话题,但事实是:我才刚刚开始学习微服务。目前,我只能谈谈这个。不过,如果大家喜欢这个系列,我会继续研究架构,并撰写更多相关内容!

什么是微服务架构?

在深入探讨各个主题之前,让我们先来谈谈微服务架构究竟是什么。

我们都学过单体架构,对吧?我们已经习惯了这种架构。采用单体架构的应用程序会生成一个单独的可执行文件(对于 Java、C#、Go 等语言),或者只有一个目录结构(对于 Ruby、JavaScript 等语言)。

单体架构本身并没有错,好吗?它也有一些优点,例如:

  • 开发简单——IDE 和其他工具专注于构建单个应用程序;

  • 更容易进行彻底的更改——您可以更改代码、数据库模式、构建和部署;

  • 易于测试——开发人员可以为整个应用程序编写测试(单元测试、集成测试、端到端测试……);

  • 易于扩展——您可以在负载均衡器后面运行应用程序的多个实例。

综上所述,为什么随着单体应用程序的增长,开发、测试、部署和扩展会变得困难?

巨石地狱

随着时间的推移,应用程序变得越来越庞大、越来越复杂。正因如此,一系列问题开始出现。

  • 复杂性:如前所述,单体应用的代码库会随着功能不断增加而增长。结果,代码库变得极其复杂,任何开发人员都无法完全理解所有代码。这将使添加新功能和/或修复新错误变得更加困难和耗时。最终,最初选择的任何架构风格都会变成一团“乱麻”

  • 开发速度缓慢:除了复杂性之外,代码库的大小也会影响 IDE 的响应速度、构建和启动时间。这会导致编辑-构建-运行-测试循环耗时过长;

  • 提交部署:由于多个开发人员向同一代码库提交代码,构建版本通常会处于不合适的发布状态。
    如果开发人员尝试使用类似“feature/”分支的策略来缓解这个问题,他们将面临复杂的合并过程。因此,需要进行长时间的测试和稳定化。
    此外,测试过程也会非常复杂。由于代码库庞大,且新变更的影响难以预料,开发人员必须在持续集成 (CI) 环境中运行所有测试。有些测试甚至可能需要手动执行。诊断和修复测试失败的原因也十分复杂。

  • 扩展困难:
    在大型单体应用中,某些模块可能需要更多内存,而另一些模块可能需要更多 CPU 资源。由于所有模块都属于同一个应用,服务器配置可能会受到影响;

  • 可靠性:
    对大型应用程序进行全面测试非常困难。因此,错误难免会进入生产环境。更糟糕的是,问题很难被隔离。例如,假设某个模块存在内存泄漏,这可能会导致整个应用程序崩溃;

  • 过时的技术栈
    随着时间的推移,所选的技术栈可能会过时。在单体应用中,采用新的框架和技术非常困难。为了实现这一点,团队必须重写整个应用程序,这既复杂又昂贵。

微服务拯救世界

大型单体应用会暴露出各种各样的问题,我们需要一个解决方案。微服务架构应运而生。

微服务架构将对非功能性需求产生影响,例如:可维护性、可测试性、可靠性……

但什么是微服务呢?让我们用 Martin Abbot 和 Michael Fisher 的 Scale Cube 来定义它:

图像

图 2. 比例立方体

如您所见,我们可以沿三个轴缩放应用程序:

  • X 轴:这时我们会创建应用程序的新实例,并将它们放在负载均衡器后面以处理不断增加的负载;
  • Z 轴:这是指我们在应用程序的各个实例之间分配负载。例如,实例 1 将处理 A 到 H 的用户名,实例 2 将处理 I 到 P 的用户名,实例 3 将处理 R 到 Z 的用户名;
  • Y轴:这是定义微服务的轴。在这里,我们将使用一种称为“功能分解”的方法,将单体应用拆分成多个服务。这些服务也可以沿X轴和Z轴进行扩展。

我不打算解释“功能分解”过程,原因有二。首先,目前我还不了解这个过程的具体运作方式。我认为它基于领域驱动设计(DDD),即为应用程序创建定义服务的子领域模型。其次,本文只是对微服务的一个简单介绍。

因此,微服务的高级定义是:

“一种将应用程序在功能上分解为一组服务的架构风格”
——克里斯·理查森,《微服务模式》。

好处

采用微服务架构的优势包括:

  1. 支持大型复杂应用程序的持续交付和部署;

    • 由于该服务规模相对较小,因此自动化测试更容易编写,执行速度也更快;
    • 每个服务都可以独立于其他服务进行部署(如果变更仅限于该服务本身)。因此,将新的变更部署到生产环境更加容易;
    • 这使得团队能够保持自治和松耦合,因为每个团队最多只负责几个服务。这加快了开发速度。
  2. 服务规模小,易于维护;

    • 代码库更小,IDE 的响应速度更快,开发人员更能理解服务,每个服务的构建和启动速度也更快,从而提高了生产力;
  3. 服务可以独立扩展;

    • 如前所述,每项服务都可以根据需要沿 X 轴和 Z 轴进行扩展,服务器可以更好地适应每项服务的需求;
  4. 易于试验和采用新技术;

    • 当开发人员开始编写新服务时,他们可以自由选择任何技术/框架(在一定程度上,这取决于公司的政策);
    • 由于这些服务规模相对较小,使用更好的解决方案重写它们变得更加实际。如果新技术失败了,您可以直接放弃它,而不会危及整个项目;
  5. 问题隔离

    • 如果某个服务出现问题(例如内存泄漏)而宕机,不会导致整个应用程序崩溃。因此,影响要小得多。

缺点

没错,微服务有很多优点,但它的缺点呢?世上没有完美的事物,对吧?没错!微服务也有一些缺点。以下列举几点:

  1. 很难确定合适的服务组合;

    • 没有公式可以确定服务集。必须仔细考虑,否则最终会得到一个分布式单体架构,它兼具微服务和单体架构的缺点;
  2. 分布式系统更加复杂;

    • 它们需要通过某种进程间通信机制进行通信,这比简单的方法调用要复杂得多。它们还需要处理部分故障和高延迟问题;
    • 每个服务都有自己的数据库,这使得实现可能涉及多个服务的事务和查询变得困难。他们需要实现Saga来维护数据一致性。此外,他们无法使用简单的查询来恢复数据,需要实现 API 组合或 CQRS;
    • 它引入了对高度自动化水平的需求;
  3. 涵盖多种服务的功能必须谨慎部署;

  4. 何时领养孩子是个难题;

    • 例如,考虑一家初创公司。他们需要尽快将产品推向市场,但微服务架构比构建简单的单体应用程序要复杂得多。

结论

正如我们所见,微服务有很多优点,但也存在一些缺点——任何技术都是如此。决定采用微服务时,必须非常谨慎地进行实施。但对于复杂的应用程序来说,它通常是合适的工具。

既然我们已经讨论了微服务架构的概念,接下来就可以开始探讨它的一些模式了。在第二部分,我们将讨论API 网关。下次再见!

参考书目

  1. 什么是微服务? - https://microservices.io/ ;
  2. 微服务模式:以 Java 为例 - Chris Richardson;
文章来源:https://dev.to/bernas1104/an-introduction-to-microservices-pt-1-18o9