從功能和職責上說:

從部署上說:

在這里引入兩個使用非常廣泛的術語:

解釋一下“東西南北”的由來:如上圖所示,通常在地圖上習慣性的遵循“上北下南,左東右西”的原則。

總結:Service Mesh 和 API Gateway 在功能和職責上分工明確,界限清晰。但如果事情就這么結束,也就不會出現 Service Mesh 和 API Gateway 關系的討論了,自然也不會有本文。

問題的根源在哪里?

強烈推薦閱讀:附錄中 Christian Posta 的文章 “Do I Need an API Gateway if I Use a Service Mesh?”對此有深度分析和講解。

哲學問題:網關訪問內部服務,算東西向還是南北向?

如下圖所示,圖中黃色的線條表示的是 API Gateway 訪問內部服務:

問題來了,從流量走向看:這是外部流量進入系統后,開始訪問對外暴露的服務,應該屬于“南北向”通訊,典型如上圖的畫法。但從另外一個角度,如果我們將 API Gateway 邏輯上拆分為兩個部分,先忽略對外暴露的部分,單獨只看 API Gateway 訪問內部服務的部分,這時可以視 API Gateway 為一個普通的客戶端服務,它和內部服務的通訊更像是“東西向”通訊:

所以,API Gateway 作為一個客戶端訪問內部服務時,到底算南北向還是東西向,就成為一個哲學問題:完全取決于我們如何看待 API Gateway ,是作為一個整體,還是邏輯上分拆為對內對外兩個部分。

這個哲學問題并非無厘頭,在 API Gateway 的各種產品中,關于如何實現 “API Gateway 作為一個客戶端訪問內部服務” ,就通常分成兩個流派:

  1. 涇渭分明:視 API Gateway 和內部服務為兩個獨立事物,API Gateway 訪問內部服務的通訊機制自行實現,獨立于服務間通訊的機制
  2. 兼容并濟:視 API Gateway 為一個普通的內部服務的客戶端,重用其內部服務間通訊的機制。

而最終決策通常也和產品的定位有關:如果希望維持 API Gateway 的獨立產品定位,希望可以在不同的服務間通訊方案下都可以使用,則通常選擇前者,典型如 kong;如果和服務間通訊方案有非常深的淵源,則通常選擇后者,典型如 springcloud 生態下的 zuul 和 springcloud gateway。

但無論選擇哪個流派,都改變不了一個事實,當 “API Gateway 作為一個客戶端訪問內部服務” 時,它的確和一個普通內部服務作為客戶端去訪問其他服務沒有本質差異:服務發現,負載均衡,流量路由,熔斷,限流,服務降級,故障注入,日志,監控,鏈路追蹤,訪問控制,加密,身份認證… 當我們把網關訪問內部服務的功能一一列出來時,發現幾乎所有的這些功能都是和服務間調用重復。

這也就造成了一個普遍現象:如果已有一個成熟的服務間通訊框架,再去考慮實現 API Gateway,重用這些重復的能力就成為自然而然的選擇。典型如前面提到的 springcloud 生態下的 zuul 以及后面開發的 springcloud gateway,就是以重用類庫的方式實現了這些能力的重用。

這里又是一個類似的哲學問題:當 “API Gateway 作為一個客戶端訪問內部服務” 時,它以重用類庫的方式實現了代碼級別的能力重用,相當于自行實現了一個和普通服務間通訊方案完全一樣的客戶端,那這個“客戶端”發出來的流量算東西向還是南北向?

答案不重要。

Sidecar:真正的重合點

在進入 servicemesh 時代之后,Servicemesh 和 API gateway 的關系開始是這樣:

  1. 功能和職責清晰劃分
  2. 客戶端訪問服務的功能高度重疊

此時兩者的關系很清晰,而且由于當時 Servicemesh 和 API Gateway 是不同的產品,兩者的重合點只是在功能上。

而隨著時間的推移,當 Servicemesh 產品和 API Gateway 產品開始出現相互滲透時,兩者的關系就開始變得曖昧。

在 Servicemesh 出現之后,如何為基于 Servicemesh 的服務選擇合適的 API Gateway 方案,就慢慢開始提上日程,而其中選擇重用 Servicemesh 的能力也自然成為一個探索的方向,并逐步出現新式 API Gateway 產品,其想法很直接:

如何融合東西向和南北向的通訊方案?

其中的一個做法就是基于 Servicemesh 的 Sidecar 來實現 API Gateway,從而在南北向通訊中引入 Servicemesh 這種東西向通訊的方案。這里我們不展開細節,我這里援引一個圖片(鳴謝趙化冰同學)來解釋這個方案的思路:

