API 网关上的数据聚合

Posted

技术标签:

【中文标题】API 网关上的数据聚合【英文标题】:Aggregation of data on API Gateway 【发布时间】:2020-02-07 12:35:30 【问题描述】:

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

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

这是 API Gateway 使用 Ocelot 或 Azure API Management 从两个微服务聚合后返回的格式。

格式 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 管理实现此聚合,那就太好了。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

格式 1 可通过使用 Azure API 管理的 API 聚合实现,但格式 2 无法实现。您能否提供支持格式 2 的参考。我已经搜索过但无法获得。 @bippan 你有没有找到格式 2 的解决方案?我有类似的情况,到目前为止,我认为解决这个问题的最佳方法是在实际的微服务上实现这个逻辑,而不是在 BFF 上。然后,您将拥有一个直接映射到此内部端点的 BFF 端点。例如,如果我们想优化数据库查询以获取格式 2,则无法通过 API 网关聚合来实现。不过,此时我仍在集思广益;非常感谢您的反馈。

以上是关于API 网关上的数据聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

Nacos-sync实现多种服务注册与发现之间的服务聚合

三网快速充值话费通道源码

如何使用 Terraform 在 API 网关上启用 HEAD 方法

arcgis api 4.x for js 聚合效果图(附源码下载)

API 网关中的数据聚合 - Zuul