小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

車聯(lián)網(wǎng)服務(wù)non-RESTful架構(gòu)改造實(shí)踐

 甘甘灰 2019-09-09

導(dǎo)讀

\n

在構(gòu)建面向企業(yè)項(xiàng)目、多端的內(nèi)容聚合類在線服務(wù)API設(shè)計(jì)的過(guò)程中,由于其定制特點(diǎn),采用常規(guī)的restful開(kāi)發(fā)模式,通常會(huì)導(dǎo)致大量雷同API重復(fù)開(kāi)發(fā)的窘境,本文介紹一種GraphQL查詢語(yǔ)言+網(wǎng)關(guān)編排聯(lián)合的實(shí)踐,解決大量重復(fù)定制的問(wèn)題。

\n

早期與車廠合作過(guò)程中,基于高德已有的數(shù)據(jù)、引擎能力和一些較為重要的相關(guān)CP服務(wù)(如停車場(chǎng)、加油站、天氣等),形成的在線服務(wù)協(xié)作模式是針對(duì)客戶需求,采用REST API提供針對(duì)每個(gè)車廠、每個(gè)項(xiàng)目以及每個(gè)終端提供不同的API實(shí)現(xiàn),然而數(shù)據(jù)核心獨(dú)立服務(wù)實(shí)際上就有十余種,然而由于車線業(yè)務(wù)維護(hù)周期長(zhǎng),定制多,2-3年下來(lái),API規(guī)模已達(dá)幾百個(gè),而且持續(xù)發(fā)散級(jí)增長(zhǎng),這給持續(xù)開(kāi)發(fā)和維護(hù)帶來(lái)不小挑戰(zhàn)。

\n

分解業(yè)務(wù)開(kāi)發(fā)過(guò)程,無(wú)非兩類工作,業(yè)務(wù)需求能力數(shù)據(jù)的獲取和非業(yè)務(wù)訴求但是必不可少的如鑒權(quán)等通用化能力,當(dāng)前來(lái)看,其實(shí)這兩個(gè)問(wèn)題是幾乎所有業(yè)務(wù)團(tuán)隊(duì)都會(huì)遇到的問(wèn)題,因此解決方案也基本類似,如服務(wù)聚合、流程編排、API網(wǎng)關(guān)等。

\n

本文簡(jiǎn)要介紹下車聯(lián)網(wǎng)在線服務(wù)改造舊架構(gòu)的一些實(shí)踐。

\n

有關(guān)名詞

\n
  • \n

  • GraphQL:GraphQL既是一種用于API的查詢語(yǔ)言也是一個(gè)滿足數(shù)據(jù)查詢的運(yùn)行時(shí)。GraphQL對(duì)API中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準(zhǔn)確地獲得它需要的數(shù)據(jù),而且沒(méi)有任何冗余,也讓API更容易地隨著時(shí)間推移而演進(jìn),還能用于構(gòu)建強(qiáng)大的開(kāi)發(fā)者工具。

  • \n

  • DSL:指的是專注于某個(gè)應(yīng)用程序領(lǐng)域的計(jì)算機(jī)語(yǔ)言。又譯作領(lǐng)域?qū)S谜Z(yǔ)言。不同于普通的跨領(lǐng)域通用計(jì)算機(jī)語(yǔ)言(GPL),領(lǐng)域特定語(yǔ)言只用在某些特定的領(lǐng)域。 比如用來(lái)顯示網(wǎng)頁(yè)的HTML,以及Emacs所使用的Emac LISP語(yǔ)言。

  • \n

  • API網(wǎng)關(guān):API網(wǎng)關(guān)是一個(gè)服務(wù)器,是系統(tǒng)的唯一入口。從面向?qū)ο笤O(shè)計(jì)的角度看,它與外觀模式類似。API網(wǎng)關(guān)封裝了系統(tǒng)內(nèi)部架構(gòu),為每個(gè)客戶端提供一個(gè)定制的API。它可能還具有其它職責(zé),如身份驗(yàn)證、監(jiān)控、負(fù)載均衡、緩存、請(qǐng)求分片與管理、靜態(tài)響應(yīng)處理。

  • \n

\n

存在的問(wèn)題

\n

車線業(yè)務(wù)在線服務(wù)舊架構(gòu)如下:

\n
\n
\n\n
\n
\n\n
\n

面臨以下問(wèn)題:

\n
\n
\n\n
\n
\n\n
\n

改進(jìn)

\n

針對(duì)上述問(wèn)題,主要從以下幾個(gè)方面思考改進(jìn):

