2017-01-13 62 views
3

我正在开发一个将单一的web应用程序转换为微服务的个人项目(每个服务都有自己的数据库)。互通微服务 - 如何?

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

首先我试图用REST调用下一个例子: “注册服务”,以坚持它插入有趣的事情到它的数据库,然后向前(HTTP POST)的用户信息的“用户服务”进入“用户”数据库。 从这个例子我们有2个服务,因此2个数据库。

我意识到在这个时刻这不是一个好选择。因为我的“注册服务”取决于“用户服务”。它们有些耦合,这是微服务概念的反模式(从我读到的内容来看)。

第二个想法是使用类似RabbitMQ的消息中介。 “注册服务”仍将有趣的事情插入到自己的数据库中,并将用户信息作为数据发布在队列中。 “用户服务”使用此消息并将数据保存到其“用户”数据库中。通过使用这个概念,这两种服务都是完全孤立的,并且可能是一个好主意。

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

我有与Web应用程序的商店端相同的问题。客户将他想购买的产品发布到“订购服务”。如果用户有足够的钱,这个人需要检查他已经进入“用户服务”的虚拟货币,然后将产品细节转发到“交付服务”。如何用完全隔离的服务做到这一点?

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

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

+0

阅读此:http://stackoverflow.com/questions/30213456/transactions-across-rest-microservices –

回答

0

Tom建议pretty good link,其中推理和解决方案的顶级答案是你可以依赖的答案。您的具体问题可能源于注册服务和用户服务是分开的事实。也许他们不应该?

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

0

谢谢你这个链接,

我的问题变成了一个新的架构。对于遇到同样问题的人,我有这样的感谢:

  • 把注册服务和用户服务放在一起。为什么?因为这一切都取决于用户信息(相同的数据库要求)这就是IlliakaillI给出的解决方案。

  • 将用户资金的管理分为仅存在于“订购服务”中的“钱包”。由于这一点,我们不需要在执行订单时检索用户信息,我们只需要检查钱包信息。 (I编码在JWT的用户名当用户进行认证,因此我可以在钱包使用的用户名作为外键识别哪个钱包被供应,或使用等)

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

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