這個時候 servicemesh 和 API Gateway 的關系就變得有意思了,因為 servicemesh 中 sidecar 的引入,所以前面的“哲學問題”又有了一個新的解法:API Gateway 這次真的可以分拆為兩個獨立部署的物理實體,而不是邏輯上的兩個部分:

  1. API Gateway 本體:實現 API Gateway 除了訪問內部服務之外的功能
  2. Sidecar:按照 servicemesh 的標準做法, 我們視 API Gateway 為一個部署于 servicemesh 中的普通服務,為這個服務 1:1 的部署 sidecar

在這個方案中,原來用于 servicemesh 的 sidecar,被用在了 API Gateway 中,替代了 API Gateway 中原有的客戶端訪問的各種功能。這個方案讓 API Gateway 的實現簡化了很多,也實現了東西向和南北向通訊能力的重用和融合,而 API Gateway 可以更專注于 “API Management” 的核心功能。

此時 servicemesh 和 API Gateway 的關系就從“涇渭分明”變成了“兼容并濟”。

而采用這個方案的公司,通常都是先有 servicemesh 產品,再基于 servicemesh 產品規劃(或者重新規劃)API Gateway 方案,典型如螞蟻金服的 SOFA Gateway 產品是基于 MOSN,而社區開源產品 Ambassador 和 Gloo 都是基于 Envoy。

上述方案的優勢在于 API Gateway 和 Sidecar 獨立部署,職責明確,架構清晰。但是,和 servicemesh 使用 sidecar 被質疑多一跳會造成性能開銷影響效率一樣,API Gateway 使用 Sidecar 也被同樣的質疑:多了一跳…

解決“多一跳”問題的方法簡單而粗暴,基于 sidecar,將 API Gateway 的功能加進來。這樣 API Gateway 本體和 Sidecar 再次合二為一:

至于走到這一步之后,Servicemesh 和 API Gateway 是什么關系:這到底算是 Servicemesh/sidecar 融合了 API Gateway,還是 API Gateway 融合了 Servicemesh/Sidecar?這個問題就像斑馬到底是白底黑紋還是黑底白紋一樣,見仁見智。

BFF:把融合進行到底

BFF(Backend For Frontend)的引入會讓 Servicemesh 和 API Gateway 走到一個更加親密的地步。

先來看看常規的 BFF 的玩法:

在這里,多增加了一個 BFF 層,介于 API Gateway 和內部服務(包括組合服務和原子微服務)之間。注意 BFF 的工作模式和組合服務很類似,都是組合多個服務。但差別在于:

  1. 組合服務還屬于服務的范疇,只是實現機制上組合了多個服務,對外暴露的依然是一個完整和規范的服務
  2. BFF 不同,BFF 如名字所示,Backend For Frontend,完全是為了前端而存在,核心目標之一是簡化前端的訪問
  3. 對我們今天的話題而言,最關鍵的一點:BFF 完全收口了從外部進入的流量,而組合服務沒有,API Gateway 是可以直接訪問原子微服務的

“BFF 完全收口外部流量”,這一點在 API Gateway 和 Sidecar 融合之后,會變得很有想象空間,我們先看按照前面的融合方式,在有 BFF 的情況下,API Gateway 和 Sidecar 融合后的情景:

放大一點,單獨看 API Gateway 和 BFF:

注意到,流量從被 API Gateway 接收,到進入 BFF 在這個流程中,這個請求路徑中有兩個 sidecar:

  1. 和 BFF 部署在一起的,是沒有 API Gateway 功能的普通 Sidecar
  2. API Gateway 和 Sidecar 融合之后,這就是一個“有 API Gateway 功能的大 Sidecar”(或者是“有 Sidecar 功能的特殊 API Gateway”):雖然扮演了 API Gateway 的角色,但本質上依然包含一個完整功能的 sidecar,和 BFF 自帶的 Sidecar 是等同的

所以,問題來了:為什么要放兩個 sidecar 在流程中,縮減到一個會怎么樣?我們嘗試將兩個 Sidecar 合二為一,去掉 BFF 自帶的 Sidecar,直接把扮演 API Gateway 的 sidecar 給 BFF 用:

此時的場景是這樣:

  1. 流量直接打到 BFF 上(BFF 前面可能會掛其他的網絡組件提供負載均衡等功能)
  2. BFF 的 sidecar 接收流量,完成 API Gateway 的功能,然后將流量轉給 BFF
  3. BFF 通過 sidecar 調用內部服務(和沒有合并時一致)

注意這里有一個關鍵點,在前面時特意注明的:“BFF 完全收口外部流量”。這是前提條件,因為原有的 API Gateway 集群已經不再存在,如果 BFF 沒能收口全部流量,則這些未能收口的流量會找不到 API Gateway。當然,如果愿意稍微麻煩一點,在部署時清晰的劃定需要暴露給外界的服務,直接在這些服務上部署帶 API Gateway 功能的 Sidecar,也是可行的,只是管理上會比 BFF 模式要復雜一些。

