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