我应该在多个微服务之间共享模型吗?

Should I share models across multiple microservices?

我正处于一个大项目的分析阶段,该项目将使用微服务架构创建。我非常有信心(至少在接下来的 3 年内)整个代码库将用 TypeScript 编写,并且大部分模型将在这些服务之间使用。

我计划用微服务来构建它,因为每个模块都是一个单独的 API,它将有自己的 REST 端点来处理与其职责相关的任务。例如,身份服务将处理注册、身份验证、令牌更新等...

我打算将每个服务创建为一个独立的 NestJS 项目。及其存储库、包、依赖项等...

但我有疑问:

这些服务是否应该在内部声明每个模型?即使它可能 是在另一个服务中声明的相同 模型?这可能会导致跨项目的大量代码重复,对吗?

如果他们不这样做,他们应该定义模型的只读 子集 ,只有他们需要的属性,这将是保持对模型的更改的最佳方式当“源”模型发生变化时跨不同服务的子集?假设服务 A 定义模型 X,而服务 B 使用 X 称为 X1,服务 B 使用 X 的另一个子集,称为 X2。每当 属性 可能发生更改(被删除、更改类型、名称或其他)时,当这些项目可能有 10 个、20 个或更多时,哪种方法是在每个项目中保持此更改同步的最佳方法?

我很困惑,因为据我所知,微服务应该是独立的并且拥有它运行所需的一切,所以遵循这个逻辑让我认为服务应该重新声明相同的副本或子集原来的模式,生活在另一个服务中。

但是从代码重复的角度来看,这似乎是一种自杀,因为第一年我将是唯一一个从事这些项目的人。

我知道微服务架构更适合一个开发团队,但是团队会来的,所以在不久的将来可能会有3/4的人在做,每个人都会有几个维护和发展的服务。

在此先感谢任何愿意帮助我解决这个问题的人!

微服务的全部意义在于它们可以独立更改和扩展。共享这些模型将迫使这些服务一起迭代,并强制执行强耦合(坏)。

要处理微服务架构中的共享域,请将绑定保持在最低限度。当服务 B 使用服务 A 的输出时,只映射服务 B 需要的位。服务 B 应该有自己独立的模型,它只关心服务 A 中 B 关心的事情。这样当其他东西改变了服务 A 的模型时,服务 B 不关心。

如果所有这些东西都存在于同一个数据库中,那么你没有微服务架构,你有一个整体。 Monoliths 不一定是坏的,它们通过拥有一致的内部域而具有真正的优势,一旦它们变得太大就会出现问题。但是,如果您已经按照这种方式构建了数据库,那么构建与之相匹配的软件可能是最简单的方法。

首先,我想声明微服务背后的主要思想之一是职责分离。

您可以在服务之间共享库 (please read this)。您还可以公开一些代表性对象(例如,如果您使用的是 gRPC,则为 Protocol Buffer 消息)。但是如果你打算将不同的服务集成到一个共享数据库中,这就不符合微服务架构。因为您正在使用数据库作为系统不同组件之间的集成机制。

如果您不能完全避免服务相互依赖,则必须尽量减少这种情况。您的服务可用性受到影响,您正在为系统引入故障点。

我认为 Martin Fowler 的 this presentation 也可能有助于正确看待事物。