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