導讀\n在構(gòu)建面向企業(yè)項目、多端的內(nèi)容聚合類在線服務API設計的過程中,由于其定制特點,采用常規(guī)的restful開發(fā)模式,通常會導致大量雷同API重復開發(fā)的窘境,本文介紹一種GraphQL查詢語言+網(wǎng)關編排聯(lián)合的實踐,解決大量重復定制的問題。 \n早期與車廠合作過程中,基于高德已有的數(shù)據(jù)、引擎能力和一些較為重要的相關CP服務(如停車場、加油站、天氣等),形成的在線服務協(xié)作模式是針對客戶需求,采用REST API提供針對每個車廠、每個項目以及每個終端提供不同的API實現(xiàn),然而數(shù)據(jù)核心獨立服務實際上就有十余種,然而由于車線業(yè)務維護周期長,定制多,2-3年下來,API規(guī)模已達幾百個,而且持續(xù)發(fā)散級增長,這給持續(xù)開發(fā)和維護帶來不小挑戰(zhàn)。 \n分解業(yè)務開發(fā)過程,無非兩類工作,業(yè)務需求能力數(shù)據(jù)的獲取和非業(yè)務訴求但是必不可少的如鑒權(quán)等通用化能力,當前來看,其實這兩個問題是幾乎所有業(yè)務團隊都會遇到的問題,因此解決方案也基本類似,如服務聚合、流程編排、API網(wǎng)關等。 \n本文簡要介紹下車聯(lián)網(wǎng)在線服務改造舊架構(gòu)的一些實踐。 \n有關名詞\n
存在的問題\n車線業(yè)務在線服務舊架構(gòu)如下: \n\n \n\n\n \n\n![]() 面臨以下問題: \n\n \n\n\n \n\n![]() 改進\n針對上述問題,主要從以下幾個方面思考改進: \n
下面分別介紹。 \n實現(xiàn)穩(wěn)定、獨立演進的原子能力服務 \n對已有的服務進行梳理,抽象出不同應該獨立開發(fā)、部署演進的核心能力,對于引擎能力沒有什么工作,重點是對于一些歷史對接的外部CP,主要實現(xiàn)以下目標: \n
這部分工作主要是解決歷史遺留的一些服務組合不合理,跟隨業(yè)務過度定制的問題。 \n定制代碼開發(fā)轉(zhuǎn)換為定義查詢語句 \n這里主要目的就是將服務聚合、定制邏輯等原來需要的代碼開發(fā)轉(zhuǎn)換為編寫查詢語言的方式實現(xiàn),只需要編寫出聲明式的查詢語句即完成服務發(fā)布,特性如下: \n
\n \n\n\n \n\n![]() 本文選擇GraphQL作為查詢語言基礎,然而,直接采用GraphQL有這樣兩個主要問題需要解決: \n
需要通過嵌入簡單的DSL實現(xiàn): \n
\n \n\n\n \n\n![]() 這里嵌入DSL需要控制好度,因為DSL如果過于復雜,那么,使用者或者發(fā)布者無法快速寫出查詢的話,對比寫代碼提效就會打折扣,偏離本來的價值,所以基本原則是簡單、可擴展。 \n業(yè)務無關功能通過API網(wǎng)關插件配置化\n由于之前每個API的定制開發(fā)基本所有功能混合在一起,能復用部分就是鑒權(quán)提供裝飾器,常規(guī)性的響應格式定制提供一些工具函數(shù),任何需求變更都需要變更代碼,走發(fā)布流程,有了上面第一步的改造,這個步驟期望將非業(yè)務數(shù)據(jù)部分的定制功能抽象出處理鏈,每個處理節(jié)點提供多實現(xiàn)(包含通用和定制),通過數(shù)據(jù)庫存儲插件鏈實現(xiàn)編排。 \n\n \n\n\n \n\n![]() 車線業(yè)務由于鑒權(quán)方式需要根據(jù)客戶定制,因此存在多樣性,實現(xiàn)上是通過Web中間件實現(xiàn)多種鑒權(quán)插件: \n
對于API網(wǎng)關來說,這些鑒權(quán)插件并沒有什么不同之處,只是工程要處理一些定制場景,比如對于不同車廠的JWK管理刷新策略,JWT驗證策略等,具體需要根據(jù)業(yè)務訴求抽象建模,通過插件屬性來實現(xiàn)配置控制。 \n另外,網(wǎng)關還實現(xiàn)了一些變換器,主要用于將GraphQL的輸出變換為REST API接口透出,這一方面由于一些舊接口要做兼容支持,另外,一些重點客戶的全球化架構(gòu)背景下自己已經(jīng)完全定義好了接口式樣,目前主要實現(xiàn)了: \n
而插件的使用則通過控制臺或API實現(xiàn)將插件配置信息存儲于數(shù)據(jù)庫中進行管理,使用時根據(jù)請求特征從DB中提取并緩存起來使用。 \n改造后的新架構(gòu)如下: \n\n \n\n\n \n\n![]() 小結(jié)\n通過上述改造,將車聯(lián)網(wǎng)在線服務開發(fā)模式進行了升級,實現(xiàn)API控制臺動態(tài)發(fā)布,大幅提升定制開發(fā)效率: \n
\n本文作者:高德技術小哥\n |
|
|