日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

如何處理好微服務(wù)之間千絲萬縷的關(guān)系?到BFF大顯身手了

來源: 責(zé)編: 時間:2024-04-25 17:40:46 213觀看
導(dǎo)讀在我們之前設(shè)計的一個供應(yīng)鏈系統(tǒng)中,它包含了商品、銷售訂單、加盟商、門店運營、門店工單等服務(wù),涉及了各種用戶角色,比如總部商品管理、總部門店管理、加盟商員工、門店人員等,而且每個部門的角色還會進行細(xì)分。而且這個

在我們之前設(shè)計的一個供應(yīng)鏈系統(tǒng)中,它包含了商品、銷售訂單、加盟商、門店運營、門店工單等服務(wù),涉及了各種用戶角色,比如總部商品管理、總部門店管理、加盟商員工、門店人員等,而且每個部門的角色還會進行細(xì)分。而且這個系統(tǒng)中還包含了兩個客戶端 App:一個面向客戶,另一個面向公司員工和加盟商。8bE28資訊網(wǎng)——每日最新資訊28at.com

此時,整個供應(yīng)鏈系統(tǒng)的架構(gòu)如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

上圖中的網(wǎng)關(guān)層主要負(fù)責(zé)路由、認(rèn)證、監(jiān)控、限流熔斷等工作。8bE28資訊網(wǎng)——每日最新資訊28at.com

  • 路由:所有的請求都需要通過網(wǎng)關(guān)層進行處理,網(wǎng)關(guān)層再根據(jù) URI 將請求指向?qū)?yīng)的后臺服務(wù),如果同一個服務(wù)存在多個服務(wù)器節(jié)點,網(wǎng)關(guān)層還將承擔(dān)負(fù)載均衡的工作。
  • 認(rèn)證:對所有的請求進行集中認(rèn)證鑒權(quán)。
  • 監(jiān)控:記錄所有的 API 請求數(shù)據(jù),API 管理系統(tǒng)能對 API 調(diào)用實現(xiàn)管理和性能監(jiān)控。
  • 限流熔斷:流量過大時,我們可以在網(wǎng)關(guān)層實現(xiàn)限流。如果后臺服務(wù)響應(yīng)延時或故障,我們可以主動在調(diào)用端的上游服務(wù)做熔斷,以此保護后端服務(wù)資源,同時不影響用戶體驗。

此時,我們的架構(gòu)看起來是不是挺完美?且市面上標(biāo)準(zhǔn)的 Spring Cloud 架構(gòu)都是這樣做的。不過,這個架構(gòu)會出現(xiàn)一些問題,下面我們先通過幾個例子來看看。8bE28資訊網(wǎng)——每日最新資訊28at.com

案例一:

在這個供應(yīng)鏈系統(tǒng)中,很多界面都需要顯示多個服務(wù)數(shù)據(jù),比如在一個 App 首頁中,針對門店運營人員,需要顯示工單數(shù)量、最近的工單、銷售訂單數(shù)據(jù)、最近待處理的訂單、低于庫存安全值的商品等信息。8bE28資訊網(wǎng)——每日最新資訊28at.com

此時第一個問題來了,在接口設(shè)計過程中,我們經(jīng)常糾結(jié)將兩個客戶端 App 調(diào)用的接口存放在哪個服務(wù)中?以至于決策效率低下,而且還會出現(xiàn)職責(zé)劃分不統(tǒng)一的情況。8bE28資訊網(wǎng)——每日最新資訊28at.com

最終我們決定將第一個接口存放在門店服務(wù)中,此時調(diào)用關(guān)系如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

并將第二個接口存放在工單服務(wù)中,此時調(diào)用關(guān)系如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

案例二:

一個用戶的提交操作常常需要修改多個服務(wù)數(shù)據(jù),比如一個提交工單的操作,我們需要修改庫存、銷售訂單狀態(tài)、工單等數(shù)據(jù)。8bE28資訊網(wǎng)——每日最新資訊28at.com

此時第二個問題出現(xiàn)了,因為這樣的需求非常多,所以服務(wù)經(jīng)常被其他多個服務(wù)調(diào)來調(diào)去,導(dǎo)致服務(wù)之間的依賴非常混亂,最終服務(wù)調(diào)用關(guān)系如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

通過上圖,我們發(fā)現(xiàn)服務(wù)間的依賴問題給技術(shù)迭代帶來了地獄般的體驗,關(guān)于這點我們已經(jīng)在 15 講中進行了細(xì)致講解,這里就不過多贅述。8bE28資訊網(wǎng)——每日最新資訊28at.com

