什么是API網(wǎng)關(guān)登下,它和BFF有什么區(qū)別呢

API網(wǎng)關(guān)你不知道的那些事情

gzh:堆棧future
干貨:


網(wǎng)關(guān)模式是BFF模式嗎

Facade模式與網(wǎng)關(guān)模式又有什么區(qū)別

API網(wǎng)關(guān)不只是代理或者路由


1. 客戶端到微服務(wù)通信架構(gòu)

image

在這種模式中分尸,客戶端應(yīng)用程序可以直接向某些微服務(wù)發(fā)出請(qǐng)求⊥帕蓿客戶端通過微服務(wù)提供的一個(gè)公開的endpoint來訪問,可以是域名也可以是IP+Port囊嘉。這種方式比較簡(jiǎn)單粗暴,前期產(chǎn)品的迭代和開發(fā)效率高革为,也不用維護(hù)其他中間件組件(gateway,nacos等)扭粱;但是缺點(diǎn)也很明顯,比如我們看以下問題:

  • 客戶端應(yīng)用程序如何最大限度地減少對(duì)后端的請(qǐng)求數(shù)量并減少與多個(gè)微服務(wù)的繁瑣通信震檩?

    與多個(gè)微服務(wù)交互以構(gòu)建單個(gè)UI頁面會(huì)增加網(wǎng)絡(luò)上的往返次數(shù)琢蛤,也就是說這種模式會(huì)增加UI端的延遲和復(fù)雜性。理想情況下抛虏,聚合數(shù)據(jù)的響應(yīng)應(yīng)該在服務(wù)器端有效地聚合然后提供一個(gè)接口統(tǒng)一返回就行了虐块,這樣的方式就會(huì)減少響應(yīng)延遲,UI在獲取到數(shù)據(jù)之后會(huì)立刻渲染展示嘉蕾。

  • 如何處理橫切關(guān)注點(diǎn)贺奠,如授權(quán)、數(shù)據(jù)轉(zhuǎn)換和動(dòng)態(tài)請(qǐng)求分派?

    我們從上圖可以看出错忱,我們每個(gè)微服務(wù)其實(shí)都對(duì)各個(gè)端提供了例如認(rèn)證儡率,授權(quán),限流等之類的操作以清,對(duì)于服務(wù)端來說就是復(fù)制黏貼儿普,但是對(duì)于客戶端來說簡(jiǎn)直就是災(zāi)難,他們每對(duì)接一個(gè)微服務(wù)就得寫一套處理服務(wù)端的認(rèn)證鑒權(quán)邏輯掷倔,還得維護(hù)很多secret key眉孩。其實(shí)后端也挺痛苦的,他也得拷貝之前項(xiàng)目的認(rèn)證授權(quán)模式在新項(xiàng)目中使用勒葱,完完全全在做無用功浪汪。再比如分布式鏈路追蹤,trace_id的生成凛虽,每個(gè)后端服務(wù)都得搞一套死遭,這不是XG嗎,我們是人不是機(jī)器凯旋。還有就是我們?cè)谧龌叶劝l(fā)布的時(shí)候呀潭,你總不能在端上搞吧,你總共有1000w用戶至非,你想用100w人做灰度驗(yàn)證钠署,你讓客戶端去做,那客戶端同學(xué)絕筆回敬你一個(gè)白眼荒椭。既然你不想得罪他們你就在服務(wù)端去做谐鼎,可是服務(wù)端有好幾個(gè)微服務(wù),你該如何去做灰度呢戳杀?

  • 如果服務(wù)端不是http/https等友好協(xié)議该面,是二進(jìn)制協(xié)議咋辦

    客戶端應(yīng)用程序不支持服務(wù)器端使用的協(xié)議(如 AMQP 或二進(jìn)制協(xié)議)夭苗。因此,請(qǐng)求必須通過 HTTP/HTTPS 等協(xié)議轉(zhuǎn)換為其他協(xié)議隔缀。在這種情況下又該如何去做题造?

  • 如何打造一個(gè)專門為移動(dòng)應(yīng)用提供的服務(wù)呢?

    多個(gè)微服務(wù)的API可能無法很好地滿足不同客戶端應(yīng)用程序的需求猾瘸。例如界赔,移動(dòng)應(yīng)用程序的需求可能與PC應(yīng)用程序的需求不同。對(duì)于移動(dòng)應(yīng)用程序來說牵触,可能需要進(jìn)一步優(yōu)化以提高數(shù)據(jù)響應(yīng)效率淮悼。我們可以通過聚合來自多個(gè)微服務(wù)的數(shù)據(jù)并返回一組數(shù)據(jù)來實(shí)現(xiàn)此功能,有時(shí)還可以在響應(yīng)中過濾移動(dòng)應(yīng)用程序不需要的任何數(shù)據(jù)揽思。當(dāng)然袜腥,我們也可以壓縮響應(yīng)數(shù)據(jù)。像這樣的聚合或者壓縮數(shù)據(jù)等行為到底有誰來做是最合適的呢钉汗?

