騷年快答 | 微服務架構中的BFF到底是啥?

2020-08-29 EdisonTalk

騷年快答,答你所問


昨天的騷年快答《》一文中留下一個問題:BFF是啥?為啥在API網關和業務中臺之間加入了一層BFF?考慮到在實際工作中,我的大部分同事都問過這個問題,這裡我也總結一下進行答覆。

1 從一個MyShop開始說起

為了講清BFF是個啥,這裡引用我在波波老師的課程《Spring Boot與K8s雲原生應用開發》中學到的一個案例,來跟大家分享一下,並盡力說清楚BFF是啥,又是如何演化出來的。

假設我們在一個開發團隊中,開發了一個叫做MyShop的電商項目,它採用的是微服務的架構風格。它經歷過幾次架構調整,我們就跟著它的調整來看看BFF是怎麼演化出來的。

MyShop v1

假設v1版本在七八年之前,MyShop已經採用了服務化的架構,它的客戶端也主要還是以傳統的Web應用為主。在當時,它的SOA架構已經算是跟上了潮流。

轉眼之間,來到了四五年前,MyShop升級為了v2版本,它的架構如下圖所示:

MyShop v2

可以看到,這個時候已經進入了移動網際網路時代,MyShop為了緊跟時代,也推出了自己的無線應用App。為了能夠儘快上線,MyShop團隊的架構師設計了v2架構,它為App端新增了一個Nginx反向代理,可以使App入口直接訪問API微服務。

但是,這個急於求成的v2架構存在以下問題:

(1)App端和內部的API微服務存在一個強耦合的關係(包括接口耦合和域名耦合),任何一邊的變化都會對另外一邊造成一定影響。

(2)每個對外暴露的服務,都需要新的域名,而域名是需要買的,是需要承擔成本的。

(3)內部的API微服務一股腦地暴露在了公網上面,存在很大的安全風險。

(4)App客戶端需要開發大量的聚合裁剪的邏輯,客戶端很重且重複勞動。(所謂聚合裁剪,解釋一下,聚合就是一次需要從多個微服務獲取數據進行整合使用,而裁剪就是需要對微服務返回的數據進行過濾,可能只會用到其中一部分的欄位數據)

2 引入BFF的MyShop v2.5

由於v2版本存在的問題太多,於是架構團隊決定在Nginx和內部API微服務之間引入一層無線BFF(英文全稱:Backend For Frontend,指為前端應用開發的後端服務)來解決這個問題,也就有了下面的v2.5版本的架構。

MyShop v2.5

我們可以將BFF看做是一個後端微服務的代理服務,它主要做聚合和裁剪的邏輯,方便客戶端接入和訪問。可以看到,引入了BFF之後,降低了App端與後端微服務之間的耦合,從而避免了v2版本提到的強耦合問題。此外,App端只需要知道BFF的域名即可,內部微服務也躲在BFF之後不需要暴露在公網之上。

由於v2.5版本解決了很多問題,因此成功上線,也為MyShop無線業務的發展做了很大的支持。

但是,隨著業務的不斷快速發展,單塊的無線BFF堆積了大量的不同業務線的邏輯變得越來越臃腫,升級維護也變得越來越困難。此外,根據康威法則,單塊的無線BFF和多團隊也出現了不匹配的問題,即團隊之間溝通成本變低,交付成本也就會變高。最後,無線BFF裡面除了多業務線的聚合裁剪邏輯,還引入了Cross-Cutting(跨橫切面)的邏輯,比如安全認證、日誌監控、限流熔斷等等。隨著時間的推移,代碼變得越來越複雜,技術棧越堆越多,開發效率也不斷下降。(當然,還有單點問題等等,這裡就不多贅述了)

3 網關+BFF模式的MyShop v3

為了解決v2.5版本存在的問題,架構團隊經過進一步思考,一方面決定將單塊的無線BFF進行解耦拆分,針對不同的業務線引入獨立的微服務集群。另一方面,決定在無線BFF和Nginx之間再引入一個新的角色:API網關,並將Cross-Cutting的職責轉移到API網關上。自此,v3架構出爐,如下圖所示:


MyShop v3

v3架構下,BFF按照團隊或業務線的邊界進行劃分,每個業務線團隊可以並行各自開發和交付BFF。而網關則由單獨的中間件或框架團隊進行開發和維護,它專注於路由轉發和Cross-Cutting層面的功能建設,讓業務線團隊專注於業務邏輯的開發。

