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