如何使用api网关做服务编排?

author author     2023-05-01     204

关键词:

参考技术A

服务编排/数据聚合 指的是可以通过一个请求来依次调用多个微服务,并对每个服务的返回结果做数据处理,最终整合成一个大的结果返回给前端。

例如一个服务是“查询用户预定的酒店”,前端仅需要传一个订单ID,后端会返回整个订单的信息,包括用户信息、酒店信息和房间信息等。

这个服务背后可能对应着以下几个操作:

微服务架构上对功能做了解耦,使用服务编排可以快速从各类服务上获取需要的数据,对业务实现快速响应。总的来说,编排有以下几点优势:

Goku API Gateway (中文名:悟空 API 网关)是一个基于 Golang 开发的微服务网关,能够实现高性能 HTTP API 转发、服务编排、多租户管理、API 访问权限控制等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行 API 服务治理、提高 API 服务的稳定性和安全性。

Goku API Gateway支持一个编排API对应多个后端服务,每个后端服务的请求参数可以使用前端传入的参数,也可以在编排里自定义(写静态参数或从返回数据里获得)。每个后端服务的返回数据支持过滤、删除、移动、重命名、拆包和封包等操作;编排API能够设定编排失败时的异常返回。

Goku API Gateway 的社区版本(CE)同时拥有完善的使用指南和二次开发指南,内置的插件系统也能够让企业针对自身业务进行定制开发。

项目地址: https://github.com/eolinker/goku-api-gateway

官网地址: https://www.eolinker.com

我们将编排的整个操作放到网关进行,由网关对数据做处理与转换,这样无需对后端服务做改动。一个请求到达网关,网关调用多个后端服务,并且在网关上对各个服务的返回数据做处理(操作有过滤、移动、重命名、封包、拆包,后面会对各操作做详细解释),最后由网关将数据整合好返回给前端。

网关将编排过程中对 API的转发处理过程 (转发->获取返回数据->数据处理)称为一个 Step

添加一个转发服务,该服务为 查询订单详情API,配置相应的转发地址、传入的参数、对返回数据做何种处理等。

由于篇幅原因,后续的Step(查询用户详情、查询酒店详情、查询房间详情)就不一一展示了。

网关将编排过程中对 API的转发处理过程 (转发->获取返回数据->数据处理)称为一个 Step。

我们将处理查询订单详情API称为 Step1 ,其中Step1的返回数据有:用户ID、酒店ID、房间ID。同理,将查询用户信息这步称为 Step2 ,将查询酒店信息称为 Step3 ,将查询房间信息称为 Step4

传参规则:

以下为转发路径的传参写法:

Step2中需要接收Step1里返回的userID作为参数,同时需要接收前端传入的Authorization参数

在网关里Step2的请求参数配置如下所示,请求参数存在多个的话用换行表示:

1.查询订单详情的API,返回数据称为json1,内容如下:

2.查询用户详情的API,返回数据称为json2,内容如下:

3.查询酒店详情的返回数据,称为json3,内容如下:

4.查询房间详情的返回数据,称为json4,内容如下:

5.可以在每一个Step里对返回Json做处理,网关会将处理过的数据最后整合起来,再返回前端,例如这是通过网关返回的最终数据:

这里以查询酒店详情API的返回数据json3为例,讲解网关如何在编排过程中对返回数据做处理。

查询酒店详情API返回的原始数据如下:

从网关返回给前端的数据中截取酒店信息的数据如下:

从原始数据到处理后的数据需要经过以下操作:

字段黑名单的作用是排除某些字段,支持数组形式。

在网关的Step3里配置如下:

经过网关处理后,实际的返回数据如下,可以看到data对象里的id字段已经被过滤掉:

拆包是指将指定对象的内容提取出来作为该步骤(step)的返回结果。其中匹配目标只能为object,匹配目标为空时,结果为 ,可用于清除数据。

在网关的Step里配置如下:

经过网关处理后,实际的返回数据如下,可以看到data对象被拆开,最终数据仅保留了data对象里面的字段:

字段封包会将当前的数据整体打包为最终返回数据中的一个对象,不支持*,不支持数组。

在网关的Step里配置如下:

经过网关处理后,实际的返回数据如下,数据被整体打包为hotelinfo对象:

经过三个步骤,就可以将原始数据变成最终的数据。

本文仅列举了编排过程中部分数据处理的操作,如需了解更多编排细则,可通过文末给出的教程链接。

相关链接

如何使用 api 网关限制资源访问

】如何使用api网关限制资源访问【英文标题】:Howtorestrictresourceacesswithanapigateway【发布时间】:2020-11-2119:57:16【问题描述】:我正在实施一个简单的基于微服务的项目,但我在身份验证方面遇到了一些疑问。我的疑问更多是关于... 查看详情

API 网关如何通过自省验证访问令牌

】API网关如何通过自省验证访问令牌【英文标题】:HowAPIgatewayvalidatesaccesstokenviaintrospection【发布时间】:2020-05-2620:19:40【问题描述】:我发现一篇有趣的文章有这个插图:上面写着:API网关通过自省验证所有传入请求的访问令... 查看详情

如何在 .net api 网关中使用 gRPC 服务?

