12

我正在研究微服务架构,我想聚合来自两个微服务的数据。

例如,前端调用 API 网关,API 网关调用两个微服务 Customer 和 Order 微服务。客户微服务返回客户详细信息,订单微服务返回客户订购的所有产品。

这是使用 Ocelot 或 Azure API 管理从两个微服务聚合后 API 网关返回的格式。

格式 1

{ 
   "Customers":[ 
      { 
         "customerId":1001,
         "customerName":"Tom"
      },
      { 
         "customerId":1002,
         "customerName":"Jerry"
      }
   ],
   "Orders":[ 
      { 
         "CustomerId":1001,
         "Orders":[ 
            { 
               "ProductId":"PRO1",
               "ProductName":"Books"
            },
            { 
               "ProductId":"PRO2",
               "ProductName":"Pens"
            }
         ]
      },
      { 
         "CustomerId":1002,
         "Orders":[ 
            { 
               "ProductId":"PRO3",
               "ProductName":"Pencils"
            },
            { 
               "ProductId":"PRO4",
               "ProductName":"Toys"
            }
         ]
      }
   ]
}

我想要的格式是格式 2。

格式 2

{
   "OrderDetails":[
      {
         "customerId":1001,
         "customerName":"Tom",
         "Orders":[
            {
               "ProductId":"PRO1",
               "ProductName":"Books"
            },
            {
               "ProductId":"PRO2",
               "ProductName":"Pens"
            }
         ]
      },
      {
         "customerId":1002,
         "customerName":"Jerry",
         "Orders":[
            {
               "ProductId":"PRO3",
               "ProductName":"Pencils"
            },
            {
               "ProductId":"PRO4",
               "ProductName":"Toys"
            }
         ]
      }
   ]
}

第二种格式可以使用 Ocelot 实现,但是数据的合并是基于网关上的 id 并且需要一些处理。

使用业务逻辑在网关上聚合数据是一种好习惯吗?如果不是这种聚合应该遵循什么做法?

如果您可以提供一些参考来使用 Azure API 管理实现此聚合,那就太好了。

4

1 回答 1

9

这称为API 组合Frontend 的后端。我想说使用 API Gateway 聚合数据很好,因为它允许您的 API 客户端使用更简单的 API 接口。实际映射将在 API Gateway 中完成。

然而,当你在一个 Web API 中将多个微服务链接在一起时,一个服务的失败将导致整个 Web API 失败。另一种(也是更复杂的)解决方案是创建一个专用的微服务,该微服务聚合来自其他微服务的数据集,并公开一个显示连接数据的 API。请参阅 - CQRS模式。

有关如何在 Azure 中实现此功能的参考是API Aggregation Using Azure API Management

于 2019-10-10T08:35:10.967 回答