我正在从事一个个人项目,该项目是将单体式 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/