為了解決這 2 個問題,最終我們決定抽象一個 API 層。8bE28資訊網(wǎng)——每日最新資訊28at.com

API 層

一般來說,客戶端的接口需要滿足聚合、分布式調(diào)用、裝飾這三種需求。8bE28資訊網(wǎng)——每日最新資訊28at.com

  • 聚合:一個接口需要聚合多個后臺服務(wù)返回的數(shù)據(jù),并將數(shù)據(jù)返回給客戶端。
  • 分布式調(diào)用:一個接口可能需要依次調(diào)用多個后臺服務(wù),才能實現(xiàn)多個后臺服務(wù)的數(shù)據(jù)修改。
  • 裝飾:一個接口需要重新裝飾后臺返回的數(shù)據(jù),比如刪除一些字段或者對某些字段進行封裝,然后組成客戶端需要的數(shù)據(jù)。

因此,我們決定在客戶端與后臺服務(wù)之間增加一個新的 API 層,專門用來滿足上面的三點需求,此時整個架構(gòu)如下圖所示。8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

從圖中我們發(fā)現(xiàn),所有請求經(jīng)過網(wǎng)關(guān)后,全部交由一個共用的 API 層進行處理,而該 API 層沒有自己的數(shù)據(jù)庫,它的主要職責(zé)是調(diào)用其他后臺服務(wù)。8bE28資訊網(wǎng)——每日最新資訊28at.com

通過這樣的設(shè)計方案后,以上兩個問題就得到了很多地解決。8bE28資訊網(wǎng)——每日最新資訊28at.com

  • 應(yīng)該將某個接口放在哪個服務(wù)的糾結(jié)次數(shù)減少了:如果是聚合、裝飾、分布式的調(diào)用邏輯,我們直接把它們放在 API 層。如果是要落庫或者查詢數(shù)據(jù)庫的邏輯,目標(biāo)數(shù)據(jù)在哪個服務(wù)中,我們就把數(shù)據(jù)和邏輯放在哪個服務(wù)中。
  • 后臺服務(wù)之間的依賴也大幅減少了:目前的依賴關(guān)系只有 API 層調(diào)用各個后臺服務(wù)。

此時,我們的設(shè)計方案完美了吧?別高興得太早,還會出現(xiàn)新的問題。8bE28資訊網(wǎng)——每日最新資訊28at.com

客戶端適配問題

在這個供應(yīng)鏈系統(tǒng)中,一系列的接口主要供各種客戶端(比如 App、H5、PC 網(wǎng)頁、小程序等)進行調(diào)用,此時的調(diào)用關(guān)系如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

不過,這種設(shè)計方案會存在三個問題:8bE28資訊網(wǎng)——每日最新資訊28at.com

  • 不同客戶端的頁面細(xì)節(jié)的需求可能不一樣,比如 App 的功能比重大,就會要求頁面中多放一些信息,而小程序的功能比重小,同樣的頁面就會要求少放一些信息,以至于后臺服務(wù)中同一個 API 需要針對不同客戶端實現(xiàn)不同適配;
  • 客戶端經(jīng)常需要進行一些輕微的改動,比如增加一個字段/刪除一個字段,此時我們必須采取數(shù)據(jù)最小化原則來縮減客戶端接口的響應(yīng)速度。而且,為了客戶端這種細(xì)微而頻繁的改動,后臺服務(wù)經(jīng)常需要同步發(fā)版;
  • 結(jié)合 #1 和 #2 我們發(fā)現(xiàn),在后臺服務(wù)的發(fā)版過程中,常常需要綜合考慮不同客戶端的兼容問題,這無形中增加了 API 層為不同客戶端做兼容的復(fù)雜度。

這時該如何解決呢?我們就可以考慮使用 BFF 了。8bE28資訊網(wǎng)——每日最新資訊28at.com

BFF(Backend for Front)

BFF 不是一個架構(gòu),而是一個設(shè)計模式,它的主要職責(zé)是為前端設(shè)計出優(yōu)雅的后臺服務(wù),即一個 API。一般而言,每個客戶端都有自己的 API 服務(wù),此時整個架構(gòu)如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