2. 引入API Gateway網(wǎng)關(guān)

上面的所有問題都靠API Gateway搞定羹令,而且還有很多問題我們雖然沒有提到,但是Gateway統(tǒng)統(tǒng)都可以幫你搞定损痰。

2.1 什么是API網(wǎng)關(guān)模式

當(dāng)你為多端應(yīng)用程序提供服務(wù)而準(zhǔn)備設(shè)計(jì)和構(gòu)建龐大且復(fù)雜的基于微服務(wù)的后臺(tái)應(yīng)用程序的時(shí)候福侈,可以考慮使用API Gateway。此模式是為特定微服務(wù)組提供單一入口點(diǎn)的服務(wù)卢未。它類似于面向?qū)ο笤O(shè)計(jì)中的Facade模式肪凛,但在本例中,它是分布式系統(tǒng)的一部分辽社。API網(wǎng)關(guān)模式有時(shí)也被稱為BFF模式伟墙,因?yàn)槲覀冊(cè)跇?gòu)建它時(shí)考慮了客戶端應(yīng)用程序的需求。

2.2 那什么是Facade模式爹袁?

Facade模式是面向?qū)ο缶幊讨谐S玫能浖O(shè)計(jì)模式远荠。一個(gè)facade對(duì)象它作為一個(gè)前置接口矮固,掩蓋了更復(fù)雜的底層代碼或結(jié)構(gòu)代碼失息。就比如linux操作系統(tǒng)的文件讀寫操作,林納斯·托瓦茲不可能給你復(fù)雜的讀寫文件邏輯档址,他就給你提供四五個(gè)簡(jiǎn)單的api盹兢,比如read,write,open and create等,人家沒必要再給你解釋inode是啥守伸,段又是啥绎秒,文件句柄又是啥,這要解釋下來沒完沒了尼摹,估計(jì)linux也不會(huì)發(fā)展到現(xiàn)在见芹,作者有意屏蔽底層實(shí)現(xiàn)細(xì)節(jié)剂娄,提供高度抽象的api就是讓你愛上linux,而不是唾棄這樣偉大的產(chǎn)品玄呛。

所以這樣看來Facade模式和網(wǎng)關(guān)模式?jīng)]啥區(qū)別阅懦,都是提供單一入口點(diǎn)的服務(wù),但是因?yàn)锳pi Gateway誕生于微服務(wù)架構(gòu)體系中徘铝,所以它屬于分布式系統(tǒng)架構(gòu)中的一部分耳胎,進(jìn)而在各大公司中發(fā)展壯大起來。

2.3 什么又是BFF模式惕它?

