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