Node.js 内部通信微服务-如何?

Node.js 内部通信微服务-如何?,node.js,web-services,rest,rabbitmq,microservices,Node.js,Web Services,Rest,Rabbitmq,Microservices,我正在进行一个个人项目,将一个单一的web应用程序转换为微服务。每个服务都有自己的数据库 此时,单片后端由NodeJS生成,能够响应REST请求。 当我开始将应用程序拆分为多个服务时,我面临着下一个问题:如何使它们之间的通信良好 首先,我尝试在下一个示例中使用REST调用: 注册服务将感兴趣的内容插入其数据库,然后将HTTP POST用户信息转发给用户服务,以便将其持久化到用户数据库中。 从这个示例中,我们有2个服务,因此有2个数据库 我意识到这不是一个好的选择。因为我的注册服务依赖于用户服务。

我正在进行一个个人项目,将一个单一的web应用程序转换为微服务。每个服务都有自己的数据库

此时,单片后端由NodeJS生成,能够响应REST请求。 当我开始将应用程序拆分为多个服务时,我面临着下一个问题:如何使它们之间的通信良好

首先,我尝试在下一个示例中使用REST调用: 注册服务将感兴趣的内容插入其数据库,然后将HTTP POST用户信息转发给用户服务,以便将其持久化到用户数据库中。 从这个示例中,我们有2个服务,因此有2个数据库

我意识到这不是一个好的选择。因为我的注册服务依赖于用户服务。它们是耦合的,这是我所读到的微服务概念的反模式

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

但是,发送给请求注册服务的客户机的响应如何。有了第一个想法,我们可以发送200,一切都好!或者400。这不是问题。第二个想法是,我们不知道消费者用户服务是否持久化了用户数据,那么我需要回复客户机什么呢

我在web应用程序的商店端也有同样的问题。客户将他想要购买的产品发布到订购服务中。这个人需要检查他在用户服务中的虚拟资金,然后转发产品细节,以便在用户有足够资金的情况下提供服务。如何使用完全隔离的服务做到这一点

我不想使用来自客户端的http请求时间在MessageBroker上进行异步请求/应答

我希望你们中的一些人能给我一些启发。

提出了一个建议,在这个建议中,得票最多的答案及其推理和解决方案就是你可以信赖的答案。您的具体问题可能根源于注册服务和用户服务是分开的。也许他们不应该这样


理想情况下,注册服务应该将UserRegistered事件发布到总线,并返回200,仅此而已。它根本不应该关心该活动的任何订阅者

谢谢您的链接

我的问题将我拥有的架构转变为一个新的架构。对于那些与我有同样问题的人,我通过这个链接做了以下几件事:

将注册服务和用户服务结合在一起。为什么?因为这一切都取决于用户信息,这与伊利阿卡利给出的解决方案所要求的数据库相同

将用户资金的管理分离到仅存在于订单服务中的钱包中。正因为如此,在执行订单时,我们不需要检索用户信息,我们只需要检查钱包信息。当用户执行身份验证时,我将用户名编码在JWT中。因此,我可以在钱包中使用用户名作为外键,以识别提供或使用的钱包等

正如您所看到的,我不再使用MessageBroker,因为现在我不需要它。但我可以将邮件逻辑拆分为一个新的微服务,然后使用消息代理在需要时通过我所有的微服务发送邮件


如果我错了,请告诉我,但这听起来很棒。

使用cote,它会摇滚!认真地

及时服务。js

const cote = require('cote');
const timeService = new cote.Responder({ name: 'Time Service' });

timeService.on('time', (req, cb) => {
    cb(new Date());
});
在client.js中

const cote = require('cote');
const client = new cote.Requester({ name: 'Client' });

client.send({ type: 'time' }, (time) => {
    console.log(time);
});

读这个:把他们聚在一起?然后让我们把所有的东西重新组合成一个整体。。。