API 版本控制策略的 4 个最佳实践
使用 API 网关进行批量请求处理
批处理请求处理是一种在 Web 开发中提高 API 性能的强大技术。它允许将多个 API 请求合并为一个单独的 HTTP 请求/响应周期,从而减少客户端与服务器之间的往返次数。客户端的一个请求可以被转换成多个后端服务器的请求,最终将响应聚合为一个统一的客户端响应。
本文将探讨如何在 Apache APISIX 中实现批量请求处理,并讨论这种技术的潜在用例及其带来的好处。
为什么要使用批量请求处理?
当客户端向服务器发送多个 API 请求时,每个请求都需要一个单独的 HTTP 请求/响应周期。这种做法可能会导致延迟增加、性能下降和服务器负载增加。通过将多个请求合并为一个批处理请求,可以显著减少 HTTP 请求/响应周期的数量,从而提高性能并降低延迟。
批处理请求处理特别适用于以下场景:
- 从数据库中检索多条记录:一次性请求多条记录,而不是对每条记录分别进行请求。
- 更新数据库中的多条记录:将多个更新操作合并为一个请求,减少对数据库的访问次数。
- 执行多个 API 请求以完成任务:将多个 API 操作合并为一个批处理请求,提高操作效率和响应速度。
批量请求处理的真实示例
示例 1: 社交媒体应用程序
在传统方法中,您需要为以下操作发出多个 API 请求:
- 检索用户的好友列表。
- 对于每个好友,检索他们的最新帖子。
使用批处理请求处理,您可以将这些请求合并为一个批处理请求。这样,您可以一次性获取所有朋友的帖子,减少延迟和提高性能。
示例 2: 移动应用程序
对于产品列表的填充,您通常需要发出以下多个请求:
- 检索产品 ID 列表。
- 对于每个产品 ID,检索产品详细信息。
通过批处理请求,您可以将所有产品 ID 的详细信息请求合并为一个批处理请求,从而提高数据检索效率。
示例 3: 会议管理应用程序
在会议管理应用程序中,如果您需要显示演讲者的会话和主题,您可能会遇到以下情况:
- 从
/speaker/{speakerId}/sessions
获取会话信息。 - 从
/speaker/{speakerId}/topics
获取相关主题信息。
使用批处理请求,您可以将这两个请求合并为一个单一的请求,以获取所有会话和主题信息,从而减少请求次数和提升用户体验。
使用 Apache APISIX API 网关进行批量请求处理
在 Apache APISIX 中实现批量请求处理可以使用 batch-requests
插件。该插件允许在单个请求有效负载中定义一组 API 请求。每个请求可拥有自己的 HTTP 方法、URL 路径、标头集和有效负载。以下是如何使用该插件的示例:
假设有一个用于会议管理的 Web 应用程序,系统中有多个演讲者,需要在单个网页上显示演讲者的会话和相关主题。使用 batch-requests
插件可以将所有这些请求分组到一个 HTTP 请求中。以下是 curl
命令发送批量请求的示例:
curl -i http://{API_GATEWAY_HOST_ADDRESS}/speaker -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'
收到批量请求后,batch-requests
插件将解析负载,并并行执行每个请求。插件会将每个请求的响应聚合,并以单个 HTTP 响应的形式返回给客户端。
批量请求插件演示
在使用 batch-requests
插件之前,需要先安装 Apache APISIX。
先决条件
- Docker:用于安装容器化的 etcd 和 APISIX。
- curl:用于向 APISIX Admin API 发送请求。也可以使用 Postman 等工具与 API 进行交互。
可以使用以下快速启动脚本轻松安装和启动 APISIX:
curl -sL https://run.api7.ai/apisix/quickstart | sh
配置后端服务(上游)
需要为请求路由到的会议 API 配置后端服务。这可以通过 Admin API 在 Apache APISIX 中添加一个上游服务器来实现。
curl http://127.0.0.1:9180/apisix/admin/upstreams/1 -X PUT -d '
{
"name": "Conferences API upstream",
"desc": "Register Conferences API as the upstream",
"type": "roundrobin",
"scheme": "https",
"nodes": {
"conferenceapi.azurewebsites.net:443": 1
}
}'
为批处理 API 创建路由
需要创建一个新路由,该路由拦截对公共虚拟端点的请求,并使用插件进行批处理。
curl http://127.0.0.1:9180/apisix/admin/routes/a -X PUT -d '
{
"uri": "/speaker",
"plugins": {
"public-api": {
"uri": "/apisix/batch-requests"
}
}
}'
为演讲者的主题和会话端点创建路由
接下来,为演讲者的主题和会话端点(及路径匹配)创建另一个路由,以便 API 网关从批处理请求中提取的单个请求被转发到会议 API 端点,并引用现有的上游服务。
curl http://127.0.0.1:9180/apisix/admin/routes/b -X PUT -d '
{
"methods": ["GET"],
"uris": ["/speaker/*/topics","/speaker/*/sessions"],
"plugins": {
"proxy-rewrite":{
"host":"conferenceapi.azurewebsites.net"
}
},
"upstream_id":"1"
}'
注意,这里使用了另一个代理重写插件,并为会议 API 隐式指定了主机地址。否则,API 网关将进行 DNS 转换,并通过其 IP 地址请求会议 API。
测试批处理请求处理
以下是如何在 APISIX 中使用 batch-requests
插件的示例:
curl -i http://127.0.0.1:9080/speaker -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'
在此示例中,为端点定义了路由,该端点支持通过 batch-requests
插件进行批量请求处理。该插件配置了一组两个请求,每个请求按 ID 检索包含主题和会话的演讲者记录。如果运行此命令,将从 API 网关返回合并响应:
[
{
"body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Microsoft\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/8/sessions\"\r\n }\r\n ]\r\n },\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"Mobile\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/sessions\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/topic/10/sessions\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}",
"status":200,
"headers":{
"Expires":"-1",
"Connection":"keep-alive",
"Pragma":"no-cache",
"Content-Length":"953",
"Server":"APISIX/3.2.0",
"Content-Type":"application/vnd.collection+json",
"X-AspNet-Version":"4.0.30319",
"Cache-Control":"no-cache",
"X-Powered-By":"ASP.NET"
},
"reason":"OK"
},
{
"body":"{\r\n \"collection\": {\r\n \"version\": \"1.0\",\r\n \"links\": [],\r\n \"items\": [\r\n {\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206\",\r\n \"data\": [\r\n {\r\n \"name\": \"Title\",\r\n \"value\": \"\\r\\n\\t\\t\\tjQuery Mobile and ASP.NET MVC\\r\\n\\t\\t\"\r\n },\r\n {\r\n \"name\": \"Timeslot\",\r\n \"value\": \"05 December 2013 09:00 - 10:00\"\r\n },\r\n {\r\n \"name\": \"Speaker\",\r\n \"value\": \"Scott Allen\"\r\n }\r\n ],\r\n \"links\": [\r\n {\r\n \"rel\": \"http://tavis.net/rels/speaker\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/speaker/16\"\r\n },\r\n {\r\n \"rel\": \"http://tavis.net/rels/topics\",\r\n \"href\": \"https://conferenceapi.azurewebsites.net/session/206/topics\"\r\n }\r\n ]\r\n }\r\n ],\r\n \"queries\": [],\r\n \"template\": {\r\n \"data\": []\r\n }\r\n }\r\n}",
"status":200,
"headers":{
"Expires":"-1",
"Connection":"keep-alive",
"Pragma":"no-cache",
"Content-Length":"961",
"Server":"APISIX/3.2.0",
"Content-Type":"application/vnd.collection+json",
"X-AspNet-Version":"4.0.30319",
"Cache-Control":"no-cache",
"X-Powered-By":"ASP.NET"
},
"reason":"OK"
}
]
要点
使用 API Gateway 进行批量请求处理是一种提升 API 性能的有效技术。Apache APISIX 提供了一个名为 batch-requests
的插件,方便开发者实现批量请求处理。
最后
使用 API Gateway 还可以在响应数据中提供自定义聚合。通过 serverless-function
插件,可以执行自定义代码,合并来自后端服务的响应,并以不同的结构返回给 API 消费者。