】如何在.netapi网关中使用gRPC服务?【英文标题】:HowtousegRPCservicein.netapigateway?【发布时间】:2021-04-1209:54:11【问题描述】:我想通过api网关使用gRPC服务。如何将它用于.netcore中的gRPC?用Ocelot能做到吗?【问题讨论】:您是否刚... 查看详情

开源微服务api网关,单核2万qps,今年最值得学习的开源项目

...大家有收获。第一部分:解决什么问题。什么是微服务API网关?API网关是上承前端用户,下接后端服务的咽喉之地,是所有客户端请求响应出入流量的必经之路。微服务API网关有什么用?它除了可以做最基础的反向代理之外,还... 查看详情

api网关是如何演化出来的?

 1.之前呢我们都使用单体架构,单体架构呢,简单可以理解,应用都部署在一个服务器上,业务逻辑和过滤器都打包在一个服务器上的。过滤器可以截获我们的一些请求,做一些安全过滤的工作。 2.现在我们过渡到微服... 查看详情

使用 nodeJs 构建网关

...了预期的格式,但是我从节点收到了一个错误,我不知道如何解 查看详情

如何使用 kong api 网关实现 oauth2?

】如何使用kongapi网关实现oauth2?【英文标题】:HowdoIimplementoauth2withkongapigateway?【发布时间】:2020-04-1604:22:50【问题描述】:我想为在laravel上运行的一堆微服务实现一个api网关。在网关前面有一个角度客户端,用户必须使用用户... 查看详情

如何使用 CloudFormation 为 API 网关 v2 websocket 连接设置 VPC

】如何使用CloudFormation为API网关v2websocket连接设置VPC【英文标题】:HowtosetVPCforAPIgatewayv2websocketconnectionusingCloudFormation【发布时间】:2019-11-0814:02:23【问题描述】:无法使用Cloudformation为websocket路由集成请求定义集成类型“VPC链接... 查看详情

用于 gRpc 服务的 API 网关

...中调用。我在SpringBoot应用程序中使用Zuul代理网关。我该如何实现呢?【问题讨论】:【参考方案1】:最后我检查了zuul不支持gRPC需要的http/2。【讨论】: 查看详情

使用 loopback4 创建 API 网关

...yusingloopback4【发布时间】:2021-05-3115:59:38【问题描述】:如何从另一个LB4应用程序调用我的loopback4api?让我解释一下,我创建了一个lb4应用程序作为微服务。我想创建网关并想在lb4网关应用程序中调用这个lb4微服务。因此,为此... 查看详情

如何在 api 网关架构中获取 JWT 令牌

】如何在api网关架构中获取JWT令牌【英文标题】:howtoobtainJWTtokeninaapigatewayarchitecture【发布时间】:2021-11-0621:26:12【问题描述】:目前正在做一些研究以设置具有oauth(jwt令牌)安全性的(azure)api网关。外部合作伙伴/应用程序向网关... 查看详情

如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?

】如何使用Ocelot在.NetCoreAPI网关中实现Windows身份验证,以便所有下游服务都可以访问IWindowsPrincipal?【英文标题】:HowtoimplementWindowsAuthenticationina.NetCoreAPIGatewayusingOcelotsothatalldownstreamservicescanaccessIWindowsPrincipal?【发布时间】:2021-1... 查看详情

带有 API 网关的微服务

...ateway部分不清楚。我的问题是,有谁知道请求路由部分是如何在Api中完成的网关?是否可以通过简单的if条件来完成[伪代码:if(keyword=="product")thenroute(" 查看详情

使用 Kubernetes 运行的服务的 API 网关?

】使用Kubernetes运行的服务的API网关?【英文标题】:APIgatewayforservicesrunningwithKubernetes?【发布时间】:2021-05-1009:29:07【问题描述】:我们的所有服务都使用Kubernetes运行。我们想知道部署我们自己的API网关的最佳做法是什么,我们... 查看详情

如何在 API 网关后面隐藏多个 websockets 服务?

】如何在API网关后面隐藏多个websockets服务?【英文标题】:HowtohidemultiplewebsocketsservicesbehindanAPIGateway?【发布时间】:2020-04-0423:29:04【问题描述】:我正在开发一个项目,该项目在API网关后面有多个微服务,其中一些公开了WebSocke... 查看详情

api网关如何工作?

API网关如何工作?在本文中阅读和探索API网关、其优势及其工作原理!鲁奇塔·瓦玛API网关是微服务架构的重要组成部分。API网关是一种软件模式,它放置在应用程序编程接口(API)或一组微服务之前,以促进传入请... 查看详情

如何在 Kubernetes 中选择 API 网关?

】如何在Kubernetes中选择API网关?【英文标题】:HowtochooseanAPIgatewayinKubernetes?【发布时间】:2019-08-2812:50:11【问题描述】:我们在微服务场景中使用Zuul作为API网关已经有一段时间了,最​​近我们决定迁移到Kubernetes并选择更云原... 查看详情

如何在 Spring Boot 应用程序中从 Api 网关(Zuul)调用外部服务(非 MSA)

】如何在SpringBoot应用程序中从Api网关(Zuul)调用外部服务(非MSA)【英文标题】:Howtocallexternalservice(NonMSA)fromApigateway(Zuul)inspringbootapplication【发布时间】:2018-04-1415:29:00【问题描述】:在我的SpringBoot微服务应用程序中,我在我... 查看详情