通信间微服务 - 如何?

Cra*_*yer 9 rest web-services rabbitmq node.js microservices

我正在开展一个个人项目,即将单片Web应用程序转换为微服务(每个服务都有自己的数据库).

此时,整体后端由NodeJS构成,并且能够回复REST请求.当我开始将应用程序拆分为多个服务时,我遇到了下一个问题:如何很好地进行它们之间的通信?

首先,我尝试在下一个示例中使用REST调用:"注册服务"将有趣的东西插入其数据库,然后将用户信息转发(HTTP POST)到"用户服务",以便将其保存到"用户"数据库中.从这个例子我们有2个服务,因此有2个数据库.

我意识到这一刻并不是一个好的选择.因为我的"注册服务"取决于"用户服务".它们是一种耦合,这是微服务概念的反模式(从我读到的).

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

但是,发送给客户端的响应如何(谁向"注册服务"发出请求).根据第一个想法,我们可以发送"200,一切都好!" 或400.这不是问题.根据第二个想法,我们不知道消费者("用户服务")是否持久保存用户数据,那么我需要回复客户端?

我对Web应用程序的商店方面存在同样的问题.客户将他想要购买的产品发布到"订购服务".如果用户有足够的钱,这个需要检查他已经进入"用户服务"的虚拟货币然后将产品细节转发到"交付服务".如何通过完全隔离的服务实现这一目标?

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

我希望你们中的一些人能够启发我.

Ill*_*llI 5

汤姆建议了一个非常好的链接,其中投票最高的答案及其推理和解决方案是您可以信赖的答案。您的具体问题可能根源于注册服务和用户服务是分开的。也许他们不应该这样?

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


dec*_*283 5

使用科特迪瓦,它很摇滚!严重地。 https://github.com/dashersw/cote

在 time-service.js 中...

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

timeService.on('time', (req, cb) => {
    cb(new Date());
});
Run Code Online (Sandbox Code Playgroud)

在 client.js 中...

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

client.send({ type: 'time' }, (time) => {
    console.log(time);
});
Run Code Online (Sandbox Code Playgroud)