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

API网关上的数据聚合

倪灿
2023-03-14

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

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

这是API网关使用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个答案

朱英范
2023-03-14

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

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

关于如何在Azure中实现这一点的参考是使用Azure API管理的API聚合。

 类似资料:
  • 我正在寻找一种在API网关中提供某种数据聚合的解决方案。我正在使用SpringCloudNetflixZuul作为API网关。我使用SpringBoot创建了3个微服务- 这里是Zuul配置- 在产品详细信息页面中,我需要打两个电话- 有没有办法对API网关进行一次调用,将上述两次调用的结果结合起来?这两个调用都给出JSON作为响应。

  • 我有一个返回一组文档(100)的查询。我想对这些应用一个聚合,因为这些是最相关的。当我尝试聚合时,它返回所有结果的聚合,而不是前100个结果的聚合。

  • 我正试图理解API网关和微服务聚合器模式之间的区别。 目前,从我对聚合器模式的理解来看,它是通过从各种微服务收集数据片段并返回一个聚合进行处理来实现的。 现在,API网关是聚合对单个微服务的调用的单一入口点。虽然这听起来可能与聚合器模式非常相似,但也有一些不同的特性。最重要的是,这个新服务不存储数据,而是负责API组合、请求路由和身份验证等新功能 我很想知道我的推理是否正确。 提前谢谢你!

  • 我在api网关中遇到了一个奇怪的lambda集成问题(尝试过的代理也是同样的问题) 无服务器apigateway安装程序:

  • 我目前正在使用Flink 1.0编写一个聚合用例,作为该用例的一部分,我需要获得过去10分钟内登录的api数量。 这我可以很容易地使用keyBy("api"),然后应用10分钟的窗口和doe sum(count)操作。 但问题是我的数据可能会出现混乱,所以我需要一些方法来获取10分钟窗口内的api计数。。 例如:如果相同的api日志出现在两个不同的窗口中,我应该得到一个全局计数,即2,而不是两个单

  • 我使用Lambda和API Gateway来构建API。而且,我读到AWS CloudFront支持IPv6。我想使用自定义域和我创建的证书与ACM要求的API网关。 但是,当我使用http://ready.chair6.net测试是否为CloudFront URL找到AAAA记录时,没有找到AAAA记录。