【发布时间】:2016-08-10 14:41:14
【问题描述】:
我正在创建一个具有微服务架构的项目。我创建了两个微服务。
其中一个用于产品实体,另一个用于票据实体。它们有自己的端点,并与网关连接在一起(我使用的是 jhipster 微服务架构)。
bill-ms 应该访问产品列表。我想知道如何在这两个 ms 之间进行通信。我想到了三种方法:
从 bill-ms 向队列发送请求 - 例如 rabbitMQ,以从 product-ms 获取具有这些 id 的这些产品(我不知道这是什么瓶颈)
向网关发送产品服务请求并从那里获取产品(由于它们之间的数据大小,我担心延迟,因此我不会直接接触数据库,所以我总是取决于网关)
我可以在bill-ms中复制repositories、services和entities(这是一种丑陋的方式,而且我认为它违反了ms-architecture的规则并且维护起来非常困难)
如果你有任何其他方法,我很感激你与我分享。
编辑
- 现在我知道瓶颈是什么了:假设有 3 个 bill-ms 实例,rabbitMQ 如何决定响应哪个实例?或者我应该如何对功能区说“给我免费的 bill-ms 实例以订阅来自 rabbitMQ 的请求”以实现负载平衡。
【问题讨论】:
-
你也可以重新考虑你的服务边界,也许你的服务太细了。重复也可能不是坏事,如果您认为您的产品可能会消失或可能在他们的数据库中被修改,而您希望它们在账单中长时间保持不变,在这种情况下,我不会认为这是重复,但只有存储有关您的账单所需产品的不可变信息。
-
“我正在使用 jhipster 微服务架构”..JHipster 只是一个没有自己架构的库..
-
Jhipster 不是一个库,它是一个应用生成器,恰好在 spring cloud netflix 之上实现了微服务架构。
-
所以更大的问题就在这里:当您实际上遇到数据可供彼此使用的问题时,为什么要采用微服务方式?我宁愿建议从一个适当模块化的单体开始。永远不要做选项 3,因为那你根本不需要微服务。不要害怕选项 2,春天的 netflix 世界有大量的解决方案来解决即将出现的问题(eureka、feign、ribbon、hystrix ......)
-
使用负载平衡(通过功能区)发现客户端来获取产品服务实例,或者上面提到的选项 3 似乎更好的选择。只要只有一个服务(所有者)修改数据,复制数据就可以了,而其他服务保持不变的副本。 Rabbit MQ 可用于保持重复数据的同步。
标签: java spring spring-boot jhipster microservices