调用依赖微服务



假设我有两个微服务:Service1和Service2。它们中的每一个都有自己的数据库。服务1具有实体A,服务2具有实体B

EntityA {
Long id;
//other fields
EntityB entity;
}
EntityB{
//other fields
}

我使用Spring的RestTemplate来检索和保存数据。问题是:当从Service1的数据库中检索EntityA时,我没有EntityB的数据,因为它们保存在Service2的数据库中,我知道我应该通过RestTemplate进行rest调用,从Service2的db中检索EntityB,但实体之间的关系呢?即使EntityA的字段在除id之外的大部分时间都为null,EntityA是否仍应包含整个EntityB对象?我错过了什么?提前谢谢。

从技术角度来看,您的问题可以通过API网关解决。

简而言之,您应该定义一个新的微服务,比如gateway service,它将由您的API客户端调用。gateway service会:

  1. 调用Service1以获得Entity1以及Entity2id
  2. 根据步骤1中的id调用Service2以获取Entity2
  3. 聚合两个响应(在您的情况下,在Entity1中设置Entity2值(
  4. 将聚合响应返回给客户端

设计时需要记住两件事:

  • 您的API客户端不应该知道他的数据是由两个服务获取的
  • 在网关中聚合客户端响应通常更干净,因为它允许在微服务之间进行更高级别的解耦。例如,您可以按如下方式对实体进行建模(并删除Service1Service2之间的数据模型依赖关系,允许这两个服务独立发展(

请参阅以下片段:

// In Service1
EntityA {
Long bId; 
}
// In Service2
EntityB{
}
// In Gateway
Response {
EntityA a;
EntityB b;
}

Entity1是否应参考Entity2的决定并不取决于您的数据分布方式,而是取决于您自己的业务需求。如果您有一个单片应用程序,并且在这种情况下Entity1引用Entity2是有意义的,那么在微服务环境中这样做仍然有意义。

我想到的两个解决方案同时简单又复杂。

重复数据

在MS之间,通常有一个高可用的pub-sub或消息队列集群系统。当EntityB保存在Service2中时,您会将事件发送到队列或发布子系统中。CCD_ 19可以订阅该特定事件并将关于CCD_ 20的信息存储在其自己的数据库中。

组域逻辑

可能是Service1Service2的结构域相关性太大。在这种情况下,您可能希望将您的服务分组为一个服务。

我遇到了这种模式,我认为它对您的情况很有用
该模式被称为CQRS(命令查询责任分离,一口(

该模式假设您有一个事件源系统,自从您使用微服务以来,这个系统发生了很大的变化。

Service1中的任何EntityA发生更改时,Services1ervice2也是如此,当任何EntityB更改时,它也将发布一个事件。

然后我们有Service3,它订阅来自Services1Service2的事件,聚合数据并将其存储在本地数据库中。现在,您所要做的就是调用Service3以从Services1Service2获取协议数据。

当然,这种模式也有其不利之处,比如最终的一致性,但在某些情况下,它实际上可能是最适合的。

这个想法主要来自这里:https://microservices.io/patterns/data/cqrs.html.我还将从这里至少阅读"何时使用此模式"部分:https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs

相关内容

  • 没有找到相关文章

最新更新