另外,在部署上,按照上面的方案,我們會發現:API Gateway“消失”了 —— 不再有一個明確物理部署的 API Gateway 的集群,常規的中心化的網關在這個方案中被融合到每一個 BFF 的實例中,從而實現另外一個重要特性:去中心化。

上述 Servicemesh 和 API Gateway 融合的方案,并未停留在紙面上。

在螞蟻金服內部,我們基于 Servicemesh 和 API Gateway 融合 + 去中心化的思路,進行過開創性的實踐和探索。以支付寶移動網關為例,在過去十年間,網關經歷了從單體到微服務,從中心化到去中心化,從共享的 gateway.jar 包到利用 MOSN 實現網關 Mesh 化/Sidecar 化,最終演變成了這樣一個方案:

強烈推薦閱讀:附錄中我的同事 賈島 的文章 “螞蟻金服 API Gateway Mesh 思考與實踐” 對此有深入介紹和詳細描述。

總結

本文總結了 Servicemesh 和 API Gateway 的關系,整體上說兩者的定位和職責“涇渭分明”,但在具體實現上,開始出現融合的趨勢:早期傳統方式是類庫級別的代碼復用,最新趨勢是 API Gateway 和 Sidecar 合二為一。

后者的發展才剛剛起步,包括在螞蟻金服我們也是才開始探索這個方向,但是相信在未來一兩年間,社區可能會有更多的類似產品形態出現。

補充介紹一下文中多次提到的“MOSN”:

MOSN 是 MOSN 是 Modular Open Smart Network 的簡稱, 是一款使用 Go 語言開發的網絡代理軟件,由螞蟻金服開源并經過幾十萬容器的生產級驗證。 MOSN 作為云原生的網絡數據平面,旨在為服務提供多協議、模塊化、智能化、安全的代理能力。 MOSN 可以與任何支持 xDS API 的 Service Mesh 集成,亦可以作為獨立的四、七層負載均衡,API Gateway、云原生 Ingress 等使用。

附錄:參考資料和推薦閱讀

意猶未盡的同學,歡迎繼續閱讀以下內容。

按文章發表的時間排序:

