先讓我們看這樣一個(gè)場景吧,一個(gè)電商網(wǎng)站做了服務(wù)化,后端服務(wù)分別拆成了用戶服務(wù)、商品服務(wù)、支付服務(wù)、物流服務(wù)(為了舉例,做了簡化,實(shí)際場景會遠(yuǎn)比這個(gè)復(fù)雜);前端有網(wǎng)頁版和APP,前端的所有操作都需要調(diào)用后端的各個(gè)服務(wù)。
問題1.
前端應(yīng)用需要知道后端每個(gè)服務(wù)的地址,或者必須接入服務(wù)中心;但是服務(wù)的地址和端口可能會動態(tài)變化。
問題2.
每個(gè)服務(wù)的技術(shù)棧必須相同,遵守相同的接口規(guī)范,接口協(xié)議必須相同,否則對于前度極度不友好。
問題3
網(wǎng)頁版和APP展示相同的內(nèi)容時(shí),可能粒度不同,要么服務(wù)端提供粗粒度和細(xì)粒度兩種API,要么只提供一組最細(xì)粒度的API,前者增加了后端的開發(fā)量,后者可能會導(dǎo)致一次前端需要多次調(diào)用細(xì)粒度的API,才能得到想要的數(shù)據(jù)。
問題4
不同的客戶端設(shè)備展示的數(shù)據(jù)不同,比如網(wǎng)頁版能展示的數(shù)據(jù)更詳細(xì)一些,APP展示的數(shù)據(jù)少,那么也會有“提供一個(gè)大而全的接口”還是“為不同的調(diào)用方提供不同接口”的問題。
問題5
日志、認(rèn)證和鑒權(quán)、計(jì)費(fèi)、監(jiān)控等等功能,需要各個(gè)后端來完善,或者接入到對應(yīng)的公共組件中(接入也是需要開發(fā)的),這就多多少少增加了后端服務(wù)的工作。
APIGateway就是為了解決以上種種問題的;APIGateway是系統(tǒng)的唯一入口,它屏蔽掉了系統(tǒng)的內(nèi)部架構(gòu),為調(diào)用方定制了統(tǒng)一的API。
單節(jié)點(diǎn)網(wǎng)關(guān)
多網(wǎng)關(guān)集群
我們可以看到APIGateway的作用:
把后端各個(gè)服務(wù)的API聚合起來,提供統(tǒng)一且唯一規(guī)范的入口,這樣使得內(nèi)部的架構(gòu)對于調(diào)用方透明,客戶端和服務(wù)端的耦合度降低;各個(gè)后端服務(wù)之間,可以采用不同的實(shí)現(xiàn)方案,而APIGateway會屏蔽掉這些差異;
后端的每個(gè)服務(wù)也都是在不斷迭代和升級的,APIGateway可以將請求路由到不同的接口版本上,可以實(shí)現(xiàn)灰度發(fā)布;
APIGateway可以進(jìn)行服務(wù)編排,實(shí)現(xiàn)數(shù)據(jù)聚合,也就是調(diào)用方一次請求,APIGateway調(diào)用多個(gè)服務(wù)拿到數(shù)據(jù)后返回;
APIGateway知道所有服務(wù)實(shí)例的地址,可以對不同的服務(wù)采用不同的路由策略;
日志、認(rèn)證和鑒權(quán)、計(jì)費(fèi)、監(jiān)控等等功能都可以在APIGateway上實(shí)現(xiàn);
APIGateway還可以對流量進(jìn)行控制,通過熔斷、降級、限流等方式,保護(hù)后端服務(wù)。