API网关上的数据聚合

2024-01-18

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

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

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

Format 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。

Format 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 管理实现此聚合的参考,那就太好了。


这被称为API成分 https://microservices.io/patterns/data/api-composition.html or 前端的后端 https://microservices.io/patterns/apigateway.html。我想说使用 API 网关聚合数据很好,因为它允许您的 API 客户端使用更简单的 API 接口。实际映射将在 API 网关中完成。

然而,当您在一个 Web API 中将多个微服务链接在一起时,一项服务的失败将导致整个 Web API 失败。另一种(更复杂)的解决方案是创建一个专用的微服务,聚合来自其他微服务的数据集,并公开显示连接数据的单个 API。看 -CQRS https://microservices.io/patterns/data/cqrs.html图案。

有关如何在 Azure 中实现此操作的参考是使用 Azure API 管理进行 API 聚合 https://www.c-sharpcorner.com/blogs/api-aggregation-using-azure-apim.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

API网关上的数据聚合 的相关文章

随机推荐

  • 如何将数据点与理论联系起来?

    DataPoints public static final Integer input1 1 2 Theory Test public void test1 int input1 DataPoints public static fina
  • 重构这个基本代码,确定数字是否为数十、数百、数千等

    if n lt 100 x 10 else if n lt 1000 x 100 else if n lt 10000 x 1000 else if n 等等等等 对于此类问题 是否有一种简洁 可扩展的方法 我的大脑决定停止工作 var x
  • 挂钩容器请求 LDAP 用户角色的进程

    在我的应用程序中 我使用带有 LDAP 领域的基于表单的身份验证 对于授权 我使用数据库 据我了解 其工作原理如下 App gt user pass gt LDAP lt OK user exists gt ask for security
  • Ruby 检查可读性?

    有没有办法使检查的输出更具可读性 在 Perl 中 有Data Dumper这使得输出更容易阅读 ruby 标准库包含 PP Pretty Print 的缩写 它比标准检查更好地格式化结构 http www ruby doc org std
  • 如何确定目标MAC地址

    我的应用程序在 CentOS 5 5 上运行 我需要使用 libpcap API 发送原始数据包 pcap inject or pcap sendpacket 到特定的IP地址 如何确定 MAC 地址属于特定目标 看起来你想要的是ioctl
  • 内存屏障和 TLB

    内存屏障保证数据缓存的一致性 但是 它能保证TLB的一致性吗 我发现一个问题 在线程之间传递 MappedByteBuffer 时 JVM java 7 update 1 有时会因内存错误 SIGBUS SIGSEG 而崩溃 e g fin
  • javascript过滤数组多个条件

    我想简化对象数组 假设我有以下数组 var users name John email email protected cdn cgi l email protection age 25 address USA name Tom email
  • 访问查询错误(“from 子句中的语法错误”)

    consulta3 SELECT FROM Dept INNER JOIN Userinfo INNER JOIN Checkinout on Dept DeptName departamento where Dept Deptid Use
  • 修复 Google Chrome 上的蓝线

    我有以下 HTML div div aga ad gdas ga gs ds da dgs sd ds dg gdgsdgwa div div And CSS a b position absolute height 10px font s
  • 当进程尚未完成时 GetExitCodeProcess() 返回 1

    如果我创建一个进程和两个管道集 并且该进程在某个时间需要一些用户输入 则GetExitCodeProcess 从 Windows C API 总是返回1 作为示例 您可以使用 Windowstime命令 这将返回 The current t
  • 填充数据框中缺失的组合

    我的示例数据集 df lt data frame REGION c REGION A REGION A REGION B CATEGORY c A B B VALUE1 c 2 3 4 VALUE2 c 1 2 3 Result REGIO
  • Magento URL重写管理保留GET参数[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我经常使用 Magneto 的 URL 重写管理来重定向一堆页面 然而 URL 带有附属信息 即www mysite com aff 12
  • 移动网站 - 根本不滚动

    我到处搜索 我的网站没有固定的高度 没有固定的展示位置 它显示了我想要的视口 但仅此而已 它不会滚动或显示任何其他内容 我缺少什么 我已经尝试了各种溢出选项 但似乎没有任何效果 我会做以下 我首先会暂时禁用 删除样式表 以确保一切都像纯 h
  • Azure AD 身份验证中的访问令牌验证

    我能够在 Azure AD 身份验证中请求令牌 但问题是每当我更改 access token 中的最后一个字符时 它仍然在我的 API 中成功请求 我只是按照这个https mehmetkut com 2017 05 protect asp
  • 多个复选框值将显示在文本框中

    这是我的代码 div align center b A b div
  • 核心数据如何更新一条记录?

    我有一些对象是与对象用户一对一相关的图像 例如 Image User 现在我想做 当用户登录时 我向每个图像显示一个按钮以添加到收藏夹 当我单击此按钮时运行此代码 User user UserController sharedInstanc
  • ServiceStack:动态添加路由

    我还没有尝试过这个 但我希望每个模块 Silverlight 注册自己的路由 而不是将其添加到应用程序启动中 可以在应用程序启动后将路由添加到 AppHost 还是必须在配置步骤中立即注册它们 我正在考虑在启动时扫描所有程序集 并向AppH
  • 如何告诉 Grunt 在构建任务中不要缩小或连接 js 文件?

    我刚刚使用 Yeoman 搭建了一个 Angular 应用程序 我注意到build默认情况下 task 会执行几件事 包括缩小和连接 js 文件 我想要一个更简单的构建任务 不执行任何缩小或串联 而是只执行以下两件事 将我的 scss 编译
  • 尝试在 AWS Elastic Beanstalk Web 服务器(单实例)PHP 上配置 SSL 时出现问题

    我正在将客户的网站迁移到 AWS 我已配置所有内容并正常工作 但客户希望能够在该网站上接受付款 我遵循了几个关于如何使用 elastic beanstalk 让 SSL 工作的指南 目前 我已将其设置为使用源包 并在 ebextension
  • API网关上的数据聚合

    我正在研究微服务架构 我想聚合来自两个微服务的数据 例如 Frontend 调用 API Gateway API Gateway 调用两个微服务 Customer 和 Order 微服务 客户微服务返回客户详细信息 订单微服务返回客户订购的