原文鏈接:Service Mesh 和 API Gateway 關系深度探討,作者:敖小劍

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
返回頂部
上一篇
XMLHttpRequest API 交互式指南
下一篇
面向初學者的10個API測試技巧(SOAP 和 REST)
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
福利一区福利二区| 国产精品伦理在线| 精品一区二区三区免费观看| 欧美另类高清zo欧美| 久久久久国产成人精品亚洲午夜 | 亚洲高清免费观看高清完整版在线观看| 一区二区三区中文字幕电影 | 性久久久久久久久久久久| jvid福利写真一区二区三区| 日韩女优制服丝袜电影| 国产精品2024| 欧美一区午夜视频在线观看| 久久久久高清精品| 欧美国产精品一区二区| 色婷婷亚洲精品| 国产a级毛片一区| 26uuu欧美| 国产一区不卡视频| 不卡一区二区三区四区| 欧美视频在线一区二区三区| 日韩一二三四区| 亚洲久本草在线中文字幕| 精品国产免费久久 | 国产尤物一区二区| 欧美日韩另类国产亚洲欧美一级| av亚洲精华国产精华精华| 天天做天天摸天天爽国产一区 | 亚洲国产岛国毛片在线| 成人午夜免费视频| 一区二区三区在线免费| 91精品欧美综合在线观看最新| 国产精一区二区三区| 中文一区一区三区高中清不卡| 国产自产高清不卡| 99re亚洲国产精品| 福利一区福利二区| 欧美日韩精品一区二区天天拍小说 | 国产伦理精品不卡| 国产激情一区二区三区四区| 亚洲午夜一区二区三区| 91.xcao| 一区二区在线观看视频| 不卡一区二区三区四区| 欧美日韩国产片| 国产欧美日韩久久| 夜夜精品视频一区二区| 日产国产欧美视频一区精品| 亚洲图片你懂的| 国产精品乱码人人做人人爱 | 久久久久国产精品人| 欧美美女一区二区三区| 亚洲国产日韩一区二区| 欧美性做爰猛烈叫床潮| 五月婷婷色综合| 不卡的av电影| 欧美色成人综合| 成人激情校园春色| 欧美激情综合网| 亚洲成人资源网| 丁香激情综合五月| 欧美日韩电影在线播放| 欧美高清视频在线高清观看mv色露露十八 | av午夜一区麻豆| 亚洲成人精品在线观看| 久久人人爽爽爽人久久久| 三级不卡在线观看| 一本色道亚洲精品aⅴ| 久久久九九九九| 蜜臀精品一区二区三区在线观看 | 国产精品女主播av| 日韩亚洲电影在线| 色婷婷一区二区三区四区| 久久精品国产精品亚洲综合| 日韩亚洲欧美在线观看| 国产在线不卡一区| 日韩欧美高清一区| 欧美群妇大交群的观看方式| 日韩精品专区在线影院观看| 91精选在线观看| 一区二区三区高清不卡| 久久精品国内一区二区三区| 一本色道综合亚洲| 欧美天堂亚洲电影院在线播放| 美女在线观看视频一区二区| 国产成人免费视频网站高清观看视频| 欧美在线你懂得| 久久久噜噜噜久久人人看| 亚洲精品v日韩精品| 极品少妇xxxx偷拍精品少妇| 中文字幕乱码日本亚洲一区二区| 中文字幕一区在线观看视频| 亚洲国产精品久久不卡毛片| 亚洲国产成人自拍| 欧美日韩精品高清| 一区二区三区精品| 青青草91视频| 欧美色图第一页| 人人超碰91尤物精品国产| 在线观看免费视频综合| 一本久道久久综合中文字幕| 精品国产乱子伦一区| 亚洲精品国久久99热| 久久成人av少妇免费| 日韩欧美中文字幕公布| 亚洲综合一区二区| 欧美日本免费一区二区三区| 亚洲在线视频免费观看| 2023国产精品视频| 99精品视频一区二区三区| 一区二区高清在线| 中文字幕在线不卡一区二区三区 | av成人动漫在线观看| 国产日韩精品一区二区三区| 丁香婷婷综合激情五月色| 国产精品久久网站| 欧美日本在线看| 久久精品亚洲国产奇米99| 麻豆精品蜜桃视频网站| 日韩中文字幕不卡| 日韩一区二区三区四区| 亚洲国产精品久久久男人的天堂 | 中文字幕av不卡| 欧美三级欧美一级| 亚洲一区二区三区四区五区黄| 337p粉嫩大胆色噜噜噜噜亚洲| 精品国产乱码久久| 午夜精品成人在线| 国产一区二区三区四| 日韩成人午夜电影| 日韩国产高清影视| 欧美变态tickling挠脚心| 久久99精品久久只有精品| 制服丝袜中文字幕亚洲| 久久久久久亚洲综合影院红桃| 9人人澡人人爽人人精品| 在线观看亚洲专区| 在线欧美日韩精品| 蜜臀av性久久久久蜜臀av麻豆| 欧美三级三级三级| 99久久精品国产观看| 欧美一区二区三区四区五区| 久久久久99精品一区| 日本一二三不卡| 亚洲国产精品尤物yw在线观看| 欧美美女直播网站| 日韩国产精品久久久久久亚洲| 亚洲第一综合色| 色婷婷狠狠综合| 一区二区中文视频| 亚洲男同性视频| 亚洲一区二区三区四区五区中文 | 久久综合色之久久综合| 免费视频一区二区| 91国偷自产一区二区开放时间| 欧美日韩aaaaaa| 蜜芽一区二区三区| 国产欧美日韩另类视频免费观看| 国产高清不卡二三区| 久久久久久久电影| 成人一区二区三区视频在线观看| 午夜精品一区二区三区电影天堂| 亚洲欧美综合在线精品| 久久香蕉国产线看观看99| 欧美丰满少妇xxxxx高潮对白 | 91麻豆精品国产91久久久资源速度 | 国产在线播放一区三区四| 欧美刺激午夜性久久久久久久| 中文欧美字幕免费| 国产一区 二区 三区一级| 91久久国产综合久久| 99久久er热在这里只有精品15| 日韩欧美激情在线| 精品一区二区三区影院在线午夜 | 欧美三级韩国三级日本三斤 | 亚洲欧洲成人av每日更新| 成人黄色综合网站| 亚洲国产美女搞黄色| 国产精品久久久久永久免费观看 | 久久精品国产一区二区三| 欧美精品九九99久久| 白白色亚洲国产精品| 欧美成人三级在线| 欧美一a一片一级一片| 自拍视频在线观看一区二区| 国产精品99久久久久久有的能看| 欧美最新大片在线看| 在线视频你懂得一区| 理论片日本一区| 亚洲欧美日韩在线| 亚洲精品第一国产综合野| 色综合色狠狠天天综合色| 高清不卡在线观看av| 9人人澡人人爽人人精品| 99精品黄色片免费大全| 国产成人综合网站| 亚洲精品一区二区三区香蕉| 99久久国产综合色|国产精品| 久久99热这里只有精品| 综合久久久久久久| 亚洲欧美日韩国产手机在线 |