什么是API網(wǎng)關(guān)?
大家好,我是猿java。
API 網(wǎng)關(guān)是什么?它有什么作用?為什么我們需要它?今天我們就來一起聊一聊。
一、定義
在維基百科中,網(wǎng)關(guān)的定義是這樣的:
在計(jì)算機(jī)網(wǎng)絡(luò)中,網(wǎng)關(guān)(英語:Gateway)是轉(zhuǎn)發(fā)其他服務(wù)器通信數(shù)據(jù)的服務(wù)器,接收從客戶端發(fā)送來的請求時(shí),它就像自己擁有資源的源服務(wù)器一樣對請求進(jìn)行處理。有時(shí)客戶端可能都不會(huì)察覺,自己的通信目標(biāo)是一個(gè)網(wǎng)關(guān)。
從定義可以看出,網(wǎng)關(guān)也是一組服務(wù)器,它位于客戶端和服務(wù)器之間,是客戶端請求進(jìn)入服務(wù)器的唯一入口,如下圖,API 網(wǎng)關(guān)提供 幾個(gè)重要的功能:
- 身份驗(yàn)證和安全策略實(shí)施;
- 負(fù)載均衡和斷路;
- 協(xié)議轉(zhuǎn)換和服務(wù)發(fā)現(xiàn);
- 監(jiān)控、日志記錄、分析和計(jì)費(fèi);
- 緩存;
二、典型流程分析
下面我們通過客戶端向服務(wù)器發(fā)起一個(gè)HTTP請求這個(gè)經(jīng)典的流程來講解API網(wǎng)關(guān)及其重要的功能。
第一步:客戶端向 API 網(wǎng)關(guān)發(fā)送請求
客戶端向服務(wù)器發(fā)起一個(gè)請求,該請求通常是基于 HTTP協(xié)議,它可以是 REST、GraphQL 或其他一些更高級別的抽象。如下圖:
第二步:API 網(wǎng)關(guān)驗(yàn)證 HTTP 請求
API網(wǎng)關(guān)收到客戶端的請求后,會(huì)對 HTTP請求中的參數(shù)等進(jìn)行校驗(yàn),如下圖:
第三步:IP 黑白名單校驗(yàn)
為了安全,可以在API網(wǎng)關(guān)設(shè)置IP黑白單,標(biāo)志允許和不允許訪問服務(wù)器的IP,API 網(wǎng)關(guān)根據(jù) IP黑白列表來允許和拒絕調(diào)用者的IP地址。如下圖:
同時(shí),API網(wǎng)關(guān)還可以針對IP 地址和 HTTP標(biāo)頭等屬性執(zhí)行基本的速率限制檢查。例如,它可以拒絕來自超過一定速率的 IP地址的請求。如下圖:
第四步:身份驗(yàn)證和授權(quán)
API 網(wǎng)關(guān)將 HTTP請求傳遞給身份提供商以進(jìn)行身份驗(yàn)證和授權(quán)。API 網(wǎng)關(guān)從提供商處接收經(jīng)過身份驗(yàn)證的會(huì)話,其中包含允許請求執(zhí)行的操作范圍。如下圖:
認(rèn)證是驗(yàn)證用戶或客戶端身份的過程,用于確認(rèn)一個(gè)實(shí)體是否為其所聲稱的那個(gè)實(shí)體。在API的上下文中,這意味著確保請求方是合法的用戶或客戶端,并且有權(quán)訪問所請求的資源或服務(wù)。
常見的認(rèn)證方式包括:
- 基本認(rèn)證(Basic Authentication):客戶端在請求頭中使用Base64編碼的用戶名和密碼進(jìn)行認(rèn)證。雖然簡單易用,但不是最安全的認(rèn)證方法,因?yàn)閼{據(jù)會(huì)以明文形式在請求中傳輸,容易被攔截和解碼。
- 令牌認(rèn)證(Token Authentication):客戶端在請求頭中使用特定的令牌(Token)進(jìn)行認(rèn)證。令牌通常由身份驗(yàn)證后的服務(wù)頒發(fā)給客戶端,有效期有限,并且在每次請求中傳遞。相對于基本認(rèn)證,令牌認(rèn)證更安全,因?yàn)榱钆仆ǔ2话舾行畔?,且可以通過HTTPS加密進(jìn)行傳輸。
- OAuth認(rèn)證:OAuth是一種用于授權(quán)的開放標(biāo)準(zhǔn)。它允許用戶授權(quán)第三方應(yīng)用訪問他們存儲(chǔ)在另一個(gè)服務(wù)提供者上的資源,而無需提供他們的登錄憑據(jù)。OAuth通常用于允許用戶通過第三方身份驗(yàn)證進(jìn)行訪問。
授權(quán)是在認(rèn)證成功后,決定用戶或客戶端是否有權(quán)訪問特定資源或執(zhí)行特定操作的過程。它定義了用戶在系統(tǒng)中的權(quán)限和角色,并根據(jù)這些權(quán)限來限制對資源的訪問。
常見的授權(quán)方式包括:
- 角色-Based授權(quán)(Role-Based Authorization):在角色-Based授權(quán)中,用戶被分配到不同的角色,每個(gè)角色有不同的權(quán)限。例如,管理員角色可能有權(quán)訪問所有資源,而普通用戶角色可能只有限制的權(quán)限。
- 資源-Based授權(quán)(Resource-Based Authorization):在資源-Based授權(quán)中,訪問權(quán)限是直接授予特定資源的,而不是基于角色。每個(gè)資源都可以定義其自己的權(quán)限規(guī)則,決定哪些用戶或角色可以訪問它。
- 訪問令牌(Access Token):在OAuth認(rèn)證中,訪問令牌是用于授權(quán)的重要組成部分。訪問令牌包含有關(guān)用戶或客戶端的授權(quán)信息,以及所被授權(quán)訪問的資源和權(quán)限。
綜合來說,認(rèn)證用于確認(rèn)用戶或客戶端的身份,而授權(quán)用于確定用戶或客戶端是否有權(quán)訪問特定資源或執(zhí)行特定操作。這兩個(gè)步驟共同確保只有合法且有權(quán)訪問的用戶或客戶端可以使用API,并保護(hù)系統(tǒng)免受未經(jīng)授權(quán)的訪問。在API網(wǎng)關(guān)中,認(rèn)證和授權(quán)是非常重要的功能,因?yàn)樗鼈冎苯佑绊懙秸麄€(gè)系統(tǒng)的安全性和數(shù)據(jù)的保護(hù)。
第五步:流量控制和限流
客戶端請求的身份驗(yàn)證通過后,API網(wǎng)關(guān)可以做更高級別的流量控制和限流。如下圖:
流量控制和限流是在API網(wǎng)關(guān)中用于管理和控制請求流量的重要概念。它們有助于維護(hù)后端服務(wù)的穩(wěn)定性,防止過載,并提供更好的性能和可靠性。下面詳細(xì)解釋這兩個(gè)概念:
流量控制(Rate Limiting)是指對請求的速率進(jìn)行控制,以限制客戶端對API的請求頻率。這個(gè)過程可以確保后端服務(wù)不會(huì)受到過多請求的壓力,避免服務(wù)器資源過度消耗,導(dǎo)致系統(tǒng)崩潰或響應(yīng)緩慢。常見的流量控制方法包括:
- 固定窗口計(jì)數(shù)器(Fixed Window Counter):在固定時(shí)間窗口內(nèi)(例如每分鐘),對每個(gè)客戶端或API密鑰的請求計(jì)數(shù)。超過預(yù)設(shè)的請求數(shù)量限制時(shí),拒絕額外的請求或延遲響應(yīng)。
- 滑動(dòng)窗口計(jì)數(shù)器(Sliding Window Counter):類似于固定窗口計(jì)數(shù)器,但窗口是滑動(dòng)的,允許更靈活地控制請求速率。
- 令牌桶算法(Token Bucket Algorithm):通過將令牌存放在桶中來控制請求速率。每個(gè)令牌代表一個(gè)請求,桶有一個(gè)固定容量。每當(dāng)有請求時(shí),一個(gè)令牌將被消耗,當(dāng)桶中沒有令牌時(shí),則限制進(jìn)一步的請求。
限流(Rate Limiting)是指在特定時(shí)間段內(nèi),對請求的數(shù)量或速率進(jìn)行限制,防止請求超出系統(tǒng)的處理能力。與流量控制不同,限流不會(huì)拒絕額外的請求,而是將多余的請求暫時(shí)放置在隊(duì)列中,等待后續(xù)處理。常見的限流方法包括:
- 漏桶算法(Leaky Bucket Algorithm):漏桶算法維護(hù)一個(gè)固定容量的桶,所有的請求都被放入這個(gè)桶中。然后,請求按照固定的速率從桶中流出。如果請求過多,超過桶的容量,那么多余的請求將會(huì)被緩存或丟棄。
- 令牌桶算法(Token Bucket Algorithm):除了作為流量控制的方法,令牌桶算法也可以用于限流。與流量控制類似,多余的請求將被放置在桶中等待處理。
流量控制和限流是保護(hù)后端服務(wù)免受過多請求的有效手段。通過合理設(shè)置請求速率限制,可以平衡客戶端和服務(wù)端的交互,確保服務(wù)的可用性和穩(wěn)定性。在API網(wǎng)關(guān)中,流量控制和限流通常與認(rèn)證、授權(quán)和其他安全措施一起使用,共同構(gòu)成了一個(gè)安全、高效的API管理解決方案。
第六步:匹配后端服務(wù)器
當(dāng)HTTP驗(yàn)證通過之后,API 網(wǎng)關(guān)通過路徑匹配找到適當(dāng)?shù)暮蠖朔?wù)來處理請求。如下圖:
第七步:動(dòng)態(tài)路由
匹配到對應(yīng)到服務(wù)器之后,則需要將請求動(dòng)態(tài)路由到任意一臺(tái)匹配到的服務(wù)器。如下圖:
第8步:協(xié)議轉(zhuǎn)換
因?yàn)橛行┕驹谑褂梦⒎?wù),微服務(wù)間使用了 RPC協(xié)議,所以在API網(wǎng)關(guān),需要把HTTP協(xié)議轉(zhuǎn)換成對應(yīng)的RPC協(xié)議。如下圖:
當(dāng)后端服務(wù)處理完請求后會(huì)將響應(yīng)返回給 API網(wǎng)關(guān),網(wǎng)關(guān)會(huì)將響應(yīng)轉(zhuǎn)換回HTTP協(xié)議,并將響應(yīng)返回給客戶端。API網(wǎng)關(guān)還 提供其他關(guān)鍵服務(wù)。例如,API網(wǎng)關(guān)應(yīng)跟蹤錯(cuò)誤,提供斷路功能以防止服務(wù)過載。API 網(wǎng)關(guān)還應(yīng)該提供日志記錄、監(jiān)控和分析服務(wù),以實(shí)現(xiàn)操作可觀察性。
監(jiān)視(Monitoring)和日志記錄(Logging)是在API網(wǎng)關(guān)和系統(tǒng)中實(shí)現(xiàn)可觀察性和故障排查的關(guān)鍵組成部分。它們幫助開發(fā)人員和系統(tǒng)管理員實(shí)時(shí)跟蹤API的使用情況、性能指標(biāo)和錯(cuò)誤信息,從而更好地了解系統(tǒng)的健康狀況,快速發(fā)現(xiàn)并解決問題。下面詳細(xì)解釋這兩個(gè)概念:
監(jiān)視(Monitoring)是指對API網(wǎng)關(guān)和系統(tǒng)中的各種指標(biāo)和性能數(shù)據(jù)進(jìn)行實(shí)時(shí)收集、分析和展示的過程。通過監(jiān)視,我們可以了解系統(tǒng)的運(yùn)行狀況、負(fù)載情況以及資源使用情況,以便及時(shí)采取措施預(yù)防或解決潛在的問題。常見的監(jiān)視指標(biāo)包括:
- 請求量和響應(yīng)時(shí)間:跟蹤API網(wǎng)關(guān)收到的請求數(shù)量以及處理請求所花費(fèi)的時(shí)間。
- 錯(cuò)誤率:記錄API網(wǎng)關(guān)處理請求時(shí)發(fā)生錯(cuò)誤的次數(shù),包括HTTP錯(cuò)誤碼和自定義錯(cuò)誤。
- 系統(tǒng)資源使用率:監(jiān)控CPU、內(nèi)存、磁盤和網(wǎng)絡(luò)的使用情況,以確保系統(tǒng)資源充足且沒有資源瓶頸。
- 請求隊(duì)列長度:跟蹤等待處理的請求隊(duì)列的長度,以防止請求堆積導(dǎo)致性能下降。
- 流量趨勢:了解API的請求流量趨勢,幫助預(yù)測系統(tǒng)的負(fù)載情況。
監(jiān)視可以通過各種監(jiān)控工具和服務(wù)實(shí)現(xiàn),例如Prometheus、Grafana、DataDog等。監(jiān)視的結(jié)果可以以圖表、儀表板或警報(bào)的形式展示,讓開發(fā)人員和運(yùn)維團(tuán)隊(duì)能夠?qū)崟r(shí)了解系統(tǒng)的狀態(tài),做出相應(yīng)的優(yōu)化和調(diào)整。
日志記錄(Logging)是指在API網(wǎng)關(guān)和系統(tǒng)中記錄關(guān)鍵事件、狀態(tài)和錯(cuò)誤信息的過程。日志記錄是一種用于跟蹤和調(diào)試的重要工具,可以在出現(xiàn)問題時(shí)提供有價(jià)值的信息,幫助開發(fā)人員快速定位問題并進(jìn)行故障排查。常見的日志記錄內(nèi)容包括:
- 請求和響應(yīng)日志:記錄API網(wǎng)關(guān)收到的每個(gè)請求以及對應(yīng)的響應(yīng),包括請求頭、請求體、響應(yīng)碼、響應(yīng)內(nèi)容等。
- 錯(cuò)誤日志:記錄API網(wǎng)關(guān)處理請求時(shí)發(fā)生的錯(cuò)誤,包括異常、HTTP錯(cuò)誤碼等。
- 安全日志:記錄與安全相關(guān)的事件,如認(rèn)證失敗、授權(quán)拒絕等。
- 性能日志:記錄請求的處理時(shí)間、資源使用情況等性能指標(biāo)。
- 跟蹤日志:在多個(gè)微服務(wù)或后端服務(wù)之間,記錄請求的追蹤信息,幫助跟蹤請求的路徑和處理過程。
日志可以存儲(chǔ)在本地文件系統(tǒng)、數(shù)據(jù)庫中,也可以通過日志聚合工具(如ELK Stack:Elasticsearch、Logstash、Kibana)進(jìn)行集中管理和分析。日志記錄不僅在故障排查時(shí)有用,還可以幫助分析用戶行為、監(jiān)控安全風(fēng)險(xiǎn)等。
綜合來說,監(jiān)視和日志記錄是在API網(wǎng)關(guān)和系統(tǒng)中實(shí)現(xiàn)可觀察性和故障排查的重要手段。通過監(jiān)視和日志記錄,我們可以及時(shí)發(fā)現(xiàn)潛在的問題,優(yōu)化系統(tǒng)性能,并提供更好的用戶體驗(yàn)。
三、總結(jié)
本文通過分析客戶端向服務(wù)器發(fā)送一個(gè)HTTP請求的經(jīng)典流程,講解了網(wǎng)關(guān)及其主要作用,因?yàn)槊總€(gè)公司的業(yè)務(wù)不一樣,所以上述過程也會(huì)有差異,另外,因?yàn)槊總€(gè)公司基礎(chǔ)服務(wù)的完善程度不一樣,所以對網(wǎng)關(guān)的實(shí)現(xiàn)不一樣。
比如:有些小公司因?yàn)闃I(yè)務(wù)流量小,直接使用了Nginx充當(dāng)了網(wǎng)關(guān),然后購買了一些云安全服務(wù),而有些業(yè)務(wù)體量大的公司,需要單獨(dú)開發(fā)API網(wǎng)關(guān)然后集群部署。
總之,網(wǎng)關(guān)就是后端服務(wù)器的一座保護(hù)傘,它對于來自客戶端的請求,起到了屏障作用。