当前位置: 首页 > 知识库问答 >
问题:

DDD/事件源,从另一个微服务获取数据?

秦涵映
2023-03-14

我想知道你是否能帮忙。我正在编写一个订单系统,目前已经实现了一个订单微服务来处理下订单。我正在使用DDD与事件源和CQRS。

订单服务本身接收生成事件的命令,实际的订单服务侦听自己的事件以创建读取模型(这里的想法是使用CQR,因此用于写入的命令和用于读取的查询)

执行上述操作后,我遇到了一个问题,可能只是我没有完全理解正确的方法。

一个订单实际上有依赖项,这意味着一个订单需要一个客户和一个产品。因此,我将为客户和产品提供两个额外的微服务。

为了简单起见,我想专注于客户(虽然我对产品有完全相同的问题,但我的想法是,如果我解决了客户问题,那么另一个问题也会自动解决)。

那么回到手头的问题上来。为了创建订单,订单需要一个客户(和产品),我目前在客户端上有customerId,因此向订单服务发送命令,我可以传递customerId。

我想保存订单中客户的姓名和地址。如何从订单服务中的客户服务中获取客户ID的姓名和地址?

我想总结一下,当一个服务的数据需要另一个服务的数据时,我如何才能获得这些数据。

订单服务是否会为接收客户记录创建事件?这将在系统中引入许多复杂性(更多事件)

微服务是不耦合的,因此订单服务不能仅仅调用客户的读取模型。

有人能帮我吗?

共有3个答案

袁亦
2023-03-14

当一个服务的数据需要另一个服务的数据时,我如何才能获得这些数据?

你复制它。

因此,在您的设计中,需要有一条消息,将数据从它所在的位置传输到它需要的位置。

这可能意味着订单服务订阅由客户服务发布的事件,并存储其所需信息的副本。也可能是订单服务查询一些API,这些API可以直接访问客户服务存储的数据。

对所需额外数据的查询可以是同步的,也可以是异步的——也许可以将工作推迟到获得所需的所有数据。

另一种可能性是重新设计系统,使您需要的业务功能与数据一起使用,移动功能或移动数据。为什么订购需要客户数据?客户服务可以代替做这项工作吗?订单应该拥有数据吗?

在跨多个服务分配工作的决定中存在一定的复杂性。分配系统的决定涉及权衡各种权衡。

陶高扬
2023-03-14

我的建议是在前端收集所需的数据并将其传递。您希望在订单中反规范化的相关客户详细信息将是一个价值对象。与订单行相关的产品数据(例如id、描述)也是如此。

让系统交互以检索数据并非不可能,但这确实在较低的级别上将它们耦合起来,这似乎是必要的。

沈茂
2023-03-14

如果您正在使用DDD,首先,请阅读有关有界上下文的信息。忘记微服务,它们只是实现策略。

现在回到你的问题。从客户聚合(在你的例子中是客户微服务)中发布这些事件:Customer注册的定义信息更新的自定义帐户删除的自定义地址更改的等。然后订阅你的订单服务(在你的例子中也是订单微服务中的应用程序服务)来监听所有上述事件。好吧,不是全部,只是订单需要什么。

嗯,答案可能会有所不同。我可以说,硬盘中的空间比内存便宜,或者从性能角度来看,数据库查询比网络调用更快。如果您的数据库主机(或服务器)有限,则不应使用微服务。此外,我会利用这些未使用的客户数据提出一些商业想法,例如列出所有从未订购过任何东西的客户,我会向他们发送一些报价,以发展我的业务。只是开玩笑。不要为微服务中未使用的数据感到烦恼。

 类似资料:
  • 我正在为我的API使用Spring Boot。我正在重写我的API,以采用微服务体系结构。 我有两门课: 1) 产品 2) 配料 我的代码: 以下是我的产品类别: 这是我的配料课: 在产品微服务中,我正在对成分微服务进行API调用: 但是,上面的getComponents()方法不起作用。 我的问题: 我想从Component microservice获取数据,但是,出现以下错误: “错误”:“内

  • 我正在计划一个使用事件源的微服务模型。为了实现高可伸缩性和高吞吐量处理能力,我将使用Kafka作为微服务的消息代理。 在这一点上,我有问题的实现模型,以能够拥有Kafka主题和分区的好处。我的模型需要满足一些要求: 微服务必须从message broker获取数据(post/patch/put/delete) 数据一致性是强制性的,如果实体A需要实体B的先前存在,则必须只存在实体A的指向实体B的有

  • 在使用RestTemplate从另一个服务获取数据时,我在postman中出错。 我有两种服务。第一个服务有userdetails实体类,第二个服务有posts实体类。这是邮局管理员的代码。 我在《邮递员》中看到了这个错误。 编辑-尝试@Pijotrek的解决方案后,我现在得到这个错误。 这是我的实体类、DAO和JPARepository 这是UserDetails的实体类 这是我一直从后控制器调

  • 我正在尝试创建一个简单的博客平台,同时了解有关DDD和微服务的更多信息,因此我想在此上下文中向您询问两个建议: < li >我在我的项目中假设的一个业务规则是,只有角色为< code > publicis 和< code>Administrator的用户才能创建帖子,但是由< code > publicis 创建的帖子在发布之前必须首先得到< code>Administrator的批准。在我的理解

  • 这里有一个案例:我有身份服务器、客户端应用程序和资源(API)。身份服务器在endpoint超文本传输协议://身份服务器: 8080/连接/用户信息上提供用户信息。如果您发送带有有效访问令牌的请求,您将获得有关用户的其他信息。如果我需要有关资源的这些信息,我将如何获得它。我有两个想法: 通过客户端获取用户信息。(客户端在userinfoendpoint上发送请求并获取信息,然后使用请求调用API

  • 我正在使用尤里卡发现服务器。我可以通过通过使用服务名从另一个微服务调用一个微服务,这对Eureka服务器是可见的。我听说在不久的将来将被弃用。 我还可以通过使用从另一个微服务调用一个微服务,但在本例中,我需要使用整个主机名。我不能叫他们服务名称。 是的,我可以从属性文件设置基本url,这样不需要重新启动jar,我们就可以更改基本url。如果我们这样做,那么我们可能不需要任何discovery服务器