談談微服務設計中的API網關模式

來源:架構頭條(ID: ArchFront)
原文:http://dwz.date/crrw

作者:Bibek Shah

根據 Gartner 對微服務的定義:“微服務是范圍狹窄冬殃、封裝緊密璃岳、松散耦合斜脂、可獨立部署且可獨立伸縮的應用程序組件柱徙∨钔疲”

與將模塊高度耦合并部署為一個大的應用程序相比卢肃,微服務的目標是將應用程序充分分解或者解耦為松散耦合的許多微服務或者模塊糙臼,這樣做對下面幾點有很大幫助:

  • 每個微服務都可以獨立于應用程序中的同級服務進行部署、升級禾怠、擴展返奉、維護和重新啟動。

  • 通過自治的跨職能團隊進行敏捷開發(fā)和敏捷部署吗氏。

  • 運用技術時具備靈活性和可擴展性

在微服務架構中衡瓶,我們根據各自的特定需求部署不同的松耦合服務,其中每個服務都有其更細粒度的 API 模型牲证,用以服務于不同的客戶端(Web,移動和第三方 API)关面。

客戶端到微服務的連接

image

在考慮客戶端與每個已部署的微服務直接通信的問題時坦袍,應考慮以下挑戰(zhàn):

  1. 如果微服務向客戶端公開了細粒度的 API十厢,則客戶端應向每個微服務發(fā)出請求。在典型的單頁中捂齐,可能需要進行 多次服務器往返蛮放,才能滿足請求。對于較差的網絡條件下運行的設備(例如移動設備)奠宜,這可能會更糟包颁。

  2. 微服務中存在的 多種通信協(xié)議(例如 gRpc、thrift压真、REST娩嚼、AMQP 等)使客戶端很難輕松采用所有這些協(xié)議。

  3. 必須在每個微服務中實現通用網關功能(例如身份驗證滴肿、授權岳悟、日志記錄)。

  4. 在不中斷客戶端連接的情況下泼差,很難在微服務中進行更改贵少。例如,在合并或劃分微服務時堆缘,可能需要重新編寫客戶端部分代碼滔灶。

API 網關

為了解決上述挑戰(zhàn),人們引入了一個附加層吼肥,該附加層位于客戶端和服務器之間录平,充當從客戶端到服務器的反向代理路由請求。與面向對象設計的模式相似潜沦,它為封裝底層系統(tǒng)架構的 API 提供了一個單一的入口萄涯,稱為 API 網關。

簡而言之唆鸡,它的行為就像 API 管理員一樣涝影,但重要的是不要將 API 管理與 API Gateway 混為一談。

image

API 網關的功能

路由

網關封裝了底層系統(tǒng)并與客戶端分離争占,為客戶端提供了與微服務系統(tǒng)進行通信的單個入口點燃逻。

整合

API 網關整合了一些邊緣的重復功能,無需讓每個微服務都實現它們臂痕。它包括如下功能:

  • 認證和授權

  • 服務發(fā)現集成

  • 緩存響應結果

  • 重試策略伯襟、熔斷器、QoS

  • 限速和節(jié)流

  • 負載均衡

  • log 日志握童、鏈路追蹤姆怪、關聯

  • Header、query 字符串 以及 claims 轉義

  • IP 白名單

  • IAM

  • 集中式日志管理(服務之間的 transaction ID、錯誤日志等)

  • 身份的提供方稽揭,驗證與授權

后端服務前端模式(BFF Backend for Frontend)

它是 API 網關模式的一種變體俺附。它提供了基于客戶端的多個網關,而不是提供給客戶端一個單一的入口點溪掀。目的是根據客戶端的需求提供量身定制的 API事镣,從而消除了為所有客戶端制作通用 API 造成的大量的浪費

image

到底需要多少 BFF

