Microservices RESTAPI与AMQP

Microservices RESTAPI与AMQP,microservices,Microservices,什么时候使用RESTAPI而不是AMQP在内部微服务之间进行通信更好或更合理 我知道,使用RESTAPI,服务之间会更加分离,所以,我们可以说我们应该始终避免使用AMQP吗 什么时候内部沟通更好或更合理 使用RESTAPI而不是AMQP的微服务 这在很大程度上取决于您的业务/领域运营以及您需要什么。的确,在大多数情况下,2个微服务之间的大多数通信(或在大多数用例中)都将通过队列完成。在某些情况下,需要通过RESTAPI直接调用,或者是更好的选择。这取决于您的业务需求。我认为如果你想取得最好的结果

什么时候使用RESTAPI而不是AMQP在内部微服务之间进行通信更好或更合理

我知道,使用RESTAPI,服务之间会更加分离,所以,我们可以说我们应该始终避免使用AMQP吗

什么时候内部沟通更好或更合理 使用RESTAPI而不是AMQP的微服务

这在很大程度上取决于您的业务/领域运营以及您需要什么。的确,在大多数情况下,2个微服务之间的大多数通信(或在大多数用例中)都将通过队列完成。在某些情况下,需要通过RESTAPI直接调用,或者是更好的选择。这取决于您的业务需求。我认为如果你想取得最好的结果,你应该根据情况使用这两种方法。 例如,假设您有一个在线商店应用程序,您有4个微服务:

  • 产品微服务
  • 产品库存微服务
  • 支付微服务
  • 订单微服务
通过Rest API使用直接调用

例如,假设您希望完成订单并添加一种付款方法,您将使用该方法为购物车中的产品付款。例如,假设您使用信用卡付款。如果您的业务逻辑表明,在您关闭订单之前,信用卡必须有效,则需要从订单微服务调用支付微服务。此调用将以同步方式通过RESTAPI直接调用,RESTAPI将等待响应。在这种情况下,您需要等待响应,因为您的进一步逻辑取决于您的信用卡(付款方式)是否有效

在这种情况下,发布事件订单微服务并在支付微服务中侦听该事件将产生更多延迟、更复杂的事件处理逻辑和回滚场景。 有人可能会问一个问题:

如果支付微服务停机或无法访问该怎么办

在队列上使用直接调用或更复杂的操作并不重要。没有支付微服务,您无法继续/完成您的操作。在这种情况下,您可能会返回内部服务器错误或类似错误,并要求客户重试该操作。有时,一些微服务之间的耦合比其他微服务之间的耦合更高。这取决于微服务体系结构的设计和操作的复杂性

使用队列

大多数情况下,微服务之间的通信都可以通过队列完成。典型的例子是,如果你在网上商店创建了一个新产品。product micro服务创建一个包含该产品所有信息的产品。当产品被创建并存储在product micro service db中时,会发布一个类似“ProductCreatedEvent”的事件。products inventory micro service正在侦听事件“ProductCreatedEvent”,并将有关该产品的信息保存到Product inventory micro service db(如产品数量、每家店铺的可用性等)。在产品库存微服务将产品包含在其库存中之后,该产品就可以销售了。此时,客户可以将该产品放入购物车。回到产品的创造上来。事实上,当您创建一个产品时,它不必立即显示在库存中。从业务角度来看,您可以接受这样一种情况:您刚刚创建的产品(最终)出现在库存中,延迟时间为50毫秒、100毫秒、1秒10秒或10分钟。即使product inventory micro服务在产品创建期间关闭,它也不会停止产品创建操作。一旦product inventory micro服务启动并运行,它将处理“ProductCreatedEvent”,产品将可供销售

这两个操作示例被简化为一个可能存在不同用例的示例。当然,你可以用不同的方式来做,但想法是给你一个例子。您可以看到,这两个具有完全不同业务上下文的操作可以根据业务需求以两种不同的方式完成

我知道,使用RESTAPI,每个服务都会更加简化 另一方面,我们是否可以说我们应该始终避免使用AMQP


当然不是。使用微服务的分布式系统将有一些操作,这些操作将需要通过Rest API(某些其他协议,如SOAP(或其他协议))使用从微服务到微服务的直接调用。有时您需要有同步和阻塞调用。可能对于大多数操作和业务领域来说,这是一种罕见的情况,但当您需要时,将其作为一种选择仍然非常重要。您可以在这个答案中了解微服务如何相互通信。

Wow!谢谢你的回答!您能否编辑答案并为每个客户端请求包含检查AccessToken验证的部分?现在,我所有的微服务都在使用RESTAPI调用AuthServices检查客户端访问令牌验证,AuthServices将所有服务耦合到auth服务。问题是令牌仅位于auth services数据库上。有没有更好的方法来代替RESTAPI呢?Np,很高兴我能帮上忙。AccessToekn和身份验证处理是一个不同的主题,应该是一个单独的问题。在Stackoverflow上有很多关于这方面的问题,请检查其中的一些问题是否可以帮助您。如果不是,你可以就你的具体情况提出一个新问题@xargs,提前感谢:)