node.js - 相互通信微服务 - 如何?

标签 node.js web-services rest rabbitmq microservices

我正在从事一个个人项目,该项目是将单体式 Web 应用程序转换为微服务(每个服务都有自己的数据库)。

此刻,单体后端是用 NodeJS 制作的,能够回复 REST 请求。 当我开始将应用程序拆分为多个服务时,我遇到了下一个问题:如何使它们之间的通信很好?

首先,我尝试在下一个示例中使用 REST 调用: “注册服务”将有趣的东西插入到它的数据库中,然后将用户信息转发(HTTP POST)到“用户服务”,以便将其持久化到“用户”数据库中。 在此示例中,我们有 2 个服务,因此有 2 个数据库。

这一刻我意识到这不是一个好的选择。因为我的“注册服务”依赖于“用户服务”。它们有点耦合,这是微服务概念的反模式(根据我的阅读)。

第二个想法是使用像 RabbitMQ 这样的消息代理。 “注册服务”仍然在自己的数据库中插入有趣的东西,并以用户信息为数据在队列中发布消息。 “用户服务”使用此消息并将数据持久保存到其“用户”数据库中。通过使用这个概念,这两个服务是完全隔离的,这可能是个好主意。

但是,发送给客户端的响应如何(向“注册服务”发出请求的人)。有了第一个想法,我们可以发送“200,一切正常!”或400。这不是问题。第二种想法,我们不知道消费者(“用户服务”)是否持久化了用户数据,那么我需要回复客户端什么?

我在网络应用程序的商店方面遇到了同样的问题。客户将他想购买的产品发布到“订单服务”。这个人需要将他拥有的虚拟货币检查到“用户服务”,如果用户有足够的钱,然后将产品详细信息转发到“交付服务”。如何使用完全隔离的服务做到这一点?

我不想使用来自客户端的 http 请求时间在消息代理上进行异步请求/回复。

希望大家多多指教。

最佳答案

Tom 建议了一个 pretty good link ,其中投票最多的答案及其推理和解决方案是您可以信赖的答案。您的具体问题可能源于注册服务和用户服务是分开的。也许他们不应该?

理想情况下,Register 服务应该将“UserRegistered”事件发布到总线并返回 200,仅此而已。它根本不应该关心(知道)该事件的任何订阅者。

关于node.js - 相互通信微服务 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41636566/

相关文章:

web-services - 如何保护 RESTful Web 服务的安全?

php - Android PHP 网络服务安全

java - 如何通过自己的REST服务传递API异常输出?

node.js - CMD批处理文件: How to use a text file to input commands

javascript - 以 Angular 使用全局对象的良好做法

c# - asmx 网络服务 : client authentication

Java - Spring返回JSON对象/数组

api - 具有经过身份验证的用户的 REST api 的无状态性

node.js:无法读取未定义的属性 'defaultEncoding'

node.js - 关于 npm install 和 npm update 的困惑