從上圖可以看到:不同的客戶端請求經(jīng)過同一個網(wǎng)關(guān)后,它們都將分別重定向到為對應(yīng)客戶端設(shè)計的 API 服務(wù)中。因為每個 API 服務(wù)只能針對一種客戶端,所以它們可以對特定的客戶端進行專門優(yōu)化。而去除了兼容邏輯的 API 顯得更輕便,響應(yīng)速度還比通用的 API 服務(wù)更快(因為它不需要判斷不同客戶端的邏輯)。8bE28資訊網(wǎng)——每日最新資訊28at.com

除此之外,每種客戶端還可以實現(xiàn)自己發(fā)布,不需要再跟著其他客戶端一起排期。8bE28資訊網(wǎng)——每日最新資訊28at.com

此時的方案挺完美了吧?還不完美,因為上面的方案屬于一個通用架構(gòu)。在實際業(yè)務(wù)中,我們還需要結(jié)合實際業(yè)務(wù)來定,下面我們深入說明一下實際業(yè)務(wù)需求。8bE28資訊網(wǎng)——每日最新資訊28at.com

前面我們列出了 5 種服務(wù),實際上,整個供應(yīng)鏈系統(tǒng)將近有 100 種服務(wù)。因為它是一個非常龐大的系統(tǒng),且整個業(yè)務(wù)鏈條的所有工作都包含在這個系統(tǒng)中,比如新零售、供應(yīng)鏈、財務(wù)、加盟商、售后、客服等,,這就需要幾百號研發(fā)人員同時進行維護。8bE28資訊網(wǎng)——每日最新資訊28at.com

因為我們共同維護一個 App、PC 界面、新零售、售后、加盟商,還有各自的小程序和 H5,所以為了實現(xiàn)業(yè)務(wù)解耦和分開排期,每個部門需要各自維護自己的 API 服務(wù),而且 App 與 PC 前端也需要根據(jù)部門實現(xiàn)組件化,此時的架構(gòu)如下圖所示。8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

針對以上需求,我們?nèi)绾卧诩夹g(shù)架構(gòu)上進行實現(xiàn)呢?下面具體來看看。8bE28資訊網(wǎng)——每日最新資訊28at.com

技術(shù)架構(gòu)上如何實現(xiàn)?

我們的整套架構(gòu)還是基于 Spring Cloud 設(shè)計的,如下圖所示:8bE28資訊網(wǎng)——每日最新資訊28at.com

8bE28資訊網(wǎng)——每日最新資訊28at.com

下面我們簡單介紹下圖中網(wǎng)關(guān)、API服務(wù)、后臺服務(wù)的作用。8bE28資訊網(wǎng)——每日最新資訊28at.com

  • 網(wǎng)關(guān):網(wǎng)關(guān)使用的是 Spring Cloud Zuul,Zuul 將拉取的注冊存放在 ZooKeeper 的 API 服務(wù)中,然后通過 Feign 調(diào)用 API 服務(wù)。
  • API 服務(wù):API 服務(wù)其實就是一個 Spring Web 服務(wù),它沒有自己的數(shù)據(jù)庫,主要職責(zé)是聚合、分布式調(diào)用及裝飾數(shù)據(jù),并通過 Feign 調(diào)用后臺服務(wù)。
  • 后臺服務(wù):后臺服務(wù)其實也是一個 Spring Web 服務(wù),它有自己的數(shù)據(jù)庫和緩存。

此時的方案看著很完美了,不過它會出現(xiàn) API 之間代碼重復(fù)問題。此時我們該如何解決?且往下看。8bE28資訊網(wǎng)——每日最新資訊28at.com

如何解決 API 之間代碼重復(fù)問題?

雖然 H5 與小程序的布局不同,但是頁面中很多功能一致,也就是說重復(fù)的代碼邏輯主要存在 PC API 和 App API 中。8bE28資訊網(wǎng)——每日最新資訊28at.com

然而,針對重復(fù)代碼的問題,不同部門在設(shè)計時會呈現(xiàn) 3 種不同的邏輯:8bE28資訊網(wǎng)——每日最新資訊28at.com

  • 某些部門將這些重復(fù)的代碼存放在一個 JAR 中,讓幾個 API 服務(wù)實現(xiàn)共用;
  • 某些部門將這些重復(fù)的代碼抽取出來,然后存放在一個叫 CommonAPI 的獨立 API 服務(wù)中,其他 API 服務(wù)直接調(diào)用這個 Common API 就行;
  • 某些部門因為重復(fù)邏輯少,通過評估后,他們發(fā)現(xiàn)維護這些重復(fù)代碼的成本小于維護 #1 中的 JAR 或者 #2 中的 CommonAPI 服務(wù),所以會繼續(xù)讓這些重復(fù)代碼存在。

