所有文章 > API开发工具 > 使用 API Gateway 链接 API 请求
使用 API Gateway 链接 API 请求

使用 API Gateway 链接 API 请求

随着集成的 API 数量不断增加,管理 API 交互的复杂性也变得愈加挑战。通过使用 API 网关,可以创建一系列 API 调用,将 API 工作流分解为更小、更易于管理的步骤。例如,在在线购物网站中,当客户搜索产品时,平台会向产品搜索 API 发送请求,然后向产品详细信息 API 发送请求以检索更多产品信息。本文将为 Apache APISIX API Gateway 创建一个自定义插件,以处理需要按顺序调用的客户端请求。

什么是链接 API 请求,为什么需要它?

链接 API 请求(也称为管道请求或顺序 API 调用)是一种在软件开发中管理 API 交互复杂性的技术。当一个任务需要多个 API 调用才能完成时,这种技术尤为重要。它类似于批量请求处理,但不同之处在于,管道请求通过一个请求触发一系列按定义顺序执行的 API 调用。序列中的每个 API 请求可以修改请求和响应数据,且来自一个 API 请求的响应将作为下一个 API 请求的输入。当客户端需要按照特定顺序执行一系列依赖的 API 请求时,管道请求尤为有用。

在管道的每个步骤中,可以对响应数据进行转换或操作,然后再传递到下一步。这种方法在需要对数据进行规范化、转换或筛选敏感数据时非常有效。它还能帮助减少整体延迟,例如,在等待一个 API 调用响应时进行另一个 API 调用,从而缩短完成工作流程所需的总时间。

自定义 Pipeline-Apache APISIX 请求插件

API 网关是实现该功能的理想位置,因为它能够拦截所有客户端请求并将其转发至目标。本文将使用 Apache APISIX,这是一款流行的开源 API 网关解决方案,内置了众多插件。不过,目前 APISIX 并不官方支持 pipeline-request 插件。为了实现相同功能,我们决定开发一个新的插件。GitHub 上有一个存储库,包含用 Lua 编写的源代码以及 pipeline-request 插件的说明。

通过此插件,可以指定按顺序调用的上游 API 列表,以处理单一客户端请求。每个上游 API 都能修改请求和响应数据,来自一个上游 API 的响应将作为输入传递给管道中的下一个上游 API。管道可以在 Route 配置中定义,同时可以设置管道中 API URL 的执行顺序。

以下是插件的一个使用示例。假设有两个 API:一个用于发出 GET 请求以检索信用卡信息,另一个用于接收 POST 请求正文中的响应数据,并在将响应返回给客户端之前筛选敏感数据(如信用卡号和到期日期)。因为信用卡 API 端点返回的信息包含不应对未经授权的各方公开的敏感数据。下图展示了数据流的整个过程:/credit_cards/filter

当客户端向 API 网关的信用卡 API 端点发出请求以检索信用卡信息时,API 网关会将请求转发至信用卡后端服务以获取数据。

若请求成功并返回数据,数据将传递到管道中的下一步,即安全服务。

从安全服务收到筛选后的响应后,API 网关将组合响应返回给客户端。

pipeline-request 插件演示

在本演示中,将使用 GitHub 上的现成演示项目,其中包含本教程所需的所有 curl 命令示例。无需使用 Docker compose.yml 文件进行额外配置,即可运行 APISIX 并启用自定义插件。

先决条件

  • Docker:用于安装容器化的 etcd 和 APISIX。
  • curl:用于向 APISIX Admin API 发送请求。也可以使用 Postman 等工具与 API 进行交互。

第 1 步:安装并运行 APISIX 和 etcd

在 fork 或 clone 项目后,从项目根目录运行,即可轻松安装 APISIX 和 etcd。请注意,配置文件中指定了一个卷。这将本地目录 挂载到 Docker 容器中,作为只读卷,与我们的文件及自定义插件实现一起使用。此设置允许在运行时向 APISIX 添加自定义插件(适用于使用 Docker 运行 APISIX 的情况)。

运行以下命令来启动 Docker 容器:

docker-compose up

在配置文件 docker-compose.yml 中,配置如下:

volumes:
- ./custom-plugins:/opt/apisix/plugins:ro

./custom-plugins 目录挂载到容器中的 /opt/apisix/plugins 目录。

第 2 步:使用 pipeline-request 插件创建第一个路由

APISIX 启动后,可以使用 cURL 命令向 APISIX Admin API 端点发送 HTTP PUT 请求,以创建第一个监听 URI 路径的路由 /routes/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"
}
]
}
}
}'

配置中最关键的部分是 "plugins" 部分,它指定了 "pipeline-request" 插件用于该 API 路由。插件配置包括一个 "nodes" 数组,定义了管道中 API 请求的执行顺序。在这里,可以定义一个或多个 API。

在这个示例中,管道包含两个节点:

  1. 第一个节点向 https://random-data-api.com/api/v2/credit_cards API 发送请求以检索信用卡数据。
  2. 第二个节点向 http://127.0.0.1:9080/filter 发送请求,以从信用卡信息中筛选出敏感数据。第二个 API 是一个使用 serverless-pre-function APISIX 插件的 serverless 函数,它作为后端服务,修改来自第一个 API 的响应。

第 3 步:使用 Serverless 插件创建第二个路由

接下来,配置一个 ID 为 2 的新路由,以处理管道中的请求,并启用 APISIX 的 serverless-pre-function 插件。我们将在此插件中指定一个 Lua 函数,该函数从上一个响应中检索请求正文,替换 credit_card_number 字段,并保持响应的其他部分不变。最后,函数将修改后的请求正文设置为当前响应正文,并将 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\")
-- 获取请求正文
local body = core.request.get_body()
-- 解码 JSON 正文
local decoded_body = cjson.decode(body)
-- 隐藏信用卡号
decoded_body.credit_card_number = \"****-****-****-****\"
core.response.exit(200, decoded_body)
end"
]
}
}
}'

第 4 步:测试设置

现在可以测试整体配置。使用以下 cURL 命令向端点发送 HTTP GET 请求:

curl http://127.0.0.1:9080/my-credit-cards

在第二步中配置的路由使用了带有两个节点的插件,该请求将触发管道从端点检索信用卡信息,利用端点过滤掉敏感数据,并将修改后的响应返回给客户端。查看输出结果:

{
"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 Gateway 功能。

原文链接:使用 API Gateway 链接 API 请求 – API7.ai

#你可能也喜欢这些API文章!