【问题标题】:How to achieve Statefullness in Microservices如何在微服务中实现有状态
【发布时间】:2018-03-08 00:29:04
【问题描述】:

我有两个微服务 1) 产品微服务 2) Checkout 微服务都是 Spring Boot 项目。在 Checkout Microservice 中,我应该得到我购买过的所有产品,这意味着我的微服务应该是 STATEFUL 以了解之前发生的事情。请提出有关如何实现状态的示例,它可以像使用 Kafka/RabbitMQ 的事件源异步一样。但请详细建议架构、代码、示例如何在结帐服务​​中获取产品详细信息。

【问题讨论】:

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

标签: microservices stateful


【解决方案1】:

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

它可以像 Kafka/RabbitMQ 的事件源异步一样

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

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

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

【讨论】:

    【解决方案2】:

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

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

    在此处查看 Kbastani 的示例实现:Sample Microservices Code

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 2020-02-29
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      相关资源
      最近更新 更多