假如某些 API 服務(wù)提供接口的出入?yún)⑴c后臺服務(wù)的一致,此時該怎么辦? 此時 API 服務(wù)的接口無須做任何事情,因為它只是一個簡單的代理層。8bE28資訊網(wǎng)——每日最新資訊28at.com

于是,有同事提出:“每次一看到這些純代理的 API 接口就不爽,我們能不能想辦法把它們?nèi)サ簟!鞭k法倒是有幾個,我們一起來看看。8bE28資訊網(wǎng)——每日最新資訊28at.com

網(wǎng)關(guān)直接繞過 API 服務(wù)調(diào)用后臺服務(wù),不過這樣就會破壞分層,所以很快被否掉了。8bE28資訊網(wǎng)——每日最新資訊28at.com

在 API 服務(wù)層做一個攔截器,如果 URI 找不到對應(yīng) API 服務(wù)中的 controller mapping,就會直接通過 URI 找后臺服務(wù)并進行調(diào)用。不過這種方式將大大增加系統(tǒng)的復(fù)雜度,出問題時調(diào)查起來更麻煩且收益不大。而寫這些無腦代碼不僅成本低,整體的接口列表還更可控。8bE28資訊網(wǎng)——每日最新資訊28at.com

綜合考慮后,最終我們決定保留無腦的代碼。8bE28資訊網(wǎng)——每日最新資訊28at.com

后臺服務(wù)與 API 服務(wù)的開發(fā)團隊如何進行分工?

最后我們是這樣分工的:專門的 API 開發(fā)團隊負(fù)責(zé) API 服務(wù),而后臺服務(wù)需要根據(jù)領(lǐng)域再劃分小組的職責(zé)。8bE28資訊網(wǎng)——每日最新資訊28at.com

這種劃分方式的好處在于 API 團隊能對所有服務(wù)有個整體認(rèn)識,且不會出現(xiàn)后臺服務(wù)劃分不清晰、工作重復(fù)的情況。而壞處在于 API 團隊整體業(yè)務(wù)邏輯偏簡單,長久留不住人。8bE28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-85542-0.html如何處理好微服務(wù)之間千絲萬縷的關(guān)系?到BFF大顯身手了

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C# 讀寫 JSON 配置文件詳解

下一篇: 大模型首選AI框架——昇思MindSpore2.3.RC1版本上線開源社區(qū)

