【发布时间】:2017-05-28 22:34:54
【问题描述】:
我正在从事一个个人项目,该项目是将单体 Web 应用程序转换为微服务(每个服务都有自己的数据库)。
此时,单体后端是用 NodeJS 制作的,并且能够回复 REST 请求。 当我开始将应用程序拆分为多个服务时,我面临下一个问题:如何使它们之间的通信良好?
首先我尝试在下一个示例中使用 REST 调用: “注册服务”将有趣的东西插入其数据库,然后将用户信息转发(HTTP POST)到“用户服务”,以便将其持久化到“用户”数据库中。 在此示例中,我们有 2 个服务,因此有 2 个数据库。
此时我意识到这不是一个好的选择。因为我的“注册服务”依赖于“用户服务”。它们有点耦合,这是微服务概念的反模式(从我读到的内容)。
第二个想法是使用像 RabbitMQ 这样的消息代理。 “注册服务”仍然在自己的数据库中插入有趣的东西,并以用户信息作为数据在队列中发布消息。 “用户服务”使用此消息并将数据保存到其“用户”数据库中。通过使用这个概念,这两个服务都是完全隔离的,这可能是一个好主意。
但是,如何将响应发送给客户端(向“注册服务”发出请求)。有了第一个想法,我们可以发送“200,一切都好!”或400。这不是问题。有了第二种思路,我们不知道消费者(“用户服务”)是否持久化了用户数据,那我需要回复客户端什么呢?
我在 Web 应用程序的商店方面遇到了同样的问题。客户将他要购买的产品发布到“订单服务”。这个人需要在“用户服务”中检查他拥有的虚拟货币,然后如果用户有足够的钱,则将产品详细信息转发给“交付服务”。如何使用完全隔离的服务来做到这一点?
我不想使用来自客户端的 http 请求时间在消息代理上发出异步请求/回复。
希望大家多多指教。
【问题讨论】:
标签: node.js web-services rest rabbitmq microservices