如何在两个微服务之间的REST服务之间共享实体?

时间:2017-12-05 06:41:54

标签: java rest microservices

我使用java创建了两个微服务。我需要从服务A到服务B进行REST api调用。发送的数据将采用JSON格式。使用jax-rs我需要在服务中创建实体类。

由于两个实体类在两个项目中都相同。我

  • 创建一个公共jar并使用is for我的所有实体/域对象?这是否使我的微服务更加紧密耦合?
  • 我是否在微服务项目中创建了相同的类?这只是意味着在两个项目中重复工作?

是否有更好的方式在服务之间进行通信?

3 个答案:

答案 0 :(得分:2)

在让您的两个微服务独立并让它们在未来也是独立的方面,我也会复制代码。我们之前有过完全相同的情况。几个微服务似乎使用了一些可以放在单独jar中的“常用”类。 最后我们有以下情况: - 使用相同JAR的多个(5+)服务 - 结果发现我们认为相同的类似乎在不同的服务中具有稍微不同的语义 - 一个类的更改或多或少迫使我们在每个微服务上发布一个版本,当它发布时(此处不再有独立性) - 开发人员往往会在任何地方看到“常见”行为,所以你最有可能在那里找到一些“Helper / Utility”类,同时在OOP中被认为是代码味道

长话短说,与此同时我们切换到重复代码,这使我们可以自由地独立处理我们的mircoservices,因为我们只需要坚持服务合同。内部发生的事情完全取决于服务,我们不必在迭代结束时释放所有服务。我不是说另一种选择是错误的,但事实证明它不适合我们。如果你真的看到两个服务之间的普通类,并且你确信你不会把你的公共库弄得乱七八糟,那就省去了。

修改

也许作为后续行动,我们对于在一些常见类中具有共享测试代码的测试(单元和集成)进行了相同的讨论。最后这是地狱,因为代码或验收标准的每一个细微变化都使50%的测试失败。与此同时,我们的策略是不在测试级别上共享任何内容,并在测试位置拥有一切。通过这种方式,您可以非常快速地消除或更改测试。最后,我们的教训是保持业务代码的清洁和优雅,并使测试代码尽可能让我们头疼。

答案 1 :(得分:0)

这是我们作为开发人员感到困惑的常见情况。我建议有一个普通的jar(共享),可用于微服务(A和B)。当我们使用第三方库时,它只是共享第三个资源。 在我目前的项目中,我们遇到了同样的情况,我们找到了最好的方法来建立单独的共享库( api-shared 作为名称)并在不同的微服务中将其作为jar使用。

在您的第二种方法中,您最终得到了冗余代码,并且难以维护。让我们假设如果你对实体有任何改变,那么你必须改变两个实体,这不是同步这个东西的好方法。

总而言之,我建议你将共享jar用于两种微服务。

此致

化工技术

答案 2 :(得分:0)

我说这取决于具体情况。如果使用共享包,则会在两个项目之间引入耦合。这是有道理的,如果两个项目都在相同的数据类上构建,因此将具有相同的dto对象。理想情况下,您将拥有自己的nexus,这简化了共享人工制品的使用。 否则,如果只有少数几个类是冗余的,我可能会分别在每个服务中实现它,这也将它们分离。

我担心你需要决定哪一个正确的解决方案适合你的项目。