微服務架構模式之 API Gateway

大概三年前的這個時候,開始負責一個項目斧拍,是一個 P2P 產品的客戶端的開發(fā)雀扶。需求很常見,基本就是需要 手機App(iOS, Android) 和 移動 H5頁面肆汹。當時的一個項目背景是愚墓,已經存在多個由后端團隊使用 Java 開發(fā)的微服務,承載著產品的核心業(yè)務邏輯昂勉,以及主數(shù)據(jù)的管理浪册。這些已經存在的微服務,基本是按照領域模型劃分岗照,如會員服務村象,標的服務,賬務服務攒至,充值支付服務等厚者,每個服務基本還提供相應的查詢服務,另外還有一些實用工具類的迫吐,如短信服務库菲。可以預見志膀,在微服務架構下熙宇,一個尋常的 UI 頁面,往往需要調用多個服務溉浙。而這僅僅是問題的一個方面烫止。

讓我們看看在微服務架構下,關于提供給客戶端的 API 的設計放航,都有哪些方面的問題需要考慮

  • 微服務暴露的 API 粒度烈拒,通常不同于客戶端的需求。微服務通常暴露細粒度的 API
  • 不同的客戶端可能需要不同的數(shù)據(jù)
  • 不同客戶端的網絡性能可能不同广鳍。典型的如服務端渲染的 Web 應用程序,相較于移動客戶端吓妆,可以在不影響用戶體驗的情況下赊时,發(fā)起更多的請求,而區(qū)別就在于行拢,LAN 比起移動網絡祖秒,更快并且延遲低
  • 服務的實例數(shù)量和位置可能發(fā)生變化
  • 服務的劃分可能隨時間推移而變化
  • 服務可能使用多種協(xié)議,其中一些可能不是對 Web 友好的

考慮到這些因素,便很自然地考慮竭缝,引入一個中間層房维,服務于客戶端,按需定制 API抬纸,減少請求次數(shù)咙俩,同時隱藏不必要的細節(jié)。


Use an API gateway

引入這一層抽象之后湿故,前述問題的化解阿趁,都找到一個好的抓手

  • 客戶端可以不受服務劃分的變化的影響
  • 客戶端可以不受服務的實例數(shù)量和位置變化的影響
  • 不同的客戶端,可以有專屬的 API坛猪,同時又共享底層的服務陣列和基礎設施
  • 減少客戶端發(fā)起請求的數(shù)量脖阵,進而提升了用戶體驗
  • 客戶端不必調用多個服務而只需要與調用 API gateway
  • 協(xié)議轉換,將任何內部的通訊協(xié)議墅茉,轉換為 Web 友好的 API 協(xié)議

在前述的項目中命黔,微服務之間使用了 Hessian 和 SOAP 協(xié)議,經過 API gateway 的協(xié)議轉換就斤,最終只以 REST 的方式暴露 API 給客戶端悍募。

這一層的引入,顯然也有一些代價

  • 增加了系統(tǒng)復雜性战转。API gateway 作為一個代碼工程搜立,必然需要投入開發(fā)、部署和維護
  • 增加了響應時間槐秧。但對于大多數(shù)應用而言啄踊,LAN 網絡中一個額外往返的成本是微不足道的

回到當時的項目中,那時還未了解到 API gateway 作為一種架構模式的存在刁标,代碼項目的名稱是 web-api颠通,但這個項目完整的承擔了 API gateway 扮演的職責,有效地化解了微服務架構下膀懈,降低客戶端的整體開發(fā)維護成本顿锰。

在技術選型上,實現(xiàn) API gateway 常見的是采用事件驅動或者響應式的編程框架启搂,當需要擴容應對高負載時硼控,這是推薦的方式。在 JVM 上胳赌,可以考慮基于 NIO 的庫牢撼,如 Netty,Spring Reactor 等疑苫。Node.js 也是個常見選擇熏版。