我們.NET程式設計師所熟知的Ocelot網關項目(對,就是張隊參與貢獻的那個網關項目),就幫助我們實現了路由轉發和Cross-Cutting的功能,例如限流熔斷、集中鑑權(例如集成IdentityServer)、負載均衡、調用追蹤等。

Ocelot

4 乘風破浪的MyShop v4

最近一兩年呢,MyShop團隊迎來了新的業務和技術的發展需求,要開放內部的企業級能力建設OpenAPI開放平臺,還想要藉助第三方的力量在MyShop平臺上進行創新打造生態從而豐富MyShop的應用形態。此外,SPA單頁應用、H5前後端分離應用等多類型的應用客戶端也需要接入。架構團隊設計了一個如下圖所示的v4架構,從而滿足快速發展的已有和未來可能的需求:

MyShop v4

在v4架構下,移除了原來偏運維層面的Nginx反向代理,轉而統一使用可變成型較強的網關作為客戶端應用入口。這裡的網關也進行解耦拆分,針對不同的客戶端應用場景,分為了四個類型,如開放平臺網關、H5網關、無線網關和Web應用網關。而BFF層面,也根據業務線拆分為了無線BFF、H5 BFF及開放平臺BFF。整個架構層次清晰,職責分明,是一種靈活的、方便支持MyShop業務快速發展的架構。

相信看到這裡,你大概應該明白了BFF是個啥,它在微服務架構中的位置和作用,以及它是如何演化出來的。

畫外音:如果還沒明白,那就再看一遍!

5 我司還處於v3架構階段

剛剛通過MyShop的案例架構演化,講解了BFF和網關是如何演化出來的。那麼,你可能會問,我司的架構處在哪個階段。這裡,回答一下,還在v3階段。

我司目前的總體技術體系

可以從這個技術體系圖中看到,作為應用服務層的API服務就是BFF,他們會從基礎業務服務如客戶服務、訂單服務、產品服務等微服務中獲取數據,進行一定的聚合和裁剪返回個某個具體業務線的前端應用,前端應用可能是SPA也可能是H5應用。BFF層的API服務,我們在實踐中大部分都使用了ASP.NET Core進行開發,同時也在嘗試使用Go進行開發,也讓前端有興趣的同事引入進來用Go進行BFF的開發。但是,在基礎服務層面即前面所說的業務中臺層,還是由後端同事使用ASP.NET Core開發,確保質量。

API網關層面,我們使用的是Ocelot,集成了鑑權認證等工作,前端統一隻需要記住網關的域名即可,帶上合法的token訪問即可獲取數據返回。很多人說Ocelot性能低建議使用Kong,但是我司業務量小啊,所以目前沒啥問題,用得好好的。內部微服務之間的相互調用,我們目前也是走了API網關(區別於外部應用訪問的網關,這裡我稱之為內部網關),不過為了方便(其實是懶),我們對於內部信任的服務間調用,沒有走JWT認證,當然也可以選擇Client Credentials(客戶端憑證)模式。

對於現階段的我們的架構來說,只能說是夠用,因為業務量真的不大,也沒必要為了上所謂的高性能高可用架構做過多的設計,對傳統家居裝飾行業的企業來說,IT先滿足業務支持業務快速發展吧。數位化轉型,也並不是一次就吃個胖子,慢慢演進吧。

最後,想著是快答,居然也洋洋灑灑寫了這麼多,希望對你有所幫助吧!

畫外音:如果看到這裡,你都不點個讚,有點那啥了...

上期精彩


專欄:EdisonTalk(愛迪生說)

本文作者EdisonZhou,架構師,阿里雲MVP,博客園&34;博主,Scrum聯盟認證CSM,公眾號「恰童鞋騷年」作者,.NET Core布道者,愛好持續閱讀與分享。