BFF模式我前面講過了 怕午,大家回頭可以看下。我這里也再說一遍:就是當(dāng)你的app想要獲取多個(gè)微服務(wù)去渲染一個(gè)頁面的時(shí)候淹魄,這個(gè)過程會(huì)經(jīng)過多次的網(wǎng)絡(luò)請(qǐng)求郁惜,勢(shì)必會(huì)增加延遲和復(fù)雜性,為了避免這一類問題的發(fā)生或者說減少這類問題的影響甲锡,我們?cè)诩軜?gòu)模式中抽離出來一種模式叫做BFF模式扳炬,它專門用來做一件事情:就是根據(jù)app的請(qǐng)求模式,它先把所有要請(qǐng)求多個(gè)微服務(wù)的數(shù)據(jù)聚合任務(wù)在它這里做了搔体,它本身也是一個(gè)微服務(wù)恨樟,所以可以對(duì)外提供一個(gè)接口就行了,這樣app就不用請(qǐng)求多次了疚俱。就這么簡(jiǎn)單劝术。

我們已經(jīng)知道了什么是網(wǎng)關(guān)模式,那么很明顯網(wǎng)關(guān)模式是屬于BFF中的一種呆奕,而BFF會(huì)有很多種實(shí)現(xiàn)方式养晋,這也就回答了前面第一個(gè)問題。

如下圖顯示了自定義API網(wǎng)關(guān)如何適配僅具有少量微服務(wù)的簡(jiǎn)化架構(gòu):
單網(wǎng)關(guān)架構(gòu)

應(yīng)用程序連接到單個(gè)服務(wù)梁钾,即API網(wǎng)關(guān)绳泉,該服務(wù)配置了路由轉(zhuǎn)發(fā)規(guī)則,將請(qǐng)求轉(zhuǎn)發(fā)到各個(gè)微服務(wù)姆泻。

這樣我們就可以把鑒權(quán)零酪,安全,限流拇勃,轉(zhuǎn)換等與業(yè)務(wù)無關(guān)的邏輯在這個(gè)里面就做了四苇,然后流量透?jìng)鞯胶蠖宋⒎?wù)處理就行了,后端再也不用做跟業(yè)務(wù)無關(guān)的需求了方咆。

但是上述方式有瓶頸月腋,所有服務(wù)都經(jīng)由一個(gè)API Gateway, 隨著接入的業(yè)務(wù)越來越多,它不斷的增長(zhǎng)和演變榆骚,最終片拍,它會(huì)因?yàn)檫@些不同的需求而變得臃腫,實(shí)際上它可能類似于單體應(yīng)用程序或單體服務(wù)了妓肢,那這個(gè)時(shí)候就要小心了穆碎,它可能違反了微服務(wù)自治。

我們目前的做法就是把一個(gè)大的API Gateway根據(jù)業(yè)務(wù)邊界和客戶端應(yīng)用程序進(jìn)行隔離职恳,拆分成一個(gè)個(gè)小的Gateway所禀,這樣我們就可以針對(duì)每個(gè)客戶端應(yīng)用程序的需求使用不同的Gateway。如下圖放钦,多個(gè)API Gateway:

多網(wǎng)關(guān)架構(gòu)

基本上現(xiàn)有大公司的微服務(wù)架構(gòu)都是這套模式色徘,有的可能在API Gateway和微服務(wù)之間再加一個(gè)BFF,專門解決數(shù)據(jù)聚合的問題操禀,但這都是基于這套基本的架構(gòu)模式褂策,因此掌握了這套架構(gòu),你就不是小白了颓屑。

3. API Gateway模式的主要特性

3.1 反向代理或路由

API網(wǎng)關(guān)提供了一個(gè)反向代理來將請(qǐng)求(第7層路由斤寂,通常是HTTP請(qǐng)求)重定向或路由到內(nèi)部微服務(wù)。

3.2 請(qǐng)求聚合

作為網(wǎng)關(guān)模式的一部分揪惦,我們可以將針對(duì)多個(gè)客戶端請(qǐng)求多個(gè)內(nèi)部微服務(wù)的請(qǐng)求(通常是 HTTP 請(qǐng)求)聚合到一個(gè)Gateway中遍搞,當(dāng)客戶端頁面需要來自多個(gè)微服務(wù)的信息時(shí),這種模式特別方便器腋。

3.3 插件管理