引入一點題外話纷责,我當時對降低客戶端的整體開發(fā)維護成本,還有另外一些思考撼短,是關于溝通再膳。日常的 UI 需求中,有不少其實是對后端微服務沒有變更要求的曲横,簡單的比如喂柒,多顯示一個字段,格式化顯示金額胜榔,稍復雜的比如胳喷,頁面呈現(xiàn)需要多組合一個既有的微服務,表單提交需要將部分信息反饋到另一個微服務等夭织。對于這類需求吭露,如果由后端團隊來支持,一是會分散他們對領域服務和主數(shù)據(jù)管理的專注尊惰,二是考慮到 API gateway 這層比較薄的路由層/裝配層讲竿,動態(tài)語言相比 Java 是更高效的選擇。

再結合當時團隊的情況弄屡,Java 開發(fā)人員普遍缺少基于 NIO 的庫的開發(fā)經驗题禀,而且開發(fā)任務/風險已經偏重。而前端開發(fā)人員在編寫前端組件以及實現(xiàn)前端構建時膀捷,都是在使用 Node.js迈嘹,因此對于他們而言,使用 Node.js 上手 API gateway 的開發(fā)全庸,門檻較低并且普遍有學習意愿秀仲。前端開發(fā)人員又是 UI 需求的直接受命人,對于前述的一大類 UI 變更需求壶笼,他們可以以最少的溝通成本神僵,最少的信息傳遞失誤,來高效的完成覆劈。

由此我組建了當時公司內第一個大前端部門保礼,將前端團隊和移動端團隊納入,將 API gateway 的實現(xiàn)和文檔管理的職責納入责语,大家共同圍繞客戶端的需求炮障,保持較高的整體開發(fā)維護效率。此后坤候,還在 API gateway 的基礎上陸續(xù)添加了 API 版本管理铝阐,移動設備管理,客戶端統(tǒng)計铐拐,緩存等一系列服務徘键。


API gateway 還有很多的擴展點,試舉一些例子

  • 客戶端多協(xié)議遍蟋。之前在攜程做 App 時吹害,客戶端就是同時支持 HTTP 和 TCP 兩種協(xié)議
  • 面向客戶端支持 HTTP DNS / Direct IP。這個也是常見的客戶端優(yōu)化手段
  • 客戶端的流控
  • 客戶端認證和鑒權
  • 響應數(shù)據(jù)的脫敏
  • 客戶端密鑰管理
  • 客戶端緩存協(xié)商
  • 客戶端調用計量或計費虚青。典型如 Open API

在 API gateway 這個領域它呀,也有一些開源框架在活躍,如 Netflix Zuul棒厘,基于 Nginx 的 Kong 等纵穿,目前關注較少,就不展開介紹了奢人。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谓媒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子何乎,更是在濱河造成了極大的恐慌句惯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件支救,死亡現(xiàn)場離奇詭異抢野,居然都是意外死亡,警方通過查閱死者的電腦和手機各墨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門指孤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贬堵,你說我怎么就攤上這事恃轩。” “怎么了扁瓢?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵详恼,是天一觀的道長。 經常有香客問我引几,道長昧互,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任伟桅,我火速辦了婚禮敞掘,結果婚禮上,老公的妹妹穿的比我還像新娘楣铁。我一直安慰自己玖雁,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布盖腕。 她就那樣靜靜地躺著赫冬,像睡著了一般浓镜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劲厌,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天膛薛,我揣著相機與錄音,去河邊找鬼补鼻。 笑死哄啄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的风范。 我是一名探鬼主播咨跌,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼硼婿!你這毒婦竟也來了锌半?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤加酵,失蹤者是張志新(化名)和其女友劉穎拳喻,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猪腕,經...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡冗澈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陋葡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亚亲。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖腐缤,靈堂內的尸體忽然破棺而出捌归,到底是詐尸還是另有隱情,我是刑警寧澤岭粤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布惜索,位于F島的核電站,受9級特大地震影響剃浇,放射性物質發(fā)生泄漏巾兆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一虎囚、第九天 我趴在偏房一處隱蔽的房頂上張望角塑。 院中可真熱鬧,春花似錦淘讥、人聲如沸圃伶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窒朋。三九已至搀罢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炼邀,已是汗流浹背魄揉。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拭宁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓瓣俯,卻偏偏與公主長得像杰标,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子彩匕,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容