如何在微服务架构中的微服务之间共享Java模型

时间:2019-03-28 09:45:04

标签: java spring-boot microservices

我正在设计新应用程序的体系结构,选择了微服务体系结构。在我的体系结构中,我注意到我有不同微服务所使用的模型。我想知道是否有一种方法可以在微服务之间共享模型代码,而不必在每个微服务中编写模型代码。

顺便说一下,我正在为应用程序使用spring boot框架。

6 个答案:

答案 0 :(得分:3)

您应该仅共享定义微服务API的模型,例如Protobuff .proto文件或从中生成的Java类。

通常通过创建一个单独的项目或将您的微服务项目转换为一个多模块项目来完成,其中一个模块是带有接口定义的瘦API模块。

在微服务之间共享代码没有错,但是您必须小心。共享过多的内部实现细节,您最终会得到distributed monolith instead of micro-services

答案 1 :(得分:2)

如果您对这个决定过于苛刻,您将以一种或另一种方式遇到无法令人满意的情况。这取决于您的SDLC和团队动态。在Ipswitch,我们有很多服务都可以协作,并且有高度共享的概念,例如设备和监视器。使每个服务都有自己的模型将是不可持续的。我们只做一次,而翻译只是增加了工作量,并引入了不一致的缺陷。但是整个系统是由一个大型开发团队共同构建的。因此,共享在那里最有意义。但是对于一个在微服务中拥有多个团队和多个SDLC的企业而言,隔离模型以避免耦合是更有意义的。但是,即使那样,如果团队接受这样做的风险/利益,那么由给定团队管理的一组紧密协作的服务当然可以共享一个模型。除了学术和哲学之外,这没有什么错。

因此,简而言之,分享最少,但也避免团队不必要的工作。

答案 2 :(得分:1)

在微服务架构中,每个架构都是绝对独立的,并且必须隐藏内部实现的细节。

如果共享模型,那么您将耦合微服务,并且失去了最大的优势之一,即每个团队都可以不受限制地开发其微服务,并且无需了解其他微服务的发展方式。请记住,您甚至可以在每种语言中使用不同的语言,如果您开始结合微服务,这将很困难。

https://softwareengineering.stackexchange.com/questions/290922/shared-domain-model-between-different-microservices

答案 3 :(得分:1)

您可以将模型类移动到其他项目/存储库,并将其作为依赖项添加到需要共享它的微服务中。

答案 4 :(得分:1)

您可以使用通用模型创建一个单独的项目,创建该项目的jar,并在其他微服务中添加此jar的依赖项。

但是我有实践经验,维护这个普通项目是一场噩梦,因为每次更改都必须创建一个新版本并更新所有微服务的构建脚本。

我认为我们不应该在微服务之间共享模型。

答案 5 :(得分:0)

不确定微服务是否使用Swagger,但是可以使用Swagger Codegen来生成模型。

例如,如果您具有接受和/或返回User对象的UserService。 UserService的使用者可以使用Swagger Codegen插件在构建时自动生成User类。

您可以轻松使用Swagger Codengen maven或gradle插件。