1. 程式人生 > >高效開發:你的專案有介面聚合服務嗎?

高效開發:你的專案有介面聚合服務嗎?

本文首發於個人微信公眾號:coder小黑

服務拆分的痛

服務拆分之後,前後端同學之間關於 API 粒度的爭吵越來越常見:

「前端同學請求兩個介面,聚合一下資料不就行了?」後端同學想只提供業務領域基礎 API 服務能力,資料組裝處理則希望由前端同學完成。

「後端聚合一下,前端可以少一次請求,只負責頁面渲染!」前端同學希望只負責頁面渲染,而 H5、APP、小程式同一個聚合邏輯可能會出現在三端,後端聚合則只需要一次。

介面聚合服務就是我們的一個解決思路。

介面聚合服務是什麼?

介面聚合服務就是一個搬運工,只是幫助前端同學聚合多個介面的返回資料,聚合之後一次性返回相應請求的結果給客戶端。我們希望通過介面聚合服務這個中間層,做到可以讓前端直接獲取資料,而後端也能繼續專心於提供基礎業務領域 API 服務能力。

場景分析

  • 場景一:序列獲取資料。多個請求,有關聯關係。
    • 例如:通過商品 ID 獲取評論資訊,通過評論中的 uid 獲取使用者資訊
  • 場景二:並行獲取資料。多個請求,無關聯關係。
    • 例如:通過商品 ID 獲取商品資訊、獲取商品活動資訊、獲取當前使用者已購資訊

方案調研

方案 A 方案 B
呼叫者 客戶端 客戶端
API-Server 自研 GraphQL
Payload 約定 GraphQL
Response 約定 GraphQL
容錯 約定 約定
動態選取欄位

最終我們選擇了方案 A,通過自研一套簡單的介面聚合中間層來解決這個問題。

於是,就有了介面聚合服務:api-aggregator。該框架有如下幾個特點:

  • 核心程式碼在千行左右,輕量級實現。

  • 對現有程式碼無侵入性,無需對現有服務和程式碼做改造適配,現有介面可直接使用。
  • 提供了 ApiAggregatePostProcessor 拓展點來干預介面聚合的各個階段,可拓展性強。
  • 對前端友好,前端同學可以自定義返回資料結構,支援欄位動態選取。
  • 介面聚合邏輯直接通過配置檔案和 api-aggregator 交流,新增聚合介面,無需釋出。

api-aggregator:介面聚合服務

api-aggregator 認為一個聚合介面應該是由若干個介面的返回結果聚合而成的,因此在設計時,我們將其被劃分為兩個部分:介面元資訊和介面之間的聚合邏輯。

ApiDefinition:介面元資訊

ApiDefinition 不僅定義了介面的元資訊,同時也描述了介面所需引數的來源。

api-aggregator 認為在一次介面聚合中,元資訊介面的引數可能有以下一些來源:

  1. 直接由客戶端傳遞過來,即直接從 HttpRequest 中獲取引數。
  2. 從上個介面的返回值中獲取。例如:通過商品 ID 獲取評論資訊,通過評論中的 uid 獲取使用者資訊。此時 uid 引數就需要從上個介面的返回值中獲取。

ResponseDefinition:介面間聚合邏輯

ResponseDefinition 描述了介面間的聚合邏輯,通過 ResponseDefinition 前端同學可以自定義介面返回的資料結構,也可以動態選取所需欄位。

如果沒有 ResponseDefinition,則 api-aggregator 只能簡單的將兩個介面的資料平級的聚合在一起(如上左圖所示)。而現在,可以通過 ResponseDefinition 來定義返回結構體,給前端同學更好的開發體驗(如上右圖所示)。

簡單聊聊設計

配置檔案預載入

介面聚合配置資訊是由前端開發同學在管理後臺配置的。

前端同學在提交配置檔案之後,api-aggregator 就會對配置檔案做一些靜態分析:分析介面的依賴情況,是否存在迴圈依賴等問題。

為了提高效能,api-aggregator 將相關的配置資訊解析好之後,會直接快取在記憶體中,以減少對同一份配置檔案的反覆解析,同時,再通過定時重新整理和 MQ 的 pub/sub 來保證資料的一致性。

簡化 http 請求模型

api-aggregator 抽象了 HttpMethodInvoker 來發起 HTTP 請求。通過 Supplier 來獲取返回結果,遮蔽了不同 Http Client 之間的 API 差異。

還記得前文提到的場景嗎?

場景一:序列獲取資料。多個請求,有關聯關係。

場景二:並行獲取資料。多個請求,無關聯關係。

