Spring mvc 微服务与耦合
我正在尝试使用某种微服务架构。我正在尝试使用HTTP和JSON作为通信媒介(我知道最好不要称之为ReST) 因此,我正在使用SpringMVC,我想在被调用方上使用一个类作为Spring mvc 微服务与耦合,spring-mvc,microservices,coupling,Spring Mvc,Microservices,Coupling,我正在尝试使用某种微服务架构。我正在尝试使用HTTP和JSON作为通信媒介(我知道最好不要称之为ReST) 因此,我正在使用SpringMVC,我想在被调用方上使用一个类作为ResponseBody,在被调用方上作为RequestBody。因此,我可以在两个项目上复制和镜像该类,或者创建一个jar并将其包含在这两个项目中 我在这两种情况下都看到了耦合,第一种是重复耦合,另一种是(我确信它有一个名称)耦合 而请求和响应模型并不是这些项目的共同点。我对两者都使用事件驱动体系结构,并且事件有些相似(有
ResponseBody
,在被调用方上作为RequestBody
。因此,我可以在两个项目上复制和镜像该类,或者创建一个jar并将其包含在这两个项目中
我在这两种情况下都看到了耦合,第一种是重复耦合,另一种是(我确信它有一个名称)耦合
而请求
和响应
模型并不是这些项目的共同点。我对两者都使用事件驱动体系结构,并且事件有些相似(有点完全相同)
我该怎么办?依赖公共库与微服务的低耦合并不矛盾。您只需要确保您共享的库是为特定的关注点开发的,该关注点独立于您的服务,并且不依赖于您服务中的任何内容 想象一下这个库,就像你为第三方库所做的那样。例如,您提到您正在使用spring—只是您在两个微服务中都使用spring并不意味着它们是耦合的 这也意味着您必须对库进行版本设置,并将其留给使用MicroService的团队来决定何时准备更改/升级版本。下面是如何在java中创建不同库版本的示例。还可以阅读本文,了解一些有关清单的一般信息 在java中,可以使用两种方法之一来包含版本库
如果你的库是一个通信客户端,你想考虑在服务器端同时支持多个版本(允许单独的微服务团队以自己的速度采用新版本)。您只需要确保您共享的库是为特定的关注点开发的,该关注点独立于您的服务,并且不依赖于您服务中的任何内容
想象一下这个库,就像你为第三方库所做的那样。例如,您提到您正在使用spring—只是您在两个微服务中都使用spring并不意味着它们是耦合的 这也意味着您必须对库进行版本设置,并将其留给使用MicroService的团队来决定何时准备更改/升级版本。下面是如何在java中创建不同库版本的示例。还可以阅读本文,了解一些有关清单的一般信息 在java中,可以使用两种方法之一来包含版本库如果你的库是一个通信客户端,你想考虑在服务器端同时支持多个版本(允许单独的微服务团队以自己的速度采用新版本)。
< P>如果你的微服务发布了一个接口,你要特别小心如何处理变化。共享一个通信库是将这两个服务耦合在一起的一种特别危险的方式,特别是因为它会使服务之间产生一致性的错觉 如果您想共享一个界面,您必须至少执行以下操作(IMO):- 为您的微服务设置版本,并支持所有以前版本的传输有效负载。(您无论如何都要这样做)
- 将实际的传输合同作为一个版本化的包发送(这样消费者就不会被迫使用最新的合同),我认为在java中,您可以使用maven(但我不是java人)
- 服务可以随意更改其接口,而无需担心下游代码的依赖性(假设它遵循版本控制规则)
- 消费者可以选择何时更新其通信包装器,并且永远不会被迫构建和发布新版本以响应其依赖项之一的更改
有关版本控制的更多信息,请查看我的博客 如果您的微服务正在发布一个界面,您需要特别注意如何处理更改。共享一个通信库是将这两个服务耦合在一起的一种特别危险的方式,特别是因为它会使服务之间产生一致性的错觉 如果您想共享一个界面,您必须至少执行以下操作(IMO):
- 为您的微服务设置版本,并支持所有以前版本的传输有效负载。(您无论如何都要这样做)
- 将实际的传输合同作为一个版本化的包发送(这样消费者就不会被迫使用最新的合同),我认为在java中,您可以使用maven(但我不是java人)