Microservices 如何在微服务中实现状态完整性

Microservices 如何在微服务中实现状态完整性,microservices,stateful,Microservices,Stateful,我有两个微服务1)产品微服务2)结帐微服务都是spring boot项目。在Checkout Microservice中,我应该获得我购买的所有产品,这意味着我的Microservice应该有状态地知道以前发生了什么。请举例说明如何实现状态性,它可以像Kafka/RabbitMQ的事件源异步一样。但请详细建议体系结构、代码和示例如何在结帐服务中获取产品详细信息。通过附加共享资源,您可以创建一个有状态的微服务。在您的情况下,您附加或使用一个数据库来存储客户购买的所有产品。共享资源意味着数据库应该可

我有两个微服务1)产品微服务2)结帐微服务都是spring boot项目。在Checkout Microservice中,我应该获得我购买的所有产品,这意味着我的Microservice应该有状态地知道以前发生了什么。请举例说明如何实现状态性,它可以像Kafka/RabbitMQ的事件源异步一样。但请详细建议体系结构、代码和示例如何在结帐服务中获取产品详细信息。

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

它可以与Kafka/RabbitMQ的事件源异步

您可以使用事件在多个微服务之间进行同步。例如,
产品微服务
发布事件(
ProductTitleChanged
事件),该事件由
签出微服务
拾取以更新其状态(向
更新产品标题
发出命令)。这是必要的,因为微服务将一些数据从一个复制到另一个,以实现更大的弹性(即,即使另一个发生故障,一个也可以正常工作)

但请详细建议体系结构、代码和示例如何在结帐服务中获取产品详细信息


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

首先,微服务是细粒度服务,根据设计,它们应该是无状态的。这有助于它们作为进程进行扩展,而无需任何状态开销。 我的建议是:

  • 利用反应式微服务方法将事件(以消息的形式)用作产品和签出服务之间的通信手段。例如,添加到购物车的项目将生成一个事件,签出服务可以通过侦听队列来处理该事件。请在此处阅读有关反应式微服务的更多信息:
  • 产品和结帐服务都应该有自己的数据库来存储数据,这是microservices保持数据存储分离的另一个基本原则(即使数据存储在多个位置-DRY原则在这里不适用)
  • 在通信方面,您可以使用服务之间的REST接口相互调用(借助于任何API网关或类似的安全解决方案或任何中介)
  • 您还可以引入ShoppingCart服务,它可以有自己的数据存储来存储cart对象。本质上,所有具有自己的数据存储和共享状态的服务都应该保持最小,并且只能使用服务之间的REST接口进行访问
  • 您可以为共享会话数据(如Couchbase、Redis等)使用缓存解决方案

请参见Kbastani的示例实现:

不,它们不必是有状态的。您是否试图理解这意味着什么-有状态和无状态服务?为什么需要产品MS?为什么您不按会话管理UI上的产品选择,并且一旦用户决定进行签出,它将触发签出MS,并将所选产品列表发送到MS?@Amir\u Af,您可以分享一个工作示例吗?您的意思是在UI上保存所有数据(Jsp,Angular..,但不是控制器-Java后端)?如果这是真的,如何相信数据是正确的?你可以在网上找到例子。您想在BE中管理它(如您所说的控制器-可能使用Spring…)?我告诉你这不是正确的方法。由数据库管理产品MS是另一回事。我不确定我是否理解您关于数据的评论是否正确,您能解释一下\举个例子吗?