BFF 的基本概念是為每種用戶體驗開發(fā)利基后端。菲爾·卡爾薩多(PhilCal?ado) 的指導建議是“一種體驗揪胃,一種 BFF”璃哟。如果跨客戶端(IOS 客戶端、Android 客戶端喊递、Web 瀏覽器等)的要求有很大差異随闪,并且單個代理或 API 的發(fā)布時間有嚴格要求,則 BFF 是一個很好的解決方案册舞。還應注意蕴掏,更復雜的設計需要復雜的步驟。

GraphQL 與 BFF

GraphQL 是一種 API 的查詢語言调鲸。PhilCal?ado 提出 BFF 和 GraphQL 的想法是相似的盛杰,但不是互斥的概念。他補充說藐石,BFF 與你端口的形狀無關即供,而在于賦予客戶端對應用程序的自治權,您可以在其中構建與許多 BFF 或 OSFA(one-size-fits-all)的 GraphQL API于微。

著名的 API 網關

Netflix API 網關:Zuul

Netflix 的流媒體服務可在 1000 多種不同類型的設備(電視逗嫡、機頂盒、智能手機株依、游戲系統(tǒng)驱证、平板電腦等)上使用,在高峰時段可以每秒處理 50,000 個請求恋腕,這種需求是 OSFA (one-size-fits-all)的 REST API 難以滿足的抹锄,因此他們?yōu)槊總€設備量身定制了 API 網關。

Netflix 的 Zuul 2 是所有進入 Netflix 云基礎架構的請求的第一步荠藤。Zuul 2 大大改進了架構和功能伙单,使我們的網關能夠處理、路由和保護 Netflix 的云系統(tǒng)哈肖,并幫助為我們的 1.25 億會員提供最佳體驗吻育。

image

亞馬遜 API 網關

AWS 提供了完備的托管服務,用于創(chuàng)建淤井、發(fā)布布疼、維護摊趾、監(jiān)視以及保護 REST、HTTP 和 WebSocket缎除,開發(fā)人員可以在其中創(chuàng)建用于訪問 AWS 或其他 Web 服務的 API严就,并將數據存儲在 AWS 云上面。

image

Kong API 網關

Kong Gateway 是一個開源的,輕量級的微服務 API 網關,可提供無與倫比的延遲性能優(yōu)化和可伸縮性萨咕。如果您只需要這些基礎能力叠骑,那么它就是很合適的選項。只需要增加更多節(jié)點就可以輕松橫向擴展祟印。它以非常低的延遲來支持大量可變的工作負載肴沫。

image

其他 API 網關

  • Apigee API Gateway

  • MuleSoft

  • Tyk.io

  • Akana

  • SwaggerHub

  • Azure API Gateway

  • Express API Gateway

  • Karken D

選擇正確的網關

評估標準里面,一些常見的指標包括簡便性蕴忆、開源還是專有颤芬、可伸縮性和靈活性、安全性套鹅、后續(xù)功能站蝠、社區(qū)、管理(支持情況卓鹿、監(jiān)控和部署)菱魔、環(huán)境配置(安裝、配置吟孙、是否支持托管)澜倦、定價和文檔等。

API 組合與聚合

API 網關中的一些 API 請求直接映射到單個服務的 API 上杰妓,可以通過將請求路由到相應的微服務來提供服務藻治。但是,在需要從多個微服務獲得結果的復雜 API 操作的情況下巷挥,可以通過 API 組合 / 聚合(分散 - 收集機制)來提供服務桩卵。在需要同步通信的情況下,如果服務彼此依賴句各,則必須遵循鏈式組合模式吸占。組合層必須支持很大一部分的 ESB / 集成功能,例如轉換凿宾、編排矾屯、彈性和穩(wěn)定性模式。

根容器的部署必須配備特殊的分發(fā)器和聚合器功能(或微服務)初厚。分發(fā)者負責分解成細粒度的任務件蚕,并將這些任務分發(fā)給微服務實例孙技。聚合器負責聚合業(yè)務工作流從組合微服務中得出的結果。

API 網關和聚合

