API網(wǎng)關(guān)是什么
在日常工作中娩贷,不同的場合下,我們可能聽說過很多次網(wǎng)關(guān)這個(gè)名稱锭亏,這里說的網(wǎng)關(guān)特指API網(wǎng)關(guān)(API Gataway)咖城。字面意思是指將所有API的調(diào)用統(tǒng)一接入API網(wǎng)關(guān)層,由網(wǎng)關(guān)層負(fù)責(zé)接入和輸出歪赢。
那么在什么情況下需要一個(gè)API網(wǎng)關(guān)呢化戳?下面從單體應(yīng)用到微服務(wù)演變的過程去闡述,回顧單體應(yīng)用時(shí)代,在業(yè)務(wù)簡單点楼、團(tuán)隊(duì)組織規(guī)模很小的時(shí)候扫尖,我們常常把功能都幾種與一個(gè)應(yīng)用中,統(tǒng)一部署掠廓,統(tǒng)一測試换怖,如下圖:
隨著業(yè)務(wù)的迅速發(fā)展,組織成員日益增多蟀瞧。將所有的功能幾種在一個(gè)Tomcat中的時(shí)候沉颂,沒更新一個(gè)功能模塊,勢必要更新所有的程序悦污。牽一發(fā)而動全身铸屉,系統(tǒng)將很難維護(hù)。
單體應(yīng)用滿足不了日趨增長的需求之后切端,微服務(wù)出現(xiàn)了彻坛。我們利用微服務(wù)的思想,將原來的單體應(yīng)用進(jìn)行微服務(wù)化踏枣。將原來集中于一體的功能(如商品昌屉、訂單服務(wù))進(jìn)行拆分,每個(gè)功能模塊又各自的自成體系的發(fā)布茵瀑、運(yùn)維等功能怠益。這樣就解決了單體應(yīng)用的弊端,如下:
這時(shí)瘾婿,我們還沒有看到API Gateway蜻牢。舉例來說,原先IOS偏陪、Android抢呆、PC客戶端調(diào)用服務(wù)的地方,需要多個(gè)URL地址笛谦,有訂單的抱虐、商品的、用戶的饥脑。微服務(wù)化后就必須有統(tǒng)一的出入口恳邀,這種情況下,API Gateway就出現(xiàn)了灶轰。API Gateway很好的解決了微服務(wù)下調(diào)用谣沸、統(tǒng)一接入等問題,如下圖所示:
有了API網(wǎng)關(guān)之后笋颤,各個(gè)API服務(wù)提供團(tuán)隊(duì)可以專注于自己的業(yè)務(wù)邏輯處理乳附,而API罔顧贊更專注于安全、流量、路由等問題赋除。
看到上面的圖示與描述阱缓,我們可能會想到另外一個(gè)與網(wǎng)關(guān)類似的東西——代理。網(wǎng)關(guān)與代理的區(qū)別:代理是純粹的數(shù)據(jù)透傳举农,協(xié)議不會發(fā)生變化荆针;網(wǎng)關(guān)在數(shù)據(jù)透傳的背景下,還會設(shè)計(jì)協(xié)議的轉(zhuǎn)換颁糟,比如上圖中用戶請求傳輸?shù)骄W(wǎng)關(guān)的協(xié)議是HTTP航背,通過網(wǎng)關(guān)透傳到下游則可能已經(jīng)轉(zhuǎn)換成企業(yè)內(nèi)部的RPC了(比如JSF、Dubbo等企業(yè)自研的RPC框架)滚停。
API網(wǎng)關(guān)涵蓋的基本功能
一個(gè)API網(wǎng)關(guān)的基本功能包含了統(tǒng)一接入、協(xié)議適配粥惧、流量管理與容錯(cuò)键畴、以及安全防護(hù),這四大基本功能構(gòu)成了網(wǎng)關(guān)的核心功能突雪。網(wǎng)關(guān)首要的功能是負(fù)責(zé)統(tǒng)一接入起惕,然后將請求的協(xié)議轉(zhuǎn)換成內(nèi)部的接口協(xié)議,在調(diào)用的過程中還要有限流咏删、降級、熔斷等容錯(cuò)的方式來保護(hù)網(wǎng)關(guān)的整體穩(wěn)定督函,同時(shí)網(wǎng)關(guān)還要做到基本的安全防護(hù)(防刷控制),以及黑白名單(比如IP白名單)等基本安全措施辰狡,如下圖所示:
API網(wǎng)關(guān)的架構(gòu)示例
除了基本的四大功能,網(wǎng)關(guān)運(yùn)行良好的環(huán)境還包括注冊中心(比如:ZK讀取已發(fā)布的API接口的動態(tài)配置)宛篇。為了實(shí)現(xiàn)高性能娃磺,將數(shù)據(jù)全部異構(gòu)到緩存(如:Redis)中,同時(shí)還可以配合本地緩存來進(jìn)一步提高網(wǎng)關(guān)系統(tǒng)的性能叫倍。為了提高網(wǎng)關(guān)的吞吐率,可以使用NIO+Servlet 3 異步的方式听诸,還可以利用Servlet 3 的異步特性將請求線程與業(yè)務(wù)線程分開,為后續(xù)的線程池隔離做好基本的支撐蚕泽。訪問日志的存儲我們可以放到Hbase中蛇更,如果要作為開放網(wǎng)關(guān)使用,那么需要一個(gè)支持OAuth2.0的授權(quán)中心。還可以引入Nginx + lua的方式將一些基本的校驗(yàn)判斷放到應(yīng)用系統(tǒng)之上派任,這樣可以更輕量化的處理接入的問題,整體的網(wǎng)關(guān)架構(gòu)示例如下所示:
小結(jié)
文章中师逸,我們從單體系統(tǒng)到微服務(wù)系統(tǒng)演變,引入了API網(wǎng)關(guān)的概念篓像,緊接著介紹了API Gateway的基本功能皿伺,以及展示一個(gè)線上生產(chǎn)網(wǎng)關(guān)的架構(gòu)示意圖员辩。通過本片文章鸵鸥,可以對API Gateway的內(nèi)容有一個(gè)基本的認(rèn)知。
文章內(nèi)容來源:《架構(gòu)修煉之道》
更多個(gè)人博客內(nèi)容:原文: 七七號:王琦的原創(chuàng)個(gè)人博客網(wǎng)站