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網關中,將服務聚合的邏輯下沉到服務層。