\n
  • \n

  • 服務(wù)能力原子化:目標(biāo)是做穩(wěn),讓上層通過(guò)組合實(shí)現(xiàn)業(yè)務(wù)需求;

  • \n

  • 構(gòu)建查詢引擎:支持強(qiáng)大的查詢組合能力,實(shí)現(xiàn)原子服務(wù)能力任意聚合和定制;

  • \n

  • API網(wǎng)關(guān):對(duì)非業(yè)務(wù)數(shù)據(jù)能力需求進(jìn)行抽象提供插件,實(shí)現(xiàn)插件編排。

  • \n

\n

下面分別介紹。

\n

實(shí)現(xiàn)穩(wěn)定、獨(dú)立演進(jìn)的原子能力服務(wù)

\n

對(duì)已有的服務(wù)進(jìn)行梳理,抽象出不同應(yīng)該獨(dú)立開(kāi)發(fā)、部署演進(jìn)的核心能力,對(duì)于引擎能力沒(méi)有什么工作,重點(diǎn)是對(duì)于一些歷史對(duì)接的外部CP,主要實(shí)現(xiàn)以下目標(biāo):

\n
  • \n

  • 向上提供穩(wěn)定接口,向下屏蔽底層復(fù)雜性(數(shù)據(jù)訪問(wèn),多源差異);

  • \n

  • 以位置為中心有機(jī)整合,構(gòu)建完備原子化能力集合。

  • \n

\n

這部分工作主要是解決歷史遺留的一些服務(wù)組合不合理,跟隨業(yè)務(wù)過(guò)度定制的問(wèn)題。

\n

定制代碼開(kāi)發(fā)轉(zhuǎn)換為定義查詢語(yǔ)句

\n

這里主要目的就是將服務(wù)聚合、定制邏輯等原來(lái)需要的代碼開(kāi)發(fā)轉(zhuǎn)換為編寫查詢語(yǔ)言的方式實(shí)現(xiàn),只需要編寫出聲明式的查詢語(yǔ)句即完成服務(wù)發(fā)布,特性如下:

\n
  • \n

  • 向上提供標(biāo)準(zhǔn)化查詢語(yǔ)言

  • \n

  • 向下實(shí)現(xiàn)原子能力組合

  • \n

  • 歸納業(yè)務(wù)共性,提煉定制模式,提升復(fù)用

  • \n

\n
\n
\n\n
\n
\n\n
\n

本文選擇GraphQL作為查詢語(yǔ)言基礎(chǔ),然而,直接采用GraphQL有這樣兩個(gè)主要問(wèn)題需要解決:

\n
  • \n

  • 數(shù)據(jù)查詢N+1放大問(wèn)題,直接采用Fackbook提出的dataloader來(lái)解決,原理是批量加緩存;

  • \n

  • GraphQL規(guī)范限制,一些定制難以實(shí)現(xiàn),如:

  • \n

\n
  1. \n

  2. 入?yún)⒍ㄖ疲喝鐓?shù)關(guān)聯(lián),類型轉(zhuǎn)換等;

  3. \n

  4. 輸出格式:字段展現(xiàn)形式,如時(shí)間、經(jīng)緯度等;

  5. \n

  6. 配置表定制:主要是部分業(yè)務(wù)邏輯需要根據(jù)配置表定制,如深度返回字段等;

  7. \n

  8. 模型連接:原子能力服務(wù)盡可能獨(dú)立,同時(shí)也無(wú)法枚舉定義模型關(guān)系,但是定制業(yè)務(wù)需求需要大量關(guān)聯(lián)透出,減少業(yè)務(wù)請(qǐng)求降低延時(shí),所以模型自由關(guān)聯(lián)能力是必要的,由于本方案最終的查詢控制在內(nèi)部,對(duì)外暴露REST API,因此不會(huì)關(guān)聯(lián)自由度造成的難理解性并不是一個(gè)問(wèn)題。

  9. \n

\n

需要通過(guò)嵌入簡(jiǎn)單的DSL實(shí)現(xiàn):

\n
  • \n

  • 內(nèi)置和自定義函數(shù)功能;

  • \n

  • 模型動(dòng)態(tài)關(guān)聯(lián)查詢,上下文參數(shù)獲??;

  • \n

  • 可以方便擴(kuò)展自定義函數(shù)。

  • \n

\n
\n
\n\n
\n
\n\n
\n

