API閘道:系統的門面要如何做呢?
API 閘道(API Gateway)不是一個開源元件,而是一種架構模式,它是將一些服務共有的功能整合在一起,獨立部署為單獨的一層,用來解決一些服務治理的問題。你可以把它看成系統的邊界,它可以對出入系統的流量做統一的管控。在我看來,API 網關可以分為兩大類:一類叫做入口網關,一類叫做出口網關。
入口網關通常位於負載平衡伺服器和應用程式伺服器之間,具有多個重要作用。首先,它為客戶端提供一個統一的存取位址,使得客戶端無需關心各個微服務的具體部署位址和協定細節,從而帶來便利。其次,API網關可以動態路由客戶端請求到不同的業務服務上,並且進行必要的協定轉換工作,例如將HTTP請求轉換為RPC請求等。另外,API閘道還可實現服務治理策略,如熔斷、降級、流量控制和分流等。此外,客戶端的認證和授權功能也可以在API閘道中實現,使得不同類型的用戶端採用不同的認證方式進行統一處理。針對黑白名單管理和日誌記錄等功能也可以在API網關中完成。
圖片
出口網關相比入口網關可能功能和作用較少。在系統開發中,我們通常會依賴許多外部的第三方系統,例如第三方帳戶登入、付款工具等。為了簡化與這些外部系統的交互,我們可以在應用程式伺服器和第三方系統之間部署出口網關。在出口網關中,可以實現對呼叫外部API的統一認證、授權、稽核以及存取控制,從而提高系統的安全性和穩定性。
圖片
API 網關要如何實現
在了解API網關的作用後,接下來需要注意其實作中的幾個關鍵點以及常見的開源API網關。在實現API網關時,首要考慮的是效能。因為API入口網關承擔著來自客戶端的所有流量,所以效能直接影響使用者體驗。舉例來說,如果業務服務處理時間為10ms,而API網關的耗時為1ms,那麼每個介面的回應時間都會增加10%,這對效能影響巨大。API閘道的效能最佳化關鍵在於I/O模型。舉例來說,Netflix開源的API網關Zuul在1.0版本中採用同步阻塞I/O模型,而在2.0版本中改造成了基於Netty的非阻塞I/O模型,效能提升了約20%。
此外,API網關中的操作可以預先定義,例如黑白名單設定、介面動態路由,也可以根據業務需求定義。因此,API網關的設計需要注意擴展性,即可以動態添加或移除一些邏輯,使得網關的執行鏈路更加靈活。一般來說,可以將每個操作定義為一個過濾器(filter),然後使用責任鏈模式將這些過濾器串起來。責任鏈可以動態組織過濾器,解耦各個過濾器之間的關係,使得增加或減少過濾器不會影響其他過濾器的運作。
在實務中,對API閘道的設計和最佳化需要全面考慮效能、擴充性和靈活性等因素,以提供高效率、可靠的服務。
如何在你的系統中引入API 網關
一方面,API網關負責對服務層介面資料進行聚合。舉例來說,商品詳情頁的介面可能需要呼叫多個服務介面以取得商品資訊、使用者資訊、店鋪資訊以及使用者評論等數據,API網關可以負責將這些資料聚合並傳回前端。
另一方面,Web層需要將HTTP請求轉換為RPC請求,並對前端的流量進行限制,例如對某些請求添加設備ID的黑名單等。因此,在進行系統改造時,可以將API網關從Web層獨立出來,將協定轉換、限流、黑白名單等功能遷移到API閘道中進行處理,形成一個獨立的入口網關層。
針對服務介面資料聚合的操作,通常有兩種解決想法:
獨立出一組網關專門處理服務聚合和逾時控制等任務。其中,一種網關稱為流量網關,負責處理流量控制、協定轉換等任務;另一種網關則稱為業務網關,負責處理超時控制等業務相關任務。
抽取獨立的服務層,專門負責介面聚合的操作。這樣,服務層可以大致分為原子服務層和聚合服務層兩部分,原子服務層提供單一功能的原子服務接口,而聚合服務層負責調用多個原子服務接口並進行資料聚合。
我認為,介面資料聚合是業務操作,與其放在通用的網關層來實現,不如放在更貼近業務的服務層來實現,所以,我更傾向於第二種方案。
圖片
同時,我們可以在系統和第三方支付服務以及登入服務之間部署出口網關服務。以前,通常會在拆分出來的支付服務中完成第三方支付介面所需資料的加密、簽章等操作,然後再呼叫第三方支付介面完成付款請求。現在,我們將對資料的加密、簽章等操作放在出口網關中。這樣一來,支付服務只需要呼叫出口網關的統一支付介面即可完成支付請求,大大簡化了支付服務的呼叫流程。
在引入了API 網關之後,我們的系統架構變成了下面這樣:
圖片
總結:
API網關分為入口網關和出口網關兩類。入口網關的功能包括隔離客戶端和微服務、提供協定轉換、安全策略、認證、限流、熔斷等;而出口網關則主要用於統一呼叫第三方服務,提供統一的認證、授權、審計以及訪問控制。
在實現API網關時,效能和擴充性是重點。可以採用多路I/O復用模型和執行緒池並發處理來提升效能,使用責任鏈模式來提升擴充性。線程池可以針對不同的介面或服務進行隔離和保護,提升網關的可用性。
API閘道可以取代系統中原有的Web層,將Web層中的功能如協定轉換、認證、限流等遷移到API閘道中,將服務聚合的邏輯下沉到服務層。