使用開(kāi)源 API 網(wǎng)關(guān)實(shí)現(xiàn)可伸縮 API
采用 Apache APISIX 的 API 主導(dǎo)架構(gòu)。
API 網(wǎng)關(guān)是一個(gè)單一節(jié)點(diǎn),提供對(duì) API 調(diào)用入口。網(wǎng)關(guān)聚合了所請(qǐng)求的服務(wù),并相應(yīng)傳回合適的響應(yīng)信息。為了令你的 API 網(wǎng)關(guān)有效地工作,設(shè)計(jì)一個(gè)可靠、高效且簡(jiǎn)潔地 API 至關(guān)重要。本文介紹一種設(shè)計(jì)風(fēng)格,但只要你理解其中的重點(diǎn)內(nèi)容,它就能解決你的相關(guān)問(wèn)題。
由 API 主導(dǎo)的方法
API 主導(dǎo)的方法是將 API 置于應(yīng)用程序和它們需要訪問(wèn)的業(yè)務(wù)能力之間的通信核心,從而在所有數(shù)字通道上一致地交付無(wú)縫功能。API 主導(dǎo)的連接是指使用一種可重用、且設(shè)計(jì)得當(dāng)?shù)?API 來(lái)連接數(shù)據(jù)和應(yīng)用程序的方法。
API 主導(dǎo)的架構(gòu)
API 主導(dǎo)的架構(gòu)是一種架構(gòu)方法,它著眼于實(shí)現(xiàn)重用 API 的最佳方式。它能解決以下問(wèn)題:
- 保護(hù) API,使外界無(wú)法在未授權(quán)情況下訪問(wèn) API
- 確保應(yīng)用程序能找到正確的 API 端點(diǎn)
- 限制對(duì) API 的請(qǐng)求次數(shù),從而確保持續(xù)的可用性
- 支持持續(xù)集成、測(cè)試、生命周期管理、監(jiān)控、運(yùn)維等等
- 防止錯(cuò)誤在棧間傳播
- 對(duì) API 的實(shí)時(shí)監(jiān)測(cè)和分析
- 實(shí)現(xiàn)可伸縮和靈活的業(yè)務(wù)能力(例如支持 微服務(wù) 架構(gòu))
API 資源路由
實(shí)現(xiàn)一個(gè) API 網(wǎng)關(guān),把它作為與所有服務(wù)通信的單一入口點(diǎn),意味著使用者只需要知道 URL 就能使用 API。將請(qǐng)求路由到相應(yīng)的服務(wù)端點(diǎn),并執(zhí)行相應(yīng)的功能是 API 網(wǎng)關(guān)的職責(zé)。
Image depicting the API routing traffic.
由于客戶端應(yīng)用程序不需要從多個(gè) HTTP 端點(diǎn)調(diào)用功能,這個(gè)辦法就減少了 API 使用者的操作復(fù)雜度。對(duì)每個(gè)服務(wù)來(lái)說(shuō),也不需實(shí)現(xiàn)一個(gè)單獨(dú)的層級(jí)去實(shí)現(xiàn)認(rèn)證、授權(quán)、節(jié)流和速度限制。大多數(shù)API 網(wǎng)關(guān),如開(kāi)源的 Apache APISIX,已經(jīng)包含了這些核心功能。
API 基于內(nèi)容的路由
基于內(nèi)容的路由機(jī)制也使用 API 網(wǎng)關(guān)根據(jù)請(qǐng)求的內(nèi)容進(jìn)行路由調(diào)用。例如,一個(gè)請(qǐng)求可能是基于 HTTP 請(qǐng)求的頭部?jī)?nèi)容或消息體被路由,而不只基于它的目標(biāo) URI。
考慮這樣一個(gè)場(chǎng)景:為了將負(fù)載在多個(gè)數(shù)據(jù)庫(kù)實(shí)例間均分,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行分區(qū)。當(dāng)記錄總數(shù)較大,單個(gè)數(shù)據(jù)庫(kù)實(shí)例難以管理負(fù)載時(shí),常常會(huì)用這個(gè)辦法。
還有一個(gè)更好的辦法,就是把記錄在多個(gè)數(shù)據(jù)庫(kù)實(shí)例間分散開(kāi)來(lái)。然后你實(shí)現(xiàn)多個(gè)服務(wù),每個(gè)不同的數(shù)據(jù)庫(kù)都有一個(gè)服務(wù),把一個(gè) API 網(wǎng)關(guān)作為訪問(wèn)所有服務(wù)的唯一入口。然后,你可以配置你的 API 網(wǎng)關(guān),根據(jù)從 HTTP 頭或有效載荷中獲得的密鑰,將調(diào)用路由到相應(yīng)的服務(wù)。
Image of the API gateway exposing a single customer.
在上面的圖表中,一個(gè) API 網(wǎng)關(guān)向多個(gè)客戶服務(wù)暴露一個(gè)單一的 /customers
資源,每個(gè)服務(wù)都有對(duì)應(yīng)的不同數(shù)據(jù)庫(kù)。
API 地理路由
API 地理路由解決方案根據(jù) API 調(diào)用的來(lái)源將其路由到最近的 API 網(wǎng)關(guān)。為了防止地理距離導(dǎo)致的延遲問(wèn)題(例如一個(gè)位于亞洲的客戶端調(diào)用了位于北美地區(qū)的 API),你可以在多個(gè)地區(qū)部署 API 網(wǎng)關(guān)。對(duì)于一個(gè) API 網(wǎng)關(guān),你可以在每個(gè)區(qū)域使用不同的子域名,讓應(yīng)用程序基于業(yè)務(wù)邏輯選擇最近的網(wǎng)關(guān)。因此 API 網(wǎng)關(guān)就提供了內(nèi)部負(fù)載均衡,確保進(jìn)入的請(qǐng)求分布于可用的實(shí)例之間。
Image of a DNS traffic management system.
通常使用 DNS 流量管理服務(wù)和 API 網(wǎng)關(guān),針對(duì)該區(qū)域的負(fù)載均衡器解析子域名,定位到距離最近的網(wǎng)關(guān)。
API 聚合器
這項(xiàng)技術(shù)對(duì)多個(gè)服務(wù)執(zhí)行操作(例如查詢),并向客戶端服務(wù)以單個(gè) HTTP 響應(yīng)的形式返回結(jié)果。API 聚合器使用 API 網(wǎng)關(guān)在服務(wù)器端代表使用者來(lái)執(zhí)行這項(xiàng)工作,而非讓客戶端程序多次調(diào)用 API。
假定你有一款移動(dòng)端 APP,對(duì)不同的 API 發(fā)起多次調(diào)用。這增加了客戶端代碼的復(fù)雜性,導(dǎo)致網(wǎng)絡(luò)資源的過(guò)度使用,而且由于延遲性,用戶體驗(yàn)也不好。網(wǎng)關(guān)可以接收所有需要的信息,可以要求認(rèn)證和驗(yàn)證,并理解來(lái)自每個(gè) API 的數(shù)據(jù)結(jié)構(gòu)。它也可以傳遞響應(yīng)的有效載荷,因此它們也會(huì)作為一個(gè)用戶需要的統(tǒng)一負(fù)載傳回移動(dòng)端。
Image of an API gateway.
API 集中認(rèn)證
在這種設(shè)計(jì)中,API 網(wǎng)關(guān)就是一個(gè)集中式認(rèn)證網(wǎng)關(guān)。作為一個(gè)認(rèn)證者,API 網(wǎng)關(guān)在 HTTP 請(qǐng)求頭中查找訪問(wèn)憑據(jù)(例如不記名的令牌)。然后它借助于身份驗(yàn)證提供方執(zhí)行驗(yàn)證憑據(jù)的業(yè)務(wù)邏輯。
Image of a tree showing API gateway's centralized authentication.
使用 API 網(wǎng)關(guān)的集中式身份驗(yàn)證能解決很多問(wèn)題。它完全取代了應(yīng)用程序中的用戶管理模塊,通過(guò)對(duì)來(lái)自客戶端應(yīng)用程序的身份驗(yàn)證請(qǐng)求的快速響應(yīng)來(lái)提高性能。Apache APISIX 提供了一系列插件,支持不同的 API 網(wǎng)關(guān)認(rèn)證方法。
Image showing Apache ASPISIS and various plugins.
API 格式轉(zhuǎn)換
API 格式轉(zhuǎn)換是通過(guò)同一傳輸方式將有效載荷從一種格式轉(zhuǎn)換為另一種格式的能力。例如,你可以通過(guò) HTTPS 從 XML/SOAP 格式轉(zhuǎn)換為 JSON 格式,反之亦然。API 網(wǎng)關(guān)提供了支持 REST API 的功能,可以有效地進(jìn)行負(fù)載和傳輸?shù)霓D(zhuǎn)換。例如,它可以把消息隊(duì)列遙測(cè)傳輸(MQTT)轉(zhuǎn)換為 JSON 格式。
Image depicting APISIX transfers.
Apache APISIX 能夠接收 HTTP 請(qǐng)求,對(duì)其進(jìn)行代碼轉(zhuǎn)換,然后將其轉(zhuǎn)發(fā)給 gRPC 服務(wù)。它通過(guò) gRPC Transcode 插件獲取響應(yīng)并將其以 HTTP 格式返回給客戶端。
API 的可觀察性
現(xiàn)在,你知道 API 網(wǎng)關(guān)為進(jìn)入各種目的地的流量提供了一個(gè)中心控制點(diǎn)。但它也可以是一個(gè)中心觀察點(diǎn),因?yàn)榫捅O(jiān)控客戶端和服務(wù)器端的流量來(lái)說(shuō),它有獨(dú)特的資格。為了收集監(jiān)測(cè)工具所需要的數(shù)據(jù)(結(jié)構(gòu)化日志、度量和跟蹤),你可以對(duì) API 網(wǎng)關(guān)作出調(diào)整。
Apache APISIX 提供了 預(yù)先構(gòu)建的連接器,因此你可以跟外部監(jiān)測(cè)工具結(jié)合使用。你可以利用這些連接器從你的 API 網(wǎng)關(guān)收集日志數(shù)據(jù),進(jìn)一步獲得有用的指標(biāo),并獲取完整可見(jiàn)的服務(wù)使用情況。
API 緩存
API 緩存通常在網(wǎng)關(guān)內(nèi)部實(shí)現(xiàn)。它可以減少對(duì)端點(diǎn)的調(diào)用次數(shù),同時(shí)通過(guò)緩存上游的響應(yīng),改進(jìn)了請(qǐng)求延遲的情況。如果網(wǎng)關(guān)緩存對(duì)請(qǐng)求資源有一個(gè)新副本,它會(huì)直接使用這個(gè)副本來(lái)響應(yīng)這個(gè)請(qǐng)求,而不必對(duì)端點(diǎn)發(fā)出請(qǐng)求。如果緩存數(shù)據(jù)不存在,就將請(qǐng)求傳到目標(biāo)上游服務(wù)。
Image depicting how the API gateway cache functions.
API 錯(cuò)誤處理
由于各種原因,API 服務(wù)可能會(huì)出錯(cuò)。在這種情況下,API 服務(wù)需要有一定的彈性,來(lái)應(yīng)對(duì)可預(yù)見(jiàn)的錯(cuò)誤。你也希望確保彈性機(jī)制能正常工作。彈性機(jī)制包括錯(cuò)誤處理代碼、斷路器、健康檢查、回退、冗余等等。新式的 API 網(wǎng)關(guān)支持各種常見(jiàn)錯(cuò)誤處理功能,包括自動(dòng)重試和超時(shí)設(shè)置。
Image depicting some of the many mechanisms that the modern API Gatway can support.
API 網(wǎng)關(guān)作為一個(gè)協(xié)調(diào)器,它會(huì)根據(jù)各方面情況來(lái)決定如何管理流量、將負(fù)載均衡發(fā)送到一個(gè)健康的節(jié)點(diǎn),還能快速失敗。當(dāng)有異常狀況,它也會(huì)向你發(fā)出警示。API 網(wǎng)關(guān)也保證路由和其他網(wǎng)絡(luò)級(jí)組件能協(xié)同將請(qǐng)求傳給 API 進(jìn)程。它能幫助你在早期檢測(cè)出問(wèn)題,并修復(fù)問(wèn)題。網(wǎng)關(guān)的錯(cuò)誤注入機(jī)制(類似于 Apache APISIX 使用的那種)可用于測(cè)試應(yīng)用程序或微服務(wù) API 在各種錯(cuò)誤發(fā)生時(shí)的彈性。
API 版本管理
版本管理是指定義和運(yùn)行多個(gè)并發(fā)的 API 版本的功能。這點(diǎn)也很重要,因?yàn)?API 是隨著時(shí)間推移不斷改進(jìn)的。如果能對(duì) API 的并發(fā)版本進(jìn)行管理,那么 API 使用者就可以較快地切換到新的版本。這也意味著較老的版本可以被廢棄并最終退役。API 也跟其他應(yīng)用程序類似,無(wú)論是開(kāi)發(fā)新功能還是進(jìn)行錯(cuò)誤修復(fù),都存在演變的過(guò)程。
Image of using the API Gateway to implement API versioning.
你可以使用 API 網(wǎng)關(guān)來(lái)實(shí)現(xiàn) API 版本管理。版本管理可以是請(qǐng)求頭,查詢參數(shù)或路徑。
APISIX 的網(wǎng)關(guān)
如果你需要令 API 服務(wù)可伸縮,就需要使用 API 網(wǎng)關(guān)。Apache APISIX 提供了必要的功能,可以實(shí)現(xiàn)健壯的入口,它的好處是顯而易見(jiàn)的。它遵循 API 主導(dǎo)的架構(gòu),并且有可能改變客戶端與托管服務(wù)交互的方式。
本文經(jīng)作者許可,從 Apache APISIX 博客改編并轉(zhuǎn)載。