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 用户数据
如何使用 Terraform 在 API 网关上启用 HEAD 方法