在 api-aggregator 中,將這兩個場景進行了簡化合一。

首先, api-aggregator 在解析配置檔案分析介面依賴時,會根據介面的依賴情況給出一個 api-aggregator 認為是最優的 HTTP 請求流程,而不是根據配置檔案定義的介面順序依次請求。

舉個例子:

假設在一次介面聚合中,需要請求介面 A、B、C,而介面 B 的資料依賴於介面 A,介面 A 和介面 C 的請求引數均可直接從 HttpRequest 中獲取引數。

那麼,在實際的介面聚合過程中,api-aggregator 會先請求介面 A 和介面 C,然後阻塞獲取介面 A 的返回結果,最後請求介面 B。

提供擴充套件點

api-aggregator 提供了 ApiAggregatePostProcessor 來方便後續擴充套件。

通過 ApiAggregatePostProcessor,api-aggregator 可以干預一個介面聚合的整個流程,例如:快取介面資訊、增加監控日誌等等。

雖然通過 ApiAggregatePostProcessor 可以來干預介面的聚合流程,但是想要新增新的 Processor 時還是需要重啟api-aggregator。而 api-aggregator 作為介面聚合點,和閘道器相似,也是流量的集中點,在後續的版本中,可能會考慮引入 Groovy 指令碼,來支援動態的開啟和停用 Processor。

最後,歡迎大家在評論區一起留言討論,感謝你的閱讀~~


歡迎關注個人公眾號:

相關推薦

高效開發專案介面聚合服務

本文首發於個人微信公眾號:coder小黑 服務拆分的痛 服務拆分之後,前後端同學之間關於 API 粒度的爭吵越來越常見: 「前端同學請求兩個介面,聚合一下資料不就行了?」後端同學想只提供業務領域基礎 API 服務能力,資料組裝處理則希望由前端同學完成。 「後端聚合一下,前端可以少一次請求,只負責頁面渲染!

區塊鏈寵物系統開發的遊戲裏寵物養成了

區塊鏈 寵物遊戲養狗吸貓玩雞仔,區塊鏈遊戲已經得到很多人的喜愛,並且速速占據新應用玩法的一席之地,成為吸金法寶。區塊鏈作為新興技術的網紅選手。吸引了國內各大互聯網科技巨頭的入場,網易“招財貓”、百度“萊茨狗”、小米“加密兔”相繼上線,區塊鏈寵物養成遊戲大戰已經開始。區塊鏈寵物養成遊戲可以在PC端或者是手機端

iOS開發專案中新增podfile配置檔案及使用cocoapods匯入第三方庫

新建一個專案中是沒有pods的配置檔案的,下面介紹一下怎麼在新建的專案工程裡面新增podfile配置檔案,以及包含xcodeproj的那個檔案的(前提是電腦上已經安裝了cocoapods,安裝過程我在另一篇文章中有寫)。 (1)新建一個Xcode專案,cd到該檔案目錄下 (2)執

SpringMVC攔截器解決專案介面(url)訪問許可權的問題(通過url不能隨意訪問controller層)

層次關係 攔截器實現HandlerInterceptor介面 package com.bybo.aca.web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http

什麼是高併發?與多執行緒什麼區別?專案高併發問題?是如何解決的?

高併發是指較多使用者同時訪問服務。高併發可以由多執行緒實現,但是多執行緒不代表就是高併發。在會計匯有個投票調查專案,是和財政部合作的,會計人員進行填寫完調查結果後,將獲得5個學分。通過簡訊向全國500萬

Android開發建立專案後報錯,com.android.ide.common.process.ProcessException: Failed to execute aapt

情景:建立專案後報錯 com.android.ide.common.process.ProcessException:Failed to execute aapt 原因:在build.gradle檔案中, compileSdkVersion 和buildToolsVer

搞程序開發必要知道目前世界上最權威開發語言排名

https tps ces 開發 ava python 教育學 blog 更多 近日,Stack Overflow 發布 2019 年開發者調查報告,今年早些時候有將近 9 萬名開發者參加了這份平均用時 20 分鐘的調查,報告涉及開發者基本情況、技術、工作、社區、方法論多個

Java 訪問權限控制真的了解 protected keyword

可見 讀者 警告 except 控制 知識 繼承關系 shc line 摘要:   在一個類的內部,其成員(包含成員變量和成員方法)是否能被其它類所訪問,取決於該成員的修飾詞;而一個類是否能被其它類所訪問,取決於該類的修飾詞。Java的類成員訪問權限修

為什麽學不好java!請你好好思考下,真的這麽弱

