微服务架构松散耦合的复杂性

2024-01-08

我对整个微服务潮流相当陌生。我一直在研究良好的微服务环境背后的架构和原理。

定义微服务的主要内容之一应该是每个服务的松散耦合性质。微服务A永远不应该打电话微服务B直接,或者您正在有效地创建一个整体系统,该系统失去了架构模式提供的可扩展性。

问题/例子

例如,如果我开发一个返回 GUID 的微服务,那么建议环境中的其他微服务在需要时可以直接调用 GUID 服务是合理的。

我知道可以使用各种排队系统将数据从一项服务传递到另一项服务,但在我看来,它们主要用于插入、删除或更新。

我无法理解如何使用队列进行简单读取(如我的 GUID 示例)以及为什么不直接从另一个微服务调用 GUID 服务。

注意:返回 GUID 只是一个示例,我知道大多数语言都能够在内部生成它们

如果能澄清这一点,我们将不胜感激。


您不应该按原样遵守每条规则。

该规则有许多例外,并且许多系统的实践证明它并不适用于每种情况或系统。

我不同意微服务 A 永远不应该调用微服务 B 作为一般规则的限制,因为它并不适用于所有情况。我曾使用过多个系统 微服务,而我们却没有遵循这一点。

微服务之间的通信:

您可以使用多种方式在微服务之间进行通信,例如:

  1. 事件(使用队列)

  2. 命令 - 通过 API 直接调用另一个微服务(这是对微服务的某种指令) 需要进行更改(创建、更新、删除)。

  3. 查询 - 通过 API 直接调用另一个微服务(例如获取 GUID 的示例)。 有些人又会说这也是一个命令。 使用 Query 作为术语时,通常会结合使用CQRS https://martinfowler.com/bliki/CQRS.html以及。

  4. 共享数据库(大多数在线资源会告诉你不要这样做 出于多种原因) 一般来说,这不是推荐的方法。

一般来说

您应该根据您的需求来使用您的系统,而不是基于像这样的固定规则 “微服务 A 永远不应该调用微服务 B”。

我给你举个例子,为什么:

Example:

假设您有“微服务 A”和“微服务 B”。您的“微服务 B”正在消费“微服务 A”通过 Kafka 发布的事件。 “微服务 B”在使用事件时将一些相关的“外部”数据存储在自己的数据库中(复制它)。 这是一种常见的方法,即每次需要“微服务 A”的一些数据时都不会调用它。这很常见,例如 如果“微服务A”是具有系统配置设置或类似的某些服务。

假设您遇到灾难场景,您的数据库和“微服务 B”中的所有数据都被破坏或损坏。 为了解决这个问题,您可以恢复备份并应用最近 1 小时的最新事件 您的“微服务 B”已关闭并解决问题(如果您的事件处理实现为幂等)。在这种情况下一切都很好。

另一方面,如果您的系统在生产环境中运行了一段时间。经过某个时间点,您开发“微服务 C”并决定 将其部署到生产中。事实证明,您需要“微服务A”产生的一些数据。您需要“微服务 C”上的数据 作为外部数据,类似于“微服务 B”。你如何获得这些数据? 您消费了“微服务A”的所有事件吗?在理想的世界中,您将永远保留卡夫卡中的所有事件。在这种情况下你会 只需订阅事件并应用所有事件即可将您需要的所有数据保存在“微​​服务C”中。 实际上你需要设置一些保留期限 https://www.cloudkarafka.com/blog/2018-05-08-what-is-kafka-retention-period.html比如说 5 天。如果您的系统运行时间超过 5 天,您将无法从事件重新创建数据。

在这种情况下,您需要直接使用 Command/Query 调用服务并填充“微服务 C”数据库。

这只是您需要直接调用的一种边缘情况示例。

Summary:

还有许多其他例子表明这种方法也是有效的。 例如,很多时候,您需要同步调用另一个微服务,并且您需要等待响应(取决于您的业务场景)。最好的方法是使用命令/查询直接调用另一个微服务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务架构松散耦合的复杂性 的相关文章