標(biāo)簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久久久久久久久久久久9999| 国产亚洲va综合人人澡精品| 久久精品国产一区二区三| 欧美福利专区| 久久精品噜噜噜成人av农村| 久久裸体艺术| 亚洲第一区在线| 欧美午夜不卡| 亚洲一区二区三区在线观看视频| 欧美久久久久久久| 欧美亚洲一区| 免费久久精品视频| 亚洲欧美一级二级三级| 欧美在线播放一区二区| 亚洲激情影院| 国产精品裸体一区二区三区| 欧美噜噜久久久xxx| 亚洲精品一区二区在线观看| 国产一区在线播放| 欧美伦理影院| 久久久久久9| 日韩视频在线播放| 欧美视频中文字幕在线| 欧美日韩亚洲一区| 国产香蕉97碰碰久久人人| 在线成人www免费观看视频| 一本色道久久加勒比88综合| 久久av最新网址| 欧美精品亚洲精品| 国产一区二区三区四区在线观看| 亚洲精品久久久久久久久久久久久| 亚洲性线免费观看视频成熟| 久久久综合激的五月天| 国产精品国产福利国产秒拍| 在线播放国产一区中文字幕剧情欧美| 亚洲精品视频免费观看| 欧美影院久久久| 欧美日韩美女在线观看| 伊人婷婷久久| 午夜久久美女| 欧美三级资源在线| 亚洲国产高清视频| 久久av一区二区三区| 欧美日韩亚洲免费| 亚洲国产成人在线| 久久www免费人成看片高清| 欧美视频网址| 亚洲精品美女久久久久| 久久免费国产| 国产日韩欧美在线看| 一区二区国产日产| 欧美国产日本韩| 在线观看亚洲专区| 欧美在线观看你懂的| 欧美性久久久| 日韩一级在线| 欧美国产日韩一区二区| 有码中文亚洲精品| 久久精品二区| 国产精品免费网站| 亚洲私人影院| 欧美日韩一区二区在线观看视频| 亚洲二区免费| 久久综合狠狠| 黄色亚洲在线| 久久久欧美精品| 国产一区视频观看| 欧美一区二区私人影院日本 | 国产视频久久网| 亚洲一区二区三区涩| 欧美日韩一级大片网址| 亚洲美女免费精品视频在线观看| 美女免费视频一区| 欲色影视综合吧| 久久影音先锋| 亚洲电影免费| 欧美成人免费网| 亚洲日本va在线观看| 欧美高清一区| 亚洲狼人精品一区二区三区| 欧美精品一级| 一区二区电影免费观看| 国产精品家庭影院| 午夜精品亚洲| 国产亚洲精品久久久久久| 欧美影院午夜播放| 国产在线观看一区| 久久亚洲精品网站| 亚洲国产精品尤物yw在线观看| 欧美成人午夜激情| 日韩午夜在线视频| 欧美性淫爽ww久久久久无| 亚洲自拍偷拍网址| 国产精品一二三四区| 欧美一区二区三区的| 国产一区二区三区黄视频| 久久精品一区二区| 在线色欧美三级视频| 欧美激情国产精品| 中文亚洲字幕| 国产欧美日韩在线视频| 久久久久久久一区二区三区| 在线观看视频一区二区欧美日韩| 欧美成人免费一级人片100| 日韩一区二区福利| 国产精品任我爽爆在线播放| 久久电影一区| 亚洲国产岛国毛片在线| 欧美日韩一区二区在线观看视频| 亚洲永久在线| 狠狠色丁香婷婷综合| 欧美精品一卡| 午夜欧美理论片| 激情久久久久久久久久久久久久久久| 欧美成黄导航| 亚洲无玛一区| 韩国女主播一区| 欧美精品偷拍| 亚洲免费在线| 伊人久久大香线蕉av超碰演员| 欧美国产第一页| 亚洲自拍偷拍麻豆| 在线观看欧美日韩国产| 欧美日韩午夜| 久久精品国产一区二区电影| 亚洲精品国产欧美| 国产精品永久| 欧美成年人视频网站欧美| 亚洲线精品一区二区三区八戒| 国产亚洲日本欧美韩国| 欧美激情中文字幕在线| 午夜亚洲福利在线老司机| 亚洲国产合集| 国产精品一区在线播放| 欧美不卡激情三级在线观看| 亚洲一区二区日本| 亚洲第一区在线| 国产精品一卡二卡| 欧美高清视频在线播放| 午夜一区二区三区在线观看| 亚洲激情校园春色| 国产香蕉久久精品综合网| 欧美激情精品久久久久久变态| 篠田优中文在线播放第一区| 亚洲日韩第九十九页| 国产亚洲精品福利| 欧美日韩一二三区| 麻豆av一区二区三区| 亚洲欧美国产精品专区久久| 亚洲人成77777在线观看网| 国产精品一级| 欧美日韩国产综合网| 麻豆久久婷婷| 欧美怡红院视频一区二区三区| 亚洲精选一区二区| 韩国一区二区三区美女美女秀| 国产精品hd| 欧美激情视频一区二区三区不卡| 欧美一区二区三区久久精品| 99精品视频免费全部在线| 一区二区三区在线视频观看| 欧美性猛交xxxx乱大交蜜桃| 欧美成年人视频网站| 久久久美女艺术照精彩视频福利播放| 亚洲午夜激情网站| 亚洲美女视频在线观看| 一区二区亚洲| 国产日韩一区| 国产精品日韩在线| 欧美日韩中字| 欧美国产日韩一区二区| 久久美女性网| 欧美一区二区三区免费看| 一区二区三区四区五区视频 | 欧美在线日韩| 亚洲无线视频| 日韩小视频在线观看| 亚洲国产成人av| 黄色av成人| 国产一区二区三区四区| 国产精品视频免费一区| 国产精品扒开腿做爽爽爽视频| 欧美精品免费播放| 蜜臀久久99精品久久久画质超高清 | 久久久久网址| 久久av一区二区三区亚洲| 亚洲一区尤物| 这里只有精品丝袜| 99在线精品视频| 日韩亚洲不卡在线| 激情综合在线| 老巨人导航500精品| 欧美成年人网站| 国产精品扒开腿做爽爽爽软件| 亚洲久久一区| 国产精品美女久久久久av超清| 亚洲电影在线播放| 狠狠做深爱婷婷久久综合一区| 欧美午夜视频网站| 欧美日韩精品综合| 欧美日本在线看| 欧美日韩精品在线视频| 欧美日韩和欧美的一区二区| 欧美激情综合五月色丁香小说|