了解如何使用开源 API 网关处理应按顺序调用的客户端请求,该网关将 API 工作流分解为更易于管理的步骤。
随着需要集成的 API 数量的增加,管理 API 交互的复杂性变得越来越具有挑战性。通过使用API 网关,我们可以创建一系列 API 调用,将 API 工作流程分解为更小、更易于管理的步骤。例如,在在线购物网站中,当客户搜索商品时,平台可以向商品搜索 API 发送请求,然后向商品详情 API 发送请求以检索有关商品的更多信息。在本文中,我们将为Apache APISIX API 网关创建一个自定义插件,以处理应按顺序调用的客户端请求。
什么是链接 API 请求,我们为什么需要它?
链接 API 请求(或管道请求,或顺序 API 调用)是软件开发中使用的一种技术,用于管理 API 交互的复杂性,其中软件需要多次 API 调用才能完成一项任务。它类似于批处理请求处理,您将多个 API 请求组合成一个请求,然后将它们作为批处理发送到服务器。虽然它们看起来很相似,但管道请求涉及向服务器发送单个请求,触发一系列 API 请求以定义的顺序执行. 序列中的每个 API 请求都可以修改请求和响应数据,一个 API 请求的响应将作为输入传递给序列中的下一个 API 请求。当客户端需要执行一系列必须按特定顺序执行的相关 API 请求时,管道请求会很有用。
在管道的每个步骤中,我们都可以在将响应数据传递到下一步之前对其进行转换或操作。这在需要将数据返回给客户端之前对其进行规范化或转换或过滤掉敏感数据的情况下很有用。它可以帮助减少整体延迟。例如,一个 API 调用可以在另一个 API 等待响应时调用,从而减少完成工作流所需的总时间。
Apache APISIX 的自定义管道请求插件
API 网关可以是实现此功能的正确位置,因为它可以拦截所有客户端应用程序请求并将它们转发到预期目的地。我们将使用Apache APISIX,因为它是一种流行的开源 API 网关解决方案,带有大量内置插件。但是,在撰写当前博文时,APISIX 还没有对管道请求插件的官方支持。通过了解APISIX 的自定义插件开发功能,我们决定引入一个可以提供相同功能的新插件。GitHub 上有一个 repo,其中包含用Lua 编程语言编写的源代码和pipeline-request 插件的描述。
使用此插件,您可以指定应按顺序调用的上游 API 列表,以处理单个客户端请求。每个上游 API 都可以修改请求和响应数据,并且来自一个上游 API 的响应作为输入传递给管道中的下一个上游 API。管道可以在路由配置中定义,您还可以在管道执行 API URL 时定义它们的顺序。
让我们通过一个例子来了解这个插件的用法。假设您有两个 API——一个发出 GET/credit_cards请求以检索信用卡信息,另一个在 POST 请求正文中接收先前的响应数据/filter,然后在返回之前过滤掉敏感数据(例如信用卡号和到期日期)对客户端的响应。因为信用卡 API 端点返回不应暴露给未授权方的敏感信息。下图说明了整体数据流:
- 当客户端向 API 网关的信用卡 API 端点请求检索所有信用卡信息时,API 网关转发请求以从信用卡后端服务检索信用卡数据。
- 如果请求成功并返回信用卡数据,则它传递给管道中的下一步安全服务
- 当从安全服务接收到过滤后的响应时,它将组合的响应返回给客户端。
管道请求插件演示
对于此演示,我们将利用GitHub 上另一个准备好的演示项目,您可以在其中找到本教程中使用的所有curl 命令示例,运行 APISIX 并启用自定义插件,而无需使用Docker compose .yml 文件进行额外配置。
先决条件
- Docker用于安装容器化的etcd和APISIX。
- curl用于向 APISIX Admin API 发送请求。您还可以使用Postman等简单工具与 API 进行交互。
第 1 步:安装并运行 APISIX 和 etcd
在 fork/clone项目docker compose up后,您可以通过从项目根文件夹运行来轻松安装 APISIX 和 etcd 。您可能会注意到文件中指定了一个卷。这将安装本地目录* * 我们的文件与自定义插件实现作为只读卷在 docker 容器中的路径。这允许在运行时将自定义插件添加到 APISIX(此设置仅适用于使用 docker 运行 APISIX 的情况)。./custom-plugins:/opt/apisix/plugins:rodocker-compose.yml./custom-pluginspipeline-request.lua/opt/apisix/plugins
第 2 步:使用 Pipeline-Request 插件创建第一个路由
APISIX 运行后,我们使用 cURL 命令将 HTTP PUT 请求发送到 APISIX Admin API/routes端点以创建我们的第一个侦听 URI 路径的路由/my-credit-cards。
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \ --header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ --header 'Content-Type: application/json' \ --data-raw '{ "uri":"/my-credit-cards", "plugins":{ "pipeline-request":{ "nodes":[ { "url":"https://random-data-api.com/api/v2/credit_cards" }, { "url":"http://127.0.0.1:9080/filter" } ] } } }'
配置的重要部分是“插件”部分,它指定“管道请求”插件应该用于此 API 路由。插件配置包含一个“节点”数组,它定义了应该在管道中执行的 API 请求的顺序。您可以在那里定义一个或多个 API。在这种情况下,管道由两个节点组成:第一个节点向https://random-data-api.com/api/v2/credit_cards ****API发送请求以检索信用卡数据,第二个节点节点向位于http://127.0.0.1:9080/filter的本地 API 发送请求,以从信用卡信息中过滤掉敏感数据。第二个 API 将只是一个使用serverless-pre-function 的无服务器函数APISIX 插件。它充当后端服务来修改来自第一个 API 的响应。
第 3 步:使用无服务器插件创建第二个路由
接下来,我们配置一个 ID 为 2 的新路由,用于处理对/filter管道中端点的请求。它还启用无服务器预函数APISIX 的现有插件,我们在其中指定应由插件执行的 Lua 函数。此函数只是从先前的响应中检索请求正文,替换信用卡号字段,并保持响应的其余部分不变。最后,它将当前响应主体设置为修改后的请求主体,并将 HTTP 200 响应发送回客户端。您可以修改此脚本以满足您的需要,例如使用解码后的主体执行进一步的处理或验证。
curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/2' \ --header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ --header 'Content-Type: application/json' \ --data-raw ' { "uri": "/filter", "plugins":{ "serverless-pre-function": { "phase": "access", "functions": [ "return function(conf, ctx) local core = require(\"apisix.core\") local cjson = require(\"cjson.safe\")-- Get the request body local body = core.request.get_body() -- Decode the JSON body local decoded_body = cjson.decode(body) -- Hide the credit card number decoded_body.credit_card_number = \"****-****-****-****\" core.response.exit(200, decoded_body); end" ] } } }'
第 4 步:测试设置
现在是测试整体配置的时候了。使用以下 curl 命令,我们向端点发送 HTTP GET 请求http://127.0.0.1:9080/my-credit-cards。
curl http://127.0.0.1:9080/my-credit-cards
我们在第二步中配置了相应的路由来使用pipeline-request带有两个节点的插件,这个请求将触发管道从端点检索信用卡信息https://random-data-api.com/api/v2/credit_cards,使用端点过滤掉敏感数据http://127.0.0.1:9080/filter,并将修改后的响应返回给客户端。查看输出:
{ "uid":"a66239cd-960b-4e14-8d3c-a8940cedd907", "credit_card_expiry_date":"2025-05-10", "credit_card_type":"visa", "credit_card_number":"****-****-****-****", "id":2248 }
如您所见,它将请求正文中的信用卡号(实际上,它是链中第一个 API 调用的响应)替换为星号。
概括
到目前为止,我们了解到我们的 Apache APISIX API 网关自定义管道请求插件允许我们将一系列 API 调用定义为特定顺序的管道。我们还可以将这个新插件与现有插件结合使用,为我们的 API 端点启用身份验证、安全性和其他 API 网关功能。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.