随机推荐

  • C# HttpClient PUT

    由于某种原因 我的下面的代码曾经可以工作 现在却引发了一个异常 public static async Task
  • 您可以从 Adob​​e Air 访问 Windows 注册表吗?

    y N 编辑 只读访问权限就可以了 我还没有尝试过 但我想我已经找到了解决方法 Adobe AIR 无法写入 Windows 注册表 但您可以在 AIR 2 中启动本机进程 以下博客文章展示了如何执行此操作 http www adobe c
  • 带换行符的 GWT 标签

    GWT Label 小部件将所有内容解释为文本 而不是 html 标签 这很好 但我希望它能够解释 n as a br 我怎么做 我会创建子类 但我找不到要重写的内容来实现此行为 我可以使用 HTML 小部件 但它会解释所有标签 我需要的只
  • CMake RelWithDebInfo 链接到调试库

    我有一个项目链接到六个库 其中包括 OpenCV 由于发布变体崩溃了 而调试工作正常 只是慢了很多 我想在中编译我的项目RelWithDebInfo配置 然而 DebugOpenCV 库的版本被包含在内 而不是Release OpenCV
  • 改变向量的元素

    假设我有一个包含数千个元素的向量 如果我想让索引在100 200之间的元素变成0 需要什么R代码 另外 我如何计算两个不同值之间的长度 例如 如果我想知道 股价 在 30 40 之间的时间长度 请阅读安装时附带的 R 简介 手册 你的问题之
  • Excel 隐藏/显示功能区上除自定义选项卡之外的所有选项卡

    如何使用 VBA 而不是 XML 隐藏和显示所有标准 Excel 功能区选项卡 我不想隐藏整个功能区 正如这里所要求的 VBA 最小化 Excel 中的功能区 https stackoverflow com questions 190195
  • 添加自定义刻度和标签

    我想在 matplotlib 中添加自定义主要刻度和标签 典型用途是在该位置添加标签math pi与标签 pi 我的目标是让其他刻度保持原样 我想保留原始的主要和次要刻度以及之前选择的格式 但带有这个额外的刻度和标签 我已经找到了一种方法
  • 使用 1:n 中的唯一值创建 n × n 矩阵

    我想在 R 中生成一个随机的 n n 矩阵 离散值范围从 1 到 n 棘手的部分是我希望每个值在行和列中都是唯一的 例如 如果n 3矩阵可能如下所示 1 2 3 2 3 1 3 1 2 或者它可能看起来像这样 2 3 1 1 2 3 3 1
  • 我的 git 存储库中的所有这些隐藏('._' 前缀)文件是什么?

    当我在目录上执行 git status 时 它会显示一堆未跟踪的文件 这些文件似乎是重复的 唯一的区别是它们都有一个前缀 例如 我需要添加的未跟踪文件之一是 app assets stylesheets categories css另一个文
  • 如何在 angular2 中显示/隐藏 div 的动态 id

    这里执行了 kpiName 的循环 并且也执行了 subRegion 的内部循环 结果 4 divclass col xs 2 创建并在其中创建两个 div 过滤器类内的可点击 div 其动态 ID 为id filteredTabSubRe
  • 如何从 Pyspark 中的日期列中减去天数列?

    给定以下 PySpark DataFrame df sqlContext createDataFrame 2015 01 15 10 2015 02 15 5 date col days col 如何从日期列中减去天数列 在此示例中 结果列
  • Java 中的 Ruby 解析器

    我正在做的项目是用 Java 和解析器源代码文件编写的 到目前为止的 Java src 现在我也想启用解析 Ruby 代码 因此 我正在寻找一个可以解析 Ruby 源代码的 Java 解析器 到目前为止我唯一能找到的是 Ruby 中的 Ru
  • 从批处理文件运行 python 脚本时出现 ModuleNotFoundError

    我有一个简单的 python 脚本 名为sc py翻译一个词 这是我的代码 python3 from googletrans import Translator import sys translator Translator dest h
  • Excel VBA 创建文件夹、子文件夹和更多子文件夹

    我有一个问题与我在这里看到的其他一些问题非常相似 但它们并没有完全回答我需要的问题 或者当我尝试它们时 它导致了一个我不知道如何解决的错误 只有5级我无法发表评论来提问 在 Excel 中 我有一个用于引用文件夹的命名配置文件的文件 我尝试
  • kerascompute_output_shape不适用于自定义层

    我自定义了一个层 将batch size和第一个维度合并 其他维度不变 但是compute output shape好像没有效果 导致后面的层无法得到准确的形状信息 从而产生错误 如何使compute output shape工作 impo
  • C++ 函数返回字符串数组

    我是 C 新手 对于一个学校项目 我需要创建一个能够返回字符串数组的函数 目前我的标题中有这个 Config h string getVehicles void 配置文件 string Config getVehicles string t
  • docker-compose:删除容器名称的默认后缀?

    my yml version 3 services myservice image myimage 当我跑步时docker compose p myprefix f my yml up 它创建名为myprefix myservice 1 是
  • 如何在没有数据库锁的情况下并行执行线程并在sqlite数据库中插入相应的数据?

    我需要调用多个 api 每个 api 在单独的线程中执行 并将响应中的相应数据插入到 sqlite 数据库中 而不会导致锁定 任何人都可以在这方面帮助我提供一个我可以参考的工作示例 我需要调用多个 api 每个 api 在单独的线程中执行
  • 我应该在哪里存储外键?

    如果我在两个表之间存在关系 两个表都有自己的主键 那么什么应该指导我决定哪个表应该存储外键 我知道关系的性质可能很重要 一对一 一对多 多对多 单向 双向 并且访问模式可能也很重要 那么做出这个决定的系统方法是什么 关系中的子表是哪个表 回
  • 微服务架构松散耦合的复杂性

    我对整个微服务潮流相当陌生 我一直在研究良好的微服务环境背后的架构和原理 定义微服务的主要内容之一应该是每个服务的松散耦合性质 微服务A永远不应该打电话微服务B直接 或者您正在有效地创建一个整体系统 该系统失去了架构模式提供的可扩展性 问题