具備復雜功能的網關會增大測試和部署的難度排作。強烈建議大家避免在 API 網關中進行聚合和數據轉換牵啦。領域專屬的功能更應該遵循軟件開發(fā)實踐的定義,在應用程序的代碼中完成妄痪。Netflix API Gateway Zuul 2 從他們在 Zuul 到原始系統(tǒng)的網關中哈雏,刪除了許多業(yè)務邏輯。

image

Service Mesh 與 API 網關

微服務中的 Service Mesh 是處理進程間通信的可配置網絡基礎結構層衫生。這和通常稱為 Sidecar 代理或 Sidecar 網關的東西很像裳瘪。它提供了許多功能,例如:

  • 負載均衡

  • 服務發(fā)現

  • 健康檢查

  • 安全性

從表面上看罪针,API 網關和 Service Mesh 似乎解決了相同的問題彭羹,因此好像是多余的。它們確實解決了相同的問題泪酱,但是應用在不同的場景派殷。API 網關被部署為業(yè)務解決方案的一部分,被外部的服務發(fā)現墓阀,處理縱向的流量(面對外部客戶端)毡惜,但是,Service Mesh 是用來處理橫向流量(在不同的微服務之間)岂津。

實現 Service Mesh 可避免在您自己的代碼中出現一些彈性交互虱黄,例如熔斷器、服務發(fā)現吮成、健康檢查以及服務觀察橱乱。對于少量的微服務,應考慮使用其他替代方法來進行故障管理粱甫,因為 Service Mesh 集成可能代價太大了泳叠。但對于大量的微服務,它的收益是顯著的茶宵。

結合這兩種技術可能是確保應用程序正常運行時間和彈性伸縮能力的一種有效方法危纫,同時又可以確保您的應用程序易于使用。將兩者視為同樣的產品是不對的乌庶,最好將兩者視為在涉及微服務和 API 的部署中相輔相成的工具种蝶。

image

API 網關實現的注意事項:

  • 可能產生的單點故障或者瓶頸

  • 由于通過 API 網關進行了額外的網絡跳轉以及復雜性風險,響應時間增長了瞒大。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末螃征,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子透敌,更是在濱河造成了極大的恐慌盯滚,老刑警劉巖踢械,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異魄藕,居然都是意外死亡内列,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門背率,熙熙樓的掌柜王于貴愁眉苦臉地迎上來话瞧,“玉大人,你說我怎么就攤上這事寝姿∫莆龋” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵会油,是天一觀的道長。 經常有香客問我古毛,道長翻翩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任稻薇,我火速辦了婚禮嫂冻,結果婚禮上,老公的妹妹穿的比我還像新娘塞椎。我一直安慰自己桨仿,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布案狠。 她就那樣靜靜地躺著服傍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骂铁。 梳的紋絲不亂的頭發(fā)上吹零,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音拉庵,去河邊找鬼灿椅。 笑死,一個胖子當著我的面吹牛钞支,可吹牛的內容都是我干的茫蛹。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼烁挟,長吁一口氣:“原來是場噩夢啊……” “哼婴洼!你這毒婦竟也來了?” 一聲冷哼從身側響起信夫,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤窃蹋,失蹤者是張志新(化名)和其女友劉穎卡啰,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體警没,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匈辱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了杀迹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡脸。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖树酪,靈堂內的尸體忽然破棺而出浅碾,到底是詐尸還是另有隱情,我是刑警寧澤续语,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布垂谢,位于F島的核電站,受9級特大地震影響疮茄,放射性物質發(fā)生泄漏滥朱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一力试、第九天 我趴在偏房一處隱蔽的房頂上張望徙邻。 院中可真熱鬧,春花似錦畸裳、人聲如沸缰犁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帅容。三九已至,卻和暖如春蓬抄,著一層夾襖步出監(jiān)牢的瞬間丰嘉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工嚷缭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饮亏,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓阅爽,卻偏偏與公主長得像路幸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子付翁,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351