API網(wǎng)關(guān):系統(tǒng)的門(mén)面要如何做呢?
API 網(wǎng)關(guān)(API Gateway)不是一個(gè)開(kāi)源組件,而是一種架構(gòu)模式,它是將一些服務(wù)共有的功能整合在一起,獨(dú)立部署為單獨(dú)的一層,用來(lái)解決一些服務(wù)治理的問(wèn)題。你可以把它看作系統(tǒng)的邊界,它可以對(duì)出入系統(tǒng)的流量做統(tǒng)一的管控。在我看來(lái),API 網(wǎng)關(guān)可以分為兩類(lèi):一類(lèi)叫做入口網(wǎng)關(guān),一類(lèi)叫做出口網(wǎng)關(guān)。
入口網(wǎng)關(guān)通常位于負(fù)載均衡服務(wù)器和應(yīng)用服務(wù)器之間,具有多個(gè)重要作用。首先,它為客戶(hù)端提供一個(gè)統(tǒng)一的接入地址,使得客戶(hù)端無(wú)需關(guān)心各個(gè)微服務(wù)的具體部署地址和協(xié)議細(xì)節(jié),從而帶來(lái)便利。其次,API網(wǎng)關(guān)可以動(dòng)態(tài)路由客戶(hù)端請(qǐng)求到不同的業(yè)務(wù)服務(wù)上,并且進(jìn)行必要的協(xié)議轉(zhuǎn)換工作,例如將HTTP請(qǐng)求轉(zhuǎn)換為RPC請(qǐng)求等。另外,API網(wǎng)關(guān)還可實(shí)現(xiàn)服務(wù)治理策略,如熔斷、降級(jí)、流量控制和分流等。此外,客戶(hù)端的認(rèn)證和授權(quán)功能也可以在API網(wǎng)關(guān)中實(shí)現(xiàn),使得不同類(lèi)型的客戶(hù)端采用不同的認(rèn)證方式得到統(tǒng)一處理。針對(duì)黑白名單管理和日志記錄等功能也可以在API網(wǎng)關(guān)中完成。
圖片
出口網(wǎng)關(guān)相比入口網(wǎng)關(guān)可能功能和作用較少。在系統(tǒng)開(kāi)發(fā)中,我們通常會(huì)依賴(lài)許多外部的第三方系統(tǒng),比如第三方賬戶(hù)登錄、支付工具等。為了簡(jiǎn)化與這些外部系統(tǒng)的交互,我們可以在應(yīng)用服務(wù)器和第三方系統(tǒng)之間部署出口網(wǎng)關(guān)。在出口網(wǎng)關(guān)中,可以實(shí)現(xiàn)對(duì)調(diào)用外部API的統(tǒng)一認(rèn)證、授權(quán)、審計(jì)以及訪問(wèn)控制,從而提高系統(tǒng)的安全性和穩(wěn)定性。
圖片
API 網(wǎng)關(guān)要如何實(shí)現(xiàn)
理解了API網(wǎng)關(guān)的作用后,接下來(lái)需要關(guān)注其實(shí)現(xiàn)中的幾個(gè)關(guān)鍵點(diǎn)以及常見(jiàn)的開(kāi)源API網(wǎng)關(guān)。在實(shí)現(xiàn)API網(wǎng)關(guān)時(shí),首要考慮的是性能。因?yàn)锳PI入口網(wǎng)關(guān)承擔(dān)著來(lái)自客戶(hù)端的所有流量,所以性能直接影響用戶(hù)體驗(yàn)。舉例來(lái)說(shuō),如果業(yè)務(wù)服務(wù)處理時(shí)間為10ms,而API網(wǎng)關(guān)的耗時(shí)為1ms,那么每個(gè)接口的響應(yīng)時(shí)間都會(huì)增加10%,這對(duì)性能影響巨大。API網(wǎng)關(guān)的性能優(yōu)化關(guān)鍵在于I/O模型。舉例來(lái)說(shuō),Netflix開(kāi)源的API網(wǎng)關(guān)Zuul在1.0版本中采用同步阻塞I/O模型,而在2.0版本中改造成了基于Netty的非阻塞I/O模型,性能提升了約20%。
此外,API網(wǎng)關(guān)中的操作可以預(yù)先定義,如黑白名單設(shè)置、接口動(dòng)態(tài)路由,也可以根據(jù)業(yè)務(wù)需要定義。因此,API網(wǎng)關(guān)的設(shè)計(jì)需要注意擴(kuò)展性,即可以動(dòng)態(tài)添加或移除一些邏輯,使得網(wǎng)關(guān)的執(zhí)行鏈路更加靈活。一般來(lái)說(shuō),可以將每個(gè)操作定義為一個(gè)過(guò)濾器(filter),然后使用責(zé)任鏈模式將這些過(guò)濾器串起來(lái)。責(zé)任鏈可以動(dòng)態(tài)組織過(guò)濾器,解耦各個(gè)過(guò)濾器之間的關(guān)系,使得增加或減少過(guò)濾器不會(huì)影響其他過(guò)濾器的運(yùn)行。
在實(shí)踐中,對(duì)API網(wǎng)關(guān)的設(shè)計(jì)和優(yōu)化需要綜合考慮性能、擴(kuò)展性和靈活性等因素,以提供高效、可靠的服務(wù)。
如何在你的系統(tǒng)中引入 API 網(wǎng)關(guān)
一方面,API網(wǎng)關(guān)負(fù)責(zé)對(duì)服務(wù)層接口數(shù)據(jù)進(jìn)行聚合。舉例來(lái)說(shuō),商品詳情頁(yè)的接口可能需要調(diào)用多個(gè)服務(wù)接口獲取商品信息、用戶(hù)信息、店鋪信息以及用戶(hù)評(píng)論等數(shù)據(jù),API網(wǎng)關(guān)可以負(fù)責(zé)將這些數(shù)據(jù)聚合并返回給前端。
另一方面,Web層需要將HTTP請(qǐng)求轉(zhuǎn)換為RPC請(qǐng)求,并對(duì)前端的流量進(jìn)行限制,例如對(duì)某些請(qǐng)求添加設(shè)備ID的黑名單等。因此,在進(jìn)行系統(tǒng)改造時(shí),可以將API網(wǎng)關(guān)從Web層中獨(dú)立出來(lái),將協(xié)議轉(zhuǎn)換、限流、黑白名單等功能遷移到API網(wǎng)關(guān)中進(jìn)行處理,形成一個(gè)獨(dú)立的入口網(wǎng)關(guān)層。
針對(duì)服務(wù)接口數(shù)據(jù)聚合的操作,通常有兩種解決思路:
獨(dú)立出一組網(wǎng)關(guān)專(zhuān)門(mén)處理服務(wù)聚合和超時(shí)控制等任務(wù)。其中,一種網(wǎng)關(guān)被稱(chēng)為流量網(wǎng)關(guān),負(fù)責(zé)處理流量控制、協(xié)議轉(zhuǎn)換等任務(wù);另一種網(wǎng)關(guān)則被稱(chēng)為業(yè)務(wù)網(wǎng)關(guān),負(fù)責(zé)處理超時(shí)控制等業(yè)務(wù)相關(guān)任務(wù)。
抽取獨(dú)立的服務(wù)層,專(zhuān)門(mén)負(fù)責(zé)接口聚合的操作。這樣,服務(wù)層可以大致分為原子服務(wù)層和聚合服務(wù)層兩部分,原子服務(wù)層提供單一功能的原子服務(wù)接口,而聚合服務(wù)層負(fù)責(zé)調(diào)用多個(gè)原子服務(wù)接口并進(jìn)行數(shù)據(jù)聚合。
我認(rèn)為,接口數(shù)據(jù)聚合是業(yè)務(wù)操作,與其放在通用的網(wǎng)關(guān)層來(lái)實(shí)現(xiàn),不如放在更貼近業(yè)務(wù)的服務(wù)層來(lái)實(shí)現(xiàn),所以,我更傾向于第二種方案。
圖片
同時(shí),我們可以在系統(tǒng)和第三方支付服務(wù)、以及登錄服務(wù)之間部署出口網(wǎng)關(guān)服務(wù)。以前,通常會(huì)在拆分出來(lái)的支付服務(wù)中完成對(duì)于第三方支付接口所需數(shù)據(jù)的加密、簽名等操作,然后再調(diào)用第三方支付接口完成支付請(qǐng)求?,F(xiàn)在,我們將對(duì)數(shù)據(jù)的加密、簽名等操作放在出口網(wǎng)關(guān)中。這樣一來(lái),支付服務(wù)只需要調(diào)用出口網(wǎng)關(guān)的統(tǒng)一支付接口即可完成支付請(qǐng)求,大大簡(jiǎn)化了支付服務(wù)的調(diào)用流程。
在引入了 API 網(wǎng)關(guān)之后,我們的系統(tǒng)架構(gòu)就變成了下面這樣:
圖片
總結(jié):
API網(wǎng)關(guān)分為入口網(wǎng)關(guān)和出口網(wǎng)關(guān)兩類(lèi)。入口網(wǎng)關(guān)的功能包括隔離客戶(hù)端和微服務(wù)、提供協(xié)議轉(zhuǎn)換、安全策略、認(rèn)證、限流、熔斷等;而出口網(wǎng)關(guān)則主要用于統(tǒng)一調(diào)用第三方服務(wù),提供統(tǒng)一的認(rèn)證、授權(quán)、審計(jì)以及訪問(wèn)控制。
在實(shí)現(xiàn)API網(wǎng)關(guān)時(shí),性能和擴(kuò)展性是重點(diǎn)。可以采用多路I/O復(fù)用模型和線程池并發(fā)處理來(lái)提升性能,使用責(zé)任鏈模式來(lái)提升擴(kuò)展性。線程池可以針對(duì)不同的接口或服務(wù)進(jìn)行隔離和保護(hù),提升網(wǎng)關(guān)的可用性。
API網(wǎng)關(guān)可以替代系統(tǒng)中原有的Web層,將Web層中的功能如協(xié)議轉(zhuǎn)換、認(rèn)證、限流等遷移到API網(wǎng)關(guān)中,將服務(wù)聚合的邏輯下沉到服務(wù)層。