javajava難學?java難學!是的,沒有錯!如果java這麽簡單容易,你覺得還會有它的市場價值嗎?我英語差、我學歷低、我理解能力差,能戰勝它嗎?整天遇到困難就逃避的人,學什麽都學不好!還沒有開始就否定自己,大清都亡了,只有天才一出生啥都會的!做什麽事必須要在它的身上付出,你付出的多回報就越豐厚!沒有任何

RxJava 沈思錄(一)認為 RxJava 真的好用

list 理念 public 圖片文件 ide 方便 復制 等於 ret 本人兩年前第一次接觸 RxJava,和大多數初學者一樣,看的第一篇 RxJava 入門文章是扔物線寫的《給 Android 開發者的 RxJava 詳解》,這篇文章流傳之廣,相信幾乎所有學習 RxJa

程式設計師吐槽年薪170w沒有上升空間,網友知道窮是什麼感覺

現在國內的網際網路行業對於大齡程式設計師不太友好,於是很多邁過30歲的大齡程式設計師往往會惴惴不安,認為自己就是那個被辭退的,所謂的“拔x無情”大概就是這樣的吧,用完就丟,沒什麼情面好講。 中年危機確實成為程式設計師們關注的一個熱點問題: 如果有想學習java的程式設計師,可來我們的java

English trip V1 - 9.Do you Ever Say Never? 曾經說過決不? Teacher:Lamb Key: Adverbs of frequency (頻率副詞)

In this lesson you will learn to describe what you do at home. 在本課中,您將學習如何描述您在家中所做的事情。   課上內容(Lesson) breakfast  早餐 I usually eat breakf

程式設計師是如何被外行給逼瘋的?網友能教我免費上網

出現程式設計師在外界群體看起來都是非常幸福的,因薪資高,待遇好啊,公司會提供各種各樣的補貼,是的,這一切都是真的,但是,他們永遠不知道程式設計師揹負著多大的壓力,很多外行會把一個普通程式設計師逼迫到處於崩潰的邊緣,一天當中可以有好幾件事能把一個普通程式設計師逼迫到處於崩潰的邊緣。 &nbs

彙報措辭懂得怎樣向領導彙報(審閱、審批、批閱、批示、查閱)?

     很多程式設計師總以為自己技術很牛自倨,不太重視與領導溝通,也不太注重彙報的方式,給領導彙報總不能讓領導滿意,特別是做到專案經理後,可能會感覺到彙報很難弄,總也說不到點子上,不知道彙報怎樣措辭

非技術/彙報措辭懂得怎樣向領導彙報(審閱、審批、批閱、批示、查閱)

  很多程式設計師總以為自己技術很牛自倨,不太重視與領導溝通,也不太注重彙報的方式,給領導彙報總不能讓領導滿意,特別是做到專案經理後,可能會感覺到彙報很難弄,總也說不到點子上,不知道彙報怎樣措辭寫才能讓領導看了滿意。其實彙報也是一門技術,需要學習才能掌握,即便是措辭,也非

RxJava 沉思錄(一)認為 RxJava 真的好用

本人兩年前第一次接觸 RxJava,和大多數初學者一樣,看的第一篇 RxJava 入門文章是扔物線寫的《給 Android 開發者的 RxJava 詳解》,這篇文章流傳之廣,相信幾乎所有學習 RxJava 的開發者都閱讀過。儘管那篇文章定位讀者是 RxJava

Java高手論道還在用if else

面向過程設計和麵向物件設計的主要區別是:是否在業務邏輯層使用冗長的if else判斷。如果你還在大量使用if else,當然,介面表現層除外,即使你使用Java/C#這樣完全面向物件的語言,也只能說明你的思維停留在傳統的面向過程語言上。   傳統思維習慣分析   為什麼會業務邏輯層使用if else,其實使

職場人知道自己值多少錢

【牛津管理評論-訊】“你值多少錢”彷彿是潘多拉的盒子,多少職場裡的負面情緒都從這個命題裡面蹦出——你可能糾結於自己的辛苦換取的微薄薪水;可能沮喪於自己的10分努力卻在老闆那裡打了對摺;甚至在無休止的橫向縱向比較中開始找不到價值。   對什麼負責決定你的價格   有一個故事是這樣說的,一個有機化學專業畢業的

JAVA獲取真實IP地址獲取的IP地址真實

想必大家對這段程式碼並不陌生: public String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null

面試官真的瞭解Redis分散式鎖

![](https://img2020.cnblogs.com/blog/1478697/202101/1478697-20210113230123649-1602595153.jpg) ### 什麼是分散式鎖 說到Redis,我們第一想到的功能就是可以快取資料,除此之外,Redis因為單程序、效能高的