微服务和耦合

Microservices and coupling

我正在尝试使用某种微服务架构。我正在尝试使用 HTTP 和 JSON 作为通信媒介(我知道最好不要称它为 ReST)。

所以,我正在使用 spring-mvc,我想将 class 用作被调用方的 ResponseBody 和被调用方的 RequestBody .所以碰巧我可以在两个项目上复制和镜像 class,或者创建一个 jar 并将其包含在两个项目中。

我在两种情况下都看到了耦合,第一种是重复耦合,另一种是(我确定它有名字)耦合。

并且 RequestResponse 模型不是项目的共同点。我正在为两者使用事件驱动的体系结构,并且事件有些相似(有点完全相同)。

我该怎么办?

依赖公共库与微服务低耦合并不矛盾。您只想确保您共享的库是针对特定问题开发的,该问题独立于您的服务,并且不依赖于您服务中的任何内容。

像看待第 3 方图书馆一样看待该图书馆。例如,您提到您正在使用 spring - 您在两个微服务中都使用 spring 这一事实并不意味着它们是耦合的。

这也意味着您必须对您的库进行版本控制,并将其留给使用微服务的团队来决定他们何时准备好 change/upgrade 版本。这是一个 link for how to create different library versions in java. Also read this link,其中包含一些关于清单的一般信息。

在 java 中,您可以使用两种方法之一来包含版本库。

  1. 在命名空间或 interface/class 名称中明确包含版本号。这允许类加载器具有唯一标识并且能够轻松地同时包含多个版本。 (可能是首选方式)。
  2. 使用相同的名称并且一次只包含一个版本的 jar。这意味着您必须用新的替换现有的 jar 依赖项,然后采用任何可能的更改。检查这个很棒 answer.

如果您的图书馆是一个通信客户端,您需要考虑在服务器端同时支持多个版本(以允许单独的微服务团队按照自己的节奏采用更新的版本)。

如果您的微服务正在发布一个接口,您需要特别注意如何处理更改。共享通信库是将这两种服务耦合在一起的一种特别危险的方式,尤其是因为它给人一种服务之间存在一致性的错觉。

如果您想共享一个界面,您至少必须执行以下操作 (IMO):

  • 对您的微服务进行版本控制,并支持所有先前版本的传输负载。 (无论如何你都想这样做)
  • 将实际的运输合同作为一个版本化的包发送(这样消费者就不会被迫使用最新的合同)我认为在 java 你可以为此使用 maven(但我不是 java人)

这非常重要,因为它意味着有两件事是可能的

  • 服务可以随意更改其接口,而无需担心下游代码依赖性(假设它遵循版本控制规则)
  • 消费者可以选择何时更新其通信包装器,并且永远不会公然被迫构建和发布新版本以响应其依赖项之一的更改。

有关版本控制的更多信息,请查看我的博客。 Microservice versioning; How to make breaking changes without breaking stuff