根據(jù)每個(gè)API Gateway產(chǎn)品提供的功能溪猿,我們可以將某些插件從網(wǎng)關(guān)中卸載或者設(shè)置上,例如如下功能:

  • 認(rèn)證和授權(quán)
  • 服務(wù)發(fā)現(xiàn)
  • 響應(yīng)緩存
  • 重試策略纫塌、降級(jí)
  • 限流
  • 負(fù)載均衡
  • 鏈路追蹤
  • 協(xié)議轉(zhuǎn)換
  • 黑白名單
  • 灰度發(fā)布

上面我們有說灰度發(fā)布诊县,其實(shí)就是在API Gateway中做的,實(shí)現(xiàn)方式多樣化措左,因?yàn)槟愣寄玫搅髁苛艘廊朐谶@個(gè)上面灰度,你可以在header頭中加一個(gè)標(biāo)識(shí)怎披,然后在Gateway中配置下灰度轉(zhuǎn)發(fā)路由胸嘁,這樣你就將灰度流量轉(zhuǎn)發(fā)到灰度環(huán)境了,而你的灰度環(huán)境也不要硬編碼來判斷那些人需要灰度以及header中是否有灰度標(biāo)識(shí)钳枕。

我們這里的灰度標(biāo)識(shí)就是落日志用的缴渊,為了統(tǒng)計(jì)灰度環(huán)境的穩(wěn)定性和功能性的,有了這個(gè)標(biāo)識(shí)就可以在日志中有了區(qū)分鱼炒。

4. API Gateway缺點(diǎn)

  1. 單點(diǎn)故障
  2. 額外的網(wǎng)絡(luò)調(diào)用,API網(wǎng)關(guān)可能會(huì)增加響應(yīng)時(shí)間
  3. API網(wǎng)關(guān)設(shè)計(jì)不合理蝌借,擴(kuò)展就很麻煩
  4. 如果API Gateway是由單個(gè)團(tuán)隊(duì)開發(fā)昔瞧,可能會(huì)出現(xiàn)開發(fā)瓶頸

缺點(diǎn)都是隨著業(yè)務(wù)的不斷增長(zhǎng)而不斷變化的指蚁,擁抱變化才是好心態(tài)。

5. 小結(jié)

首先介紹了客戶端直連微服務(wù)模式自晰,其次介紹了API網(wǎng)關(guān)模式凝化,其實(shí)不管是那種模式都是軟件架構(gòu)的正常迭代過程,可能下一代就會(huì)發(fā)生天翻覆地的變化酬荞,所以懷抱一顆真誠學(xué)習(xí)的心就是了搓劫,成長(zhǎng)永不落后,怕的就是不敢于突破現(xiàn)在的自己混巧,加油枪向。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咧党,隨后出現(xiàn)的幾起案子秘蛔,更是在濱河造成了極大的恐慌,老刑警劉巖傍衡,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件深员,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛙埂,警方通過查閱死者的電腦和手機(jī)倦畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绣的,“玉大人滔迈,你說我怎么就攤上這事”患” “怎么了燎悍?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盼理。 經(jīng)常有香客問我谈山,道長(zhǎng),這世上最難降的妖魔是什么宏怔? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任奏路,我火速辦了婚禮,結(jié)果婚禮上臊诊,老公的妹妹穿的比我還像新娘鸽粉。我一直安慰自己,他們只是感情好抓艳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布触机。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪儡首。 梳的紋絲不亂的頭發(fā)上片任,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音蔬胯,去河邊找鬼对供。 笑死,一個(gè)胖子當(dāng)著我的面吹牛氛濒,可吹牛的內(nèi)容都是我干的产场。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼舞竿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼京景!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炬灭,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤醋粟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后重归,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米愿,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鼻吮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了育苟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椎木,死狀恐怖违柏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情香椎,我是刑警寧澤漱竖,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站畜伐,受9級(jí)特大地震影響馍惹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玛界,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一万矾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慎框,春花似錦良狈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遇西。三九已至,卻和暖如春窥突,著一層夾襖步出監(jiān)牢的瞬間努溃,已是汗流浹背硫嘶。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工阻问, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沦疾。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓称近,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親哮塞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刨秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容