Spring mvc 微服务与耦合

Spring mvc 微服务与耦合,spring-mvc,microservices,coupling,Spring Mvc,Microservices,Coupling,我正在尝试使用某种微服务架构。我正在尝试使用HTTP和JSON作为通信媒介(我知道最好不要称之为ReST) 因此,我正在使用SpringMVC,我想在被调用方上使用一个类作为ResponseBody,在被调用方上作为RequestBody。因此,我可以在两个项目上复制和镜像该类,或者创建一个jar并将其包含在这两个项目中 我在这两种情况下都看到了耦合,第一种是重复耦合,另一种是(我确信它有一个名称)耦合 而请求和响应模型并不是这些项目的共同点。我对两者都使用事件驱动体系结构,并且事件有些相似(有

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

因此,我正在使用SpringMVC,我想在被调用方上使用一个类作为
ResponseBody
,在被调用方上作为
RequestBody
。因此,我可以在两个项目上复制和镜像该类,或者创建一个jar并将其包含在这两个项目中

我在这两种情况下都看到了耦合,第一种是重复耦合,另一种是(我确信它有一个名称)耦合

请求
响应
模型并不是这些项目的共同点。我对两者都使用事件驱动体系结构,并且事件有些相似(有点完全相同)


我该怎么办?

依赖公共库与微服务的低耦合并不矛盾。您只需要确保您共享的库是为特定的关注点开发的,该关注点独立于您的服务,并且不依赖于您服务中的任何内容

想象一下这个库,就像你为第三方库所做的那样。例如,您提到您正在使用spring—只是您在两个微服务中都使用spring并不意味着它们是耦合的

这也意味着您必须对库进行版本设置,并将其留给使用MicroService的团队来决定何时准备更改/升级版本。下面是如何在java中创建不同库版本的示例。还可以阅读本文,了解一些有关清单的一般信息

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

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

  • 如果你的库是一个通信客户端,你想考虑在服务器端同时支持多个版本(允许单独的微服务团队以自己的速度采用新版本)。您只需要确保您共享的库是为特定的关注点开发的,该关注点独立于您的服务,并且不依赖于您服务中的任何内容

    想象一下这个库,就像你为第三方库所做的那样。例如,您提到您正在使用spring—只是您在两个微服务中都使用spring并不意味着它们是耦合的

    这也意味着您必须对库进行版本设置,并将其留给使用MicroService的团队来决定何时准备更改/升级版本。下面是如何在java中创建不同库版本的示例。还可以阅读本文,了解一些有关清单的一般信息

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

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

  • 如果你的库是一个通信客户端,你想考虑在服务器端同时支持多个版本(允许单独的微服务团队以自己的速度采用新版本)。

    < P>如果你的微服务发布了一个接口,你要特别小心如何处理变化。共享一个通信库是将这两个服务耦合在一起的一种特别危险的方式,特别是因为它会使服务之间产生一致性的错觉

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

    • 为您的微服务设置版本,并支持所有以前版本的传输有效负载。(您无论如何都要这样做)
    • 将实际的传输合同作为一个版本化的包发送(这样消费者就不会被迫使用最新的合同),我认为在java中,您可以使用maven(但我不是java人)
    这非常重要,因为这意味着有两件事是可能的

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

    有关版本控制的更多信息,请查看我的博客

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

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

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