2017-09-26 100 views
1

我有两个微服务1)产品微服务2)签出微服务都是弹簧引导项目。在Checkout Microservice中,我应该获得所有我购买的产品,这意味着我的微服务应该STATEFUL知道以前发生了什么。请提供关于如何通过Kafka/RabbitMQ实现与异常事件源一样的状态的示例。但请详细建议架构,代码和示例,以详细了解如何在结帐服务​​中获取产品详细信息。如何在微服务中实现状态

+0

不,他们不必有状态。您是否尝试了解这意味着什么 - 有状态和无状态的服务? – cassandrad

+0

为什么你需要产品MS?为什么不按照会话管理用户界面上的产品选择,并且一旦用户决定进行结账,它将触发结帐MS并将选定的产品列表发送给MS? –

+0

@Amir_Af,你能分享一个实际的例子吗?你的意思是把所有的数据保存在用户界面(Jsp,Angular ..但不是控制器 - Java后端)?如果这是真的,那么如何相信这些数据是正确的。 ? –

回答

0

通过附加共享资源来制作有状态的微服务。在你的情况下,你附加或使用一个数据库,存储客户购买的所有产品。共享资源意味着数据库应该可以访问我的微服务的多个实例。如果一个微服务失败并且您必须启动另一个实例,那么数据不会丢失。如果您想通过同时运行多个实例来扩展微服务,这也有帮助。

它可像Asyncronous与卡夫卡事件源/ RabbitMQ的

您可以使用事件的多个微服务之间同步。例如,Product microservice发布Checkout microservice拾取的事件(ProductTitleChanged事件)以更新其状态(命令发布到UpdateProductTitle)。这是必要的,因为微服务将一些数据从一个数据复制到另一个数据以实现更大的恢复能力(即,即使另一个数据库处于关闭状态,也可以运行)。

但请建议架构,代码,比如详细说明如何获得产品细节Checkout服务

上有太多的层次太多的架构。我特别喜欢的是CQRSEvent sourcing。在这个架构中,一个微服务将事件持久存储到事件存储中。然后,其他微服务轮询事件存储并获取新发布的事件。通过这种方式,Checkout微服务可以获得所有与产品相关的事件(如ProductAddedToInventory,ProductChangedTitle,ProductChangedDescription等),并维护所有产品的本地列表,但仅包含与其相关的属性。因此,当Checkout微服务需要显示产品的标题时,它不会远程调用Inventory microservice,而是查询其本地数据库;这增加了resilience以及速度。

0

首先,微服务是细粒度的服务,按照设计,它们应该是无状态的。这有助于他们按照流程进行扩展,而不会造成任何状态的开销。 我的建议是:

  • 杠杆反应性微服务的方法来使用事件(在消息的形式)作为产品&结帐服务之间的通信的装置。例如,添加到购物车的物品会生成一个事件,Checkout服务可以通过监听队列来处理该事件。阅读更多关于反应式微服务的信息:Reactive Microservices
  • 两种产品&检出服务应该有自己的数据库来存储数据,这是微服务保持数​​据存储分离的另一个基本原则(尽管数据存储在多个地方 - DRY原理这里不适用)
  • 在通信方面,您可以使用服务之间的REST接口互相呼叫(借助任何API网关或类似解决方案进行安全或任何调解)
  • 您还可以引入ShoppingCart服务,它可以拥有自己的数据存储来存储购物车对象。实质上,具有自己的数据存储和共享状态的所有服务应保持最小限度,并且只能使用服务之间的REST接口访问。
  • 您可以使用如Couchbase,Redis的等等。通过Kbastani这里

看样实现共享会话的数据的缓存解决方案:Sample Microservices Code