相關焦點

  • 騷年快答 | 技術與業務中臺到底講了什麼?
    騷年快答,答你所問最近有童鞋在我之前發布的《》一文中提問:技術中臺是什麼?和業務中臺又有什麼區別?這就是阿里的技術中臺,它強調基礎設施和中間件的抽象整合,為業務中臺服務(一般以微服務形式展現)提供通用基礎能力的支撐,讓業務中臺服務能夠專注於自己的業務領域邏輯開發,減少對於通用基礎能力的耗時。
  • 騷年快答 | 微服務安全認證架構如何演進來的?
    騷年快答,答你所問之前有同事問為何要用基於JWT令牌的認證架構,然後近期又有童鞋在後臺留言問微服務安全認證架構的實踐為了答好這個話題,我們先來看看微服務的安全認證架構是如何演進而來的,從而更好的理解。1 單塊階段(上)首先,我們有必要再次了解下認證和授權這兩個基本概念:認證,Authentication,識別你是誰。即在網站上用來識別某個用戶是否是註冊過的合法用戶。
  • 騷年快答 | JWT到底是個什麼鬼?
    騷年快答,答你所問我們了解了微服務安全認證架構是如何演進而來的,但是發現v2.5架構仍然較重,有沒有輕量級一點的方法呢?其實業界早已有了實踐,它就是基於JWT的安全認證架構。JWT到底是個什麼鬼呢?本篇為你解答!
  • 騷年快答 | 為何微服務項目都使用單體代碼倉庫?
    對於多體倉庫的缺點,單體倉庫解決了一些,這也就形成了單體倉庫的好處:一來易於規範化項目代碼,所有微服務都在一個倉庫中,可以規範代碼風格,便於集中組織Code Review。二來易於整體集成和部署,所有微服務都在一個倉庫中,配合DevOps工具可以方便地實現一鍵構建和部署,實現持續集成。
  • 企業從單體架構向微服務架構轉型的 9 個難點
    使用微服務架構方案能解決企業面臨的很多挑戰,而且目前微服務架構的框架都比較成熟,例如Spring cloud或者dubbo在各大網際網路平臺都有成功案例,但看似簡單的框架在實際開發過程中會面臨很多問題。本文整理了企業從單體架構向微服務架構轉型的中的設計難點問題。
  • 太香了這份架構解密:從分布式到微服務(第二版),神仙進階指南
    有這樣一本神奇的架構書讀者可以在字裡行間見證微服務的發展脈絡大到分布式、微服務、雲原生、K8s、Service Mesh小到網絡、分布式系統、RPC、分布式存儲、分布式計算、全文檢索與消息隊列中間件等這就是《架構解密:從分布式到微服務(第2版)》解密架構發展脈絡和梳理原理之旅就等你啦!
  • 你問我答:現有的應用有必要做微服務改造嗎?
    BoCloud博雲微信公眾號【你問我答】小欄目,將收集和整理企業在IT建設所遇到的問題與難題,由博雲產品與技術團隊進行針對性回答,每周五通過【你問我答】欄目進行發布,希望能為企業IT建設提供思路與方法。
  • 微服務架構:初識Spring Cloud
    現在無論大小公司,都會講究微服務設計,無論應用大小,都會進行微服務架構,面試的時候,也會把微服務當成必談的知識點。那麼什麼是微服務呢?,簡單的來說,微服務是系統架構上的一種設計風格,它的目的就是將一個原本獨立垂直的系統拆分成多個小型服務,這些小型服務都在各自獨立的進程中運行,服務之間是通過基於HTTP的Restful API進行通信協議。
  • 微服務架構變更實錄
    記錄我所經歷的微服務架構變更過程。單體應用初期最常見的一種架構模式,採用單體架構,服務端和頁面在一個war包項目中。優點上線最快,在業務深耕的過程中,單體應用已經難以應付業務複雜度和數據量。架構師為了救我們於水火之中,給我們帶來了微服務。概括來講,就是 拆!服務端拆分,業務按db結構拆分為不同的微服務,上層產品服務調用微服務,負責聚合編排。前後端分離,nodejs替換服務端渲染,負責頁面展示、路由及登陸鑑權。
  • 從零開始學微服務,阿里巴巴微服務架構到底有多牛逼?
    近幾年,微服務架構迅速在整個技術社區竄紅,它被認為是 IT軟體架構的未來方向。熱度雖高,但對於很多中小公司來說微服務卻是遙不可及,因為團隊規模和能力又反過來制約了他們採用新技術的步伐。很多人對於微服務技術也都有著一些疑慮,比如:微服務這技術雖然面試的時候總有人提,但作為一個開發,是不是和我關係不大?那不都是架構師的事嗎?
  • 企業IT架構轉型中微服務架構實踐中常見問題總結
    >今天討論下在微服務架構實踐中經常遇到的一些問題的思考,其中有些來源於我們自己的微服務改造項目,有些來源於客戶現場微服務架構實施項目和售前方案溝通。,中臺架構等的區別等,也可以參考我前面發布過的文章。要確保每個微服務都獨立自治和鬆耦合,那麼微服務從資料庫到邏輯層到前臺全部都要進行縱向拆分。即資料庫的拆分是整個微服務架構設計中的一個關鍵內容。而這裡有一個關鍵思考就是,在微服務實踐中你會看到,實際上你上層的微服務組件的拆分相當來說會更加細,一個不算複雜的業務系統拆分到20到30個微服務組件都是正常情況。
  • 微服務架構一直火,為什麼服務化要搞懂?
    微服務架構,這 5 年左右一直被認可,是軟體架構的未來方向。需要大家理解的是,為什麼需要服務化。比如微服務架構對企業來說,帶來什麼價值?有啥弊端?這裡淺談一下微服務架構,主要還是在理解 Why :為什麼需要服務化?
  • 精讀| 什麼是微服務架構?
    這篇博文可以幫助你理解,開發者們是如何根據自己的需求,使用微服務來擴展應用的。在這篇文章中,你將了解到:● 為什麼要用微服務?● 什麼是微服務?進入到正文後,作者首先帶我們了解的是——為什麼要使用微服務,以及以前的一體化架構到底有哪些缺點。
  • 看完這份微服務架構與實踐文檔,微服務不在難
    我們對於微服務架構的概念,相信大家應該都不陌生,無論使用 Apache Dubbo、還是 Spring Cloud,都可以去嘗試微服務,把複雜而龐大的業務系統拆分成一些更小粒度且獨立部署的 Rest 服務。但是這個過程,具體應該怎麼做?現有的條件下到底要不要做微服務?服務拆分成什麼粒度才是合適的?遺留的老系統需要如何考慮重構改造?有哪些坑需要我們注意?
  • MQ在架構中扮演的角色到底是什麼以及它為什麼比資料庫快
    異步架構相比同步架構來說,其優勢在於,請求可以更快地返回,也就意味著,時間段內可以處理更多的請求,系統的吞吐量會更大。其根本原因在於,落MQ要比落庫快,且快得多。這裡,有個疑問:MQ在做消息持久化時,會讀寫磁碟,資料庫也是讀寫磁碟。為什麼MQ的IO就比資料庫的IO快呢?
  • 阿里微服務布道師:詳解微服務架構設計
    相對單體架構,微服務架構是更面向業務創新的一種架構模式。獨立團隊和自治 團隊對服務的整個生命周期負責,工作在獨立的上下文中,自己決策自己治理,而不需要統一的指揮中心。團隊和團隊之間通過鬆散的社區部落進行銜接。
  • 詳解微服務架構(一):什麼是微服務
    這一切都催生了新的架構設計風格 – 微服務架構的出現。什麼是微服務微服務是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。
  • 對微服務架構設計實踐中若干問題的探討
    微服務網關和註冊中心微服務相關關鍵技術,如限流熔斷,安全,服務鏈監控等對於微服務相關的基礎知識,大家在網上基本都可以搜索到就不再重複敘述,對於SOA和微服務,中臺架構等的區別等,也可以參考我前面發布過的文章
  • 什麼是微服務架構,如何做服務拆分?
    >單體架構概述:把所有的業務模塊都堆砌在一個系統中,然後把系統打成一個war包或者jar包運行在應用伺服器中單體架構的優點:微服務架構的特徵:每個微服務可獨立運行在自己的進程裡一系列獨立運行的微服務共同構建起整個系統每個微服務可用獨立的開發,在開發過程中只關注一個業務模塊的特定功能
  • 八年架構師講述Dubbo和Spring Cloud微服務架構
    微服務架構是網際網路很熱門的話題,是網際網路技術發展的必然結果。它提倡將單一應用程式劃分成一組小的服務,服務之間互相協調、互相配合,為用戶提供最終價值。雖然微服務架構沒有公認的技術標準和規範或者草案,但業界已經有一些很有影響力的開源微服務架構框架提供了微服務的關鍵思路,例如Dubbo和Spring Cloud。各大網際網路公司也有自研的微服務框架,但其模式都於這二者相差不大。