
API 版本控制策略的 4 個(gè)最佳實(shí)踐
當(dāng)客戶(hù)端向服務(wù)器發(fā)送多個(gè) API 請(qǐng)求時(shí),每個(gè)請(qǐng)求都需要一個(gè)單獨(dú)的 HTTP 請(qǐng)求/響應(yīng)周期。這種做法可能會(huì)導(dǎo)致延遲增加、性能下降和服務(wù)器負(fù)載增加。通過(guò)將多個(gè)請(qǐng)求合并為一個(gè)批處理請(qǐng)求,可以顯著減少 HTTP 請(qǐng)求/響應(yīng)周期的數(shù)量,從而提高性能并降低延遲。
批處理請(qǐng)求處理特別適用于以下場(chǎng)景:
在傳統(tǒng)方法中,您需要為以下操作發(fā)出多個(gè) API 請(qǐng)求:
使用批處理請(qǐng)求處理,您可以將這些請(qǐng)求合并為一個(gè)批處理請(qǐng)求。這樣,您可以一次性獲取所有朋友的帖子,減少延遲和提高性能。
對(duì)于產(chǎn)品列表的填充,您通常需要發(fā)出以下多個(gè)請(qǐng)求:
通過(guò)批處理請(qǐng)求,您可以將所有產(chǎn)品 ID 的詳細(xì)信息請(qǐng)求合并為一個(gè)批處理請(qǐng)求,從而提高數(shù)據(jù)檢索效率。
在會(huì)議管理應(yīng)用程序中,如果您需要顯示演講者的會(huì)話(huà)和主題,您可能會(huì)遇到以下情況:
/speaker/{speakerId}/sessions
獲取會(huì)話(huà)信息。/speaker/{speakerId}/topics
獲取相關(guān)主題信息。使用批處理請(qǐng)求,您可以將這兩個(gè)請(qǐng)求合并為一個(gè)單一的請(qǐng)求,以獲取所有會(huì)話(huà)和主題信息,從而減少請(qǐng)求次數(shù)和提升用戶(hù)體驗(yàn)。
在 Apache APISIX 中實(shí)現(xiàn)批量請(qǐng)求處理可以使用 batch-requests
插件。該插件允許在單個(gè)請(qǐng)求有效負(fù)載中定義一組 API 請(qǐng)求。每個(gè)請(qǐng)求可擁有自己的 HTTP 方法、URL 路徑、標(biāo)頭集和有效負(fù)載。以下是如何使用該插件的示例:
假設(shè)有一個(gè)用于會(huì)議管理的 Web 應(yīng)用程序,系統(tǒng)中有多個(gè)演講者,需要在單個(gè)網(wǎng)頁(yè)上顯示演講者的會(huì)話(huà)和相關(guān)主題。使用 batch-requests
插件可以將所有這些請(qǐng)求分組到一個(gè) HTTP 請(qǐng)求中。以下是 curl
命令發(fā)送批量請(qǐng)求的示例:
curl -i http://{API_GATEWAY_HOST_ADDRESS}/speaker -X POST -d \
'{
"pipeline": [
{
"method": "GET",
"path": "/speaker/1/topics"
},
{
"method": "GET",
"path": "/speaker/1/sessions"
}
]
}'
收到批量請(qǐng)求后,batch-requests
插件將解析負(fù)載,并并行執(zhí)行每個(gè)請(qǐng)求。插件會(huì)將每個(gè)請(qǐng)求的響應(yīng)聚合,并以單個(gè) HTTP 響應(yīng)的形式返回給客戶(hù)端。
在使用 batch-requests
插件之前,需要先安裝 Apache APISIX。
可以使用以下快速啟動(dòng)腳本輕松安裝和啟動(dòng) APISIX:
curl -sL https://run.api7.ai/apisix/quickstart | sh
需要為請(qǐng)求路由到的會(huì)議 API 配置后端服務(wù)。這可以通過(guò) Admin API 在 Apache APISIX 中添加一個(gè)上游服務(wù)器來(lái)實(shí)現(xiàn)。
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
}
}'
需要?jiǎng)?chuàng)建一個(gè)新路由,該路由攔截對(duì)公共虛擬端點(diǎn)的請(qǐng)求,并使用插件進(jìn)行批處理。
curl http://127.0.0.1:9180/apisix/admin/routes/a -X PUT -d '
{
"uri": "/speaker",
"plugins": {
"public-api": {
"uri": "/apisix/batch-requests"
}
}
}'
接下來(lái),為演講者的主題和會(huì)話(huà)端點(diǎn)(及路徑匹配)創(chuàng)建另一個(gè)路由,以便 API 網(wǎng)關(guān)從批處理請(qǐng)求中提取的單個(gè)請(qǐng)求被轉(zhuǎn)發(fā)到會(huì)議 API 端點(diǎn),并引用現(xiàn)有的上游服務(wù)。
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"
}'
注意,這里使用了另一個(gè)代理重寫(xiě)插件,并為會(huì)議 API 隱式指定了主機(jī)地址。否則,API 網(wǎng)關(guān)將進(jìn)行 DNS 轉(zhuǎn)換,并通過(guò)其 IP 地址請(qǐng)求會(huì)議 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"
}
]
}'
在此示例中,為端點(diǎn)定義了路由,該端點(diǎn)支持通過(guò) batch-requests
插件進(jìn)行批量請(qǐng)求處理。該插件配置了一組兩個(gè)請(qǐng)求,每個(gè)請(qǐng)求按 ID 檢索包含主題和會(huì)話(huà)的演講者記錄。如果運(yùn)行此命令,將從 API 網(wǎng)關(guān)返回合并響應(yīng):
[
{
"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 進(jìn)行批量請(qǐng)求處理是一種提升 API 性能的有效技術(shù)。Apache APISIX 提供了一個(gè)名為 batch-requests
的插件,方便開(kāi)發(fā)者實(shí)現(xiàn)批量請(qǐng)求處理。
使用 API Gateway 還可以在響應(yīng)數(shù)據(jù)中提供自定義聚合。通過(guò) serverless-function
插件,可以執(zhí)行自定義代碼,合并來(lái)自后端服務(wù)的響應(yīng),并以不同的結(jié)構(gòu)返回給 API 消費(fèi)者。
原文鏈接:Batch Request Processing With API Gateway
API 版本控制策略的 4 個(gè)最佳實(shí)踐
首次構(gòu)建 API 時(shí)的 10 個(gè)錯(cuò)誤狀態(tài)代碼以及如何修復(fù)它們
AI語(yǔ)音技術(shù)API開(kāi)啟智能交互的新時(shí)代
AI視頻營(yíng)銷(xiāo)API:智能化內(nèi)容創(chuàng)造與消費(fèi)互動(dòng)的新紀(jì)元
保護(hù)您的電子郵件安全:加密實(shí)戰(zhàn)指南
API 經(jīng)濟(jì)趨勢(shì)及推動(dòng) API 增長(zhǎng)的經(jīng)驗(yàn)教訓(xùn)
Python調(diào)用墨跡天氣API實(shí)踐指南
使用 PHP 進(jìn)行 Web 抓取的初學(xué)者指南
一文學(xué)會(huì) API 管理
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)