這里嵌入DSL需要控制好度,因?yàn)镈SL如果過(guò)于復(fù)雜,那么,使用者或者發(fā)布者無(wú)法快速寫出查詢的話,對(duì)比寫代碼提效就會(huì)打折扣,偏離本來(lái)的價(jià)值,所以基本原則是簡(jiǎn)單、可擴(kuò)展。

\n

業(yè)務(wù)無(wú)關(guān)功能通過(guò)API網(wǎng)關(guān)插件配置化

\n

由于之前每個(gè)API的定制開(kāi)發(fā)基本所有功能混合在一起,能復(fù)用部分就是鑒權(quán)提供裝飾器,常規(guī)性的響應(yīng)格式定制提供一些工具函數(shù),任何需求變更都需要變更代碼,走發(fā)布流程,有了上面第一步的改造,這個(gè)步驟期望將非業(yè)務(wù)數(shù)據(jù)部分的定制功能抽象出處理鏈,每個(gè)處理節(jié)點(diǎn)提供多實(shí)現(xiàn)(包含通用和定制),通過(guò)數(shù)據(jù)庫(kù)存儲(chǔ)插件鏈實(shí)現(xiàn)編排。

\n
\n
\n\n
\n
\n\n
\n

車線業(yè)務(wù)由于鑒權(quán)方式需要根據(jù)客戶定制,因此存在多樣性,實(shí)現(xiàn)上是通過(guò)Web中間件實(shí)現(xiàn)多種鑒權(quán)插件:

\n
  • \n

  • HTTP簽名,參考這里:主要面向ToB(車廠后臺(tái)、合作方)的請(qǐng)求;

  • \n

  • JWT認(rèn)證:主要面向車機(jī)、手機(jī)等終端;

  • \n

  • API Key。

  • \n

\n

對(duì)于API網(wǎng)關(guān)來(lái)說(shuō),這些鑒權(quán)插件并沒(méi)有什么不同之處,只是工程要處理一些定制場(chǎng)景,比如對(duì)于不同車廠的JWK管理刷新策略,JWT驗(yàn)證策略等,具體需要根據(jù)業(yè)務(wù)訴求抽象建模,通過(guò)插件屬性來(lái)實(shí)現(xiàn)配置控制。

\n

另外,網(wǎng)關(guān)還實(shí)現(xiàn)了一些變換器,主要用于將GraphQL的輸出變換為REST API接口透出,這一方面由于一些舊接口要做兼容支持,另外,一些重點(diǎn)客戶的全球化架構(gòu)背景下自己已經(jīng)完全定義好了接口式樣,目前主要實(shí)現(xiàn)了:

\n
  • \n

  • 入?yún)⒆儞Q:使用REST API參數(shù)填充GraphQL查詢模板;

  • \n

  • Header變換:主要用于適配不同客戶規(guī)范;

  • \n

  • JSON變換,使用場(chǎng)景如下:

  • \n

\n
  1. \n

  2. 可復(fù)用標(biāo)準(zhǔn)接口,但是不同客戶的響應(yīng)結(jié)構(gòu)規(guī)范不一致

  3. \n

  4. 定制非標(biāo)接口,需要對(duì)GraphQL輸出進(jìn)行轉(zhuǎn)換

  5. \n

\n

而插件的使用則通過(guò)控制臺(tái)或API實(shí)現(xiàn)將插件配置信息存儲(chǔ)于數(shù)據(jù)庫(kù)中進(jìn)行管理,使用時(shí)根據(jù)請(qǐng)求特征從DB中提取并緩存起來(lái)使用。

\n

改造后的新架構(gòu)如下:

\n
\n
\n\n
\n
\n\n
\n

小結(jié)

\n

通過(guò)上述改造,將車聯(lián)網(wǎng)在線服務(wù)開(kāi)發(fā)模式進(jìn)行了升級(jí),實(shí)現(xiàn)API控制臺(tái)動(dòng)態(tài)發(fā)布,大幅提升定制開(kāi)發(fā)效率:

\n
  • \n

  • 提效開(kāi)發(fā):正交化原子能力編排,通過(guò)輕量級(jí)定義取代定制化代碼開(kāi)發(fā):

  • \n

\n
  1. \n

  2. 定制化開(kāi)發(fā)占比下降60%;

  3. \n

  4. 單接口開(kāi)發(fā)從2-3人日→2-3人時(shí)。

  5. \n

\n
  • \n

  • 協(xié)議兼容:混合REST方案,對(duì)外提供標(biāo)準(zhǔn)協(xié)議、支持既有適配協(xié)議。

  • \n

\n

\n本文作者:高德技術(shù)小哥\n

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多