一種面向后端的微服務(wù)低代碼平臺(tái)架構(gòu)設(shè)計(jì)(微服務(wù)代碼結(jié)構(gòu))
作者:京東科技 常姜洲
一、背景
近期參加公司組織的極客中餐廳訓(xùn)練營(yíng),我們所在的小組接到的課題是微服務(wù)的低代碼平臺(tái)架構(gòu)設(shè)計(jì)。目標(biāo)是:結(jié)合京東業(yè)務(wù)研發(fā)實(shí)際情況,針對(duì)后端研發(fā)人員,設(shè)計(jì)一個(gè)微服務(wù)低代碼平臺(tái),助力更高效低交付業(yè)務(wù)需求?,F(xiàn)已結(jié)業(yè),將我在本次項(xiàng)目中沉淀設(shè)計(jì)出的設(shè)計(jì)文檔整理成文,期待與大家有進(jìn)一步的碰撞溝通
二、低代碼平臺(tái)整體技術(shù)架構(gòu)設(shè)計(jì)
1、低代碼開(kāi)發(fā)三階段
平臺(tái)為開(kāi)發(fā)者的三個(gè)階段提供的核心功能:
1.開(kāi)發(fā)階段:服務(wù)編排能力,提供可組合的方式綁定事件源和事件消費(fèi)者(函數(shù)、API、數(shù)據(jù)源管理等基礎(chǔ)能力)
2.部署階段:生成、托管、獲取、構(gòu)建和打包代碼。
3.運(yùn)維階段:為 Serverless 應(yīng)用提供部署和服務(wù)支持。提供友好的日志系統(tǒng),能夠幫助平臺(tái)工具使用者快速定位問(wèn)題,提供對(duì)各種使用中間件狀態(tài)監(jiān)控,避免工具平臺(tái)成為一個(gè)黑盒子
整個(gè)3階段如下圖所示:
2、低代碼平臺(tái)功能架構(gòu)設(shè)計(jì)
角色與主功能說(shuō)明:
本低代碼開(kāi)發(fā)平臺(tái)的服務(wù)對(duì)象為開(kāi)發(fā)者,旨在使用低代碼開(kāi)發(fā)平臺(tái),進(jìn)行快速的微服務(wù)應(yīng)用開(kāi)發(fā)與部署,相對(duì)于傳統(tǒng)的開(kāi)發(fā)與部署方式減少研發(fā)時(shí)間,降低成本
Low Code 開(kāi)發(fā)面板:
提供整個(gè)低代碼應(yīng)用開(kāi)發(fā)生命周期的全功能的運(yùn)營(yíng)后臺(tái)面板,可以在此面板完成開(kāi)發(fā)階段的各項(xiàng)配置、流程編排、腳本編寫與調(diào)試、部署等功能。
Low Code 控制面板:
提供各種服務(wù)治理,告警配置管理,配置管理等服務(wù)控制功能模塊
基礎(chǔ)功能說(shuō)明:
?提供觸發(fā)器、腳本函數(shù)、可視化函數(shù)的、連接器的開(kāi)發(fā)與管理
?提供多環(huán)境配置文件隔離
?提供應(yīng)用維度、函數(shù)維度監(jiān)控相關(guān)配置
?提供應(yīng)用工程所有源文件、各環(huán)境配置數(shù)據(jù)的的版本管理
部署功能說(shuō)明:
提供在線構(gòu)建應(yīng)用工程,在線調(diào)試函數(shù)、觸發(fā)器、連接器等功能,調(diào)試完畢后可一鍵進(jìn)行發(fā)布
特色功能:
為進(jìn)一步提升業(yè)務(wù)域功能復(fù)用度,進(jìn)一步減少重復(fù)功能開(kāi)發(fā)的成本,同樣提供基于模板,函數(shù)擴(kuò)展點(diǎn)等功能的快速?gòu)?fù)用湖開(kāi)發(fā)
依賴:
?方便與JSF體系內(nèi)的服務(wù)更好的融合,接入JSF注冊(cè)中心API,進(jìn)行JSF注冊(cè)服務(wù)的信息獲取
?與統(tǒng)一配置平臺(tái)打通進(jìn)行在線配置變更的存儲(chǔ)與變更,平臺(tái)基礎(chǔ)配置的存儲(chǔ)與變更
?存儲(chǔ)層,元數(shù)據(jù)使用關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ),流程文件、資源文件使用對(duì)象存儲(chǔ),源代碼等文件使用git管理或者對(duì)象存儲(chǔ)
?監(jiān)控功能依賴貢獻(xiàn)現(xiàn)有的監(jiān)控平臺(tái) UMP 、SGM的 的OPEN API 實(shí)現(xiàn)
?日志平臺(tái),公司的日志平臺(tái)暫無(wú)OPEN API 可以共建、或者私有化部署一套實(shí)現(xiàn)
3、低代碼應(yīng)用開(kāi)發(fā)流程
應(yīng)用生命周期4階段
開(kāi)發(fā)與測(cè)試、構(gòu)建保存、發(fā)布、運(yùn)行
1.用戶在編輯器中完成觸發(fā)器、連接器、函數(shù)等主要低代碼構(gòu)件,可能復(fù)用已有模板和業(yè)務(wù)域能力進(jìn)一步為開(kāi)發(fā)提速
2.開(kāi)發(fā)完成后可以根據(jù)屬性配置、語(yǔ)言環(huán)境構(gòu)建打包函數(shù)鏡像,同時(shí)生成版本號(hào)。
3.發(fā)布版本,完成部署。
4.應(yīng)用實(shí)例在運(yùn)行時(shí)提供服務(wù)
廣義流程編排
?可視化創(chuàng)建連接器
?可視化創(chuàng)建觸發(fā)器
?支持可視化創(chuàng)建函數(shù)流程,BPMN, 流程節(jié)點(diǎn)可以是函數(shù)實(shí)體或者連接器實(shí)體,流程關(guān)系支持表達(dá)式編輯
?支持腳本編寫創(chuàng)建函數(shù),支持多語(yǔ)言:Groovy,Java
?支持多環(huán)境配置信息配置
?支持配置通用函數(shù)、觸發(fā)器、連接器等監(jiān)控,健康度指標(biāo)收集配置
4、低代碼平臺(tái)技術(shù)架構(gòu)
1.藍(lán)色部分是我們平臺(tái)重點(diǎn)建設(shè)的應(yīng)用
2.流量入口主要分為京東內(nèi)外部?jī)煞N流量入口
3.對(duì)于HTTP接口上層可以對(duì)接成熟的網(wǎng)關(guān)轉(zhuǎn)換為對(duì)低代碼應(yīng)用的JSF調(diào)用即可,此部分本身已經(jīng)實(shí)現(xiàn) 0代碼,無(wú)需重復(fù)建設(shè)
4.對(duì)于JSF接口可以使用低代碼應(yīng)用的JSF接口觸發(fā)器調(diào)用
5.監(jiān)控與告警主要還是以復(fù)用公司內(nèi)部組件為主,基于OPEN API 封裝
6.下層主要依賴其他業(yè)務(wù)部門提供的JSF接口、各大中間件、存儲(chǔ)層以及外部的一些HTTP接口、特殊協(xié)議的接口,消息等
5、低代碼平臺(tái)應(yīng)用部署架構(gòu)
1.每個(gè)低代碼平臺(tái)的應(yīng)用都有一個(gè)代理服務(wù)(LC proxy)負(fù)責(zé)和平臺(tái)通信,指令下發(fā),數(shù)據(jù)上報(bào)等
2.低代碼應(yīng)用不改變現(xiàn)有應(yīng)用的通信方式和現(xiàn)有的JSF接口、數(shù)據(jù)庫(kù)、緩存等中間件使用原有方式通信
3.控制中心:負(fù)責(zé)給 proxy 發(fā)控制指令,配置指令、服務(wù)治理指令等
4.數(shù)據(jù)收集中心:負(fù)責(zé)收集低代碼運(yùn)行時(shí)配置的健康度指標(biāo)源數(shù)據(jù)、流量等其他運(yùn)行數(shù)據(jù)收集
6、低代碼平臺(tái)各角色系統(tǒng)工作機(jī)制
7、低代碼平臺(tái)單機(jī)應(yīng)用架構(gòu)
單機(jī)運(yùn)行環(huán)境簡(jiǎn)介
單機(jī)應(yīng)用架構(gòu)
1.低代碼平臺(tái)單機(jī)應(yīng)用為1個(gè)JVM 進(jìn)程,和監(jiān)控agent 、日志 agent 等agent進(jìn)程一同部署在容器、或者KVM、物理機(jī)等OS 環(huán)境中
2.平臺(tái)應(yīng)用本身核心
1)low code proxy ,提供平臺(tái)api接口,接受平臺(tái)的指令,如:發(fā)布指令,接受到發(fā)布指令后去相關(guān)的存儲(chǔ)服務(wù)拉取元配置信息和函數(shù)腳本、觸發(fā)器、連接器配置、配置文件等低代碼應(yīng)用的源文件
2)執(zhí)行引擎,負(fù)責(zé)對(duì)低代碼應(yīng)用連接器的加載、函數(shù)加載、觸發(fā)器配加載,加載完成后對(duì)外提供服務(wù),等待各種觸發(fā)器的流量觸發(fā)、
3.低代碼應(yīng)用核心構(gòu)件
1)觸發(fā)器為應(yīng)用的流量入口:如接口、MQ消費(fèi)者,定時(shí)任務(wù)回調(diào)等等,平臺(tái)支持自定義觸發(fā)器開(kāi)發(fā)
2)函數(shù)為業(yè)務(wù)邏輯的編排,可以是特定語(yǔ)言的函數(shù)腳本,可以是bpmn組合的流程文件,
3)連接器負(fù)責(zé)和下游RPC接口,存儲(chǔ)數(shù)據(jù)源、中間件平臺(tái)的消息通信
4)多環(huán)境配置信息提供不同環(huán)境的參數(shù)配置
5)以上幾個(gè)核心構(gòu)件的有機(jī)組合共同在應(yīng)用層基礎(chǔ)能力至之上提供了
4.低代碼應(yīng)用作為一個(gè)運(yùn)行單元被發(fā)布到平臺(tái)應(yīng)用中
三、低代碼平臺(tái)詳細(xì)設(shè)計(jì)
由于是小組共創(chuàng)設(shè)計(jì),我在詳細(xì)設(shè)計(jì)中主要負(fù)責(zé)了連接器與觸發(fā)器的設(shè)計(jì)部分,其他如函數(shù)、配置部分的設(shè)計(jì)與此詳細(xì)設(shè)計(jì)這里不再贅述。大概思路如下
函數(shù):支持各種語(yǔ)言的表達(dá)式函數(shù)、支持BPMN可視化流程編排
多環(huán)境配置:需要支持測(cè)試、生產(chǎn)、預(yù)發(fā)等環(huán)境配置文件
日志: 支持平臺(tái)開(kāi)發(fā)者自定義日志是否打印,打印格式,是否有掩碼等
1、連接器的設(shè)計(jì)
連接器定義
1.在一個(gè)低代碼應(yīng)用中連接器主要負(fù)責(zé)和其他業(yè)務(wù)方提供的RPC服務(wù)、中間件、存儲(chǔ)等實(shí)體進(jìn)行通信的組件
2.可以在腳本函數(shù)中直接調(diào)用連接器,也可以在流程函數(shù)中直接調(diào)用連接器
3.連接器支持其他未知新協(xié)議的制定
連接器的0代碼開(kāi)發(fā)與部署流程
2、自定義連接器
1、為了適應(yīng)內(nèi)外部不同的連接器訴求,平臺(tái)提供自定義觸發(fā)器的能力
2、預(yù)留使用連接器使用的配置信息,為引入的通信中間件預(yù)留未來(lái)使用該觸發(fā)器的使用方需要0代碼配置的配置信息,如數(shù)據(jù)庫(kù)的地址,賬號(hào)密碼等信息
3、連接器需要實(shí)現(xiàn)平臺(tái)提供的API,這樣以便函數(shù)或者觸發(fā)器可以直接調(diào)用該連接器
4、調(diào)試無(wú)誤后保存觸發(fā)器,提交平臺(tái)審核,審核通過(guò)后平臺(tái)可上架該觸發(fā)器
3、自定義觸發(fā)器
1、為了適應(yīng)內(nèi)外部不同的觸發(fā)器訴求,平臺(tái)提供自定義觸發(fā)器的能力
2、預(yù)留使用觸發(fā)器使用的配置信息,為引入的通信中間件預(yù)留未來(lái)使用該觸發(fā)器的使用方需要0代碼配置的配置信息,如JSF的接口地址,別名等
3、使用純代碼寫出該觸發(fā)器的源代碼,并預(yù)留調(diào)用低代碼函數(shù)的入口,以便將來(lái)使用該觸發(fā)器的使用者可以0代碼配置觸發(fā)器所調(diào)用的函數(shù)
4、調(diào)試無(wú)誤后保存觸發(fā)器,提交平臺(tái)審核,審核通過(guò)后平臺(tái)可上架該觸發(fā)器
四、低代碼應(yīng)用源文件
a、元信息,0代碼,包含低代碼應(yīng)用的0代碼開(kāi)發(fā)部分的觸發(fā)器元信息、連接器元信息
1、觸發(fā)器配置信息:
?通信中間件所需要的各個(gè)參數(shù),接口名等等
?調(diào)用函數(shù)的函數(shù)名稱
?是否打印日志,日志是否脫敏
2、連接器配置信息
?通信中間件所需要的各個(gè)參數(shù),密碼,用戶名等等
?是否打印日志,日志是否脫敏
b、源文件,0代碼,包含:流程文件、腳本文件
?可視化流程編排產(chǎn)生的源文件,如bpmn流程文件
?腳本編碼產(chǎn)生的腳本文件,如自定義java函數(shù)
c、多環(huán)境配置,0代碼,包含各個(gè)環(huán)境的配置文件
?開(kāi)發(fā)環(huán)境、生成環(huán)境的各個(gè)配置信息等,配置信息可以在觸發(fā)器、函數(shù)、連接器中使用引入使用
d、日志組件配置
?日志打印輸出格式
?日志輸出路徑
?全局脫敏字段,脫敏正則
e、監(jiān)控組件配置
?監(jiān)控埋點(diǎn)打印路徑
?監(jiān)控埋點(diǎn)打印格式
d、低代碼平臺(tái)應(yīng)用底座:
執(zhí)行引擎、LC Proxy、中間件依賴的jar、應(yīng)用框架springboot的jar等,這部分跟隨不同的構(gòu)建部署方式為可選項(xiàng)
五、低代碼應(yīng)用的構(gòu)建部署方式
1、源文件熱部署
這種方式應(yīng)對(duì)于低代碼平臺(tái)的租戶使用低代碼平臺(tái)所有集群的共享資源,選取一部分可用資源以后在控制面板進(jìn)行選擇發(fā)布,可以使用指定ip的模式應(yīng)對(duì)相關(guān)權(quán)限問(wèn)題,也可以不指定ip使用平臺(tái)自定義分配。
?受平臺(tái)資源調(diào)度管控,參考上周控制面板的功能
?日志與監(jiān)控埋點(diǎn)由 LC Proxy 采集到平臺(tái)提供的日志平臺(tái)和監(jiān)控平臺(tái)
2、構(gòu)建jar包、war包
這種方式應(yīng)對(duì)于有自己的主機(jī)用戶,拿到成品后即可部署無(wú)狀態(tài)應(yīng)用,打的包中不包含LC Proxy部分,執(zhí)行引擎在應(yīng)用啟動(dòng)的時(shí)候自動(dòng)加載包中特定路徑的流程文件、腳本文件等。
?日志打印到特定目錄,供用戶自己的日志采集器采集
?埋點(diǎn)文件按照特定格式打印到特定目錄,供自己的日志采集器采集
3、構(gòu)建鏡像
這種方式應(yīng)對(duì)于有自己的容器用戶,拿到成品后即可部署無(wú)狀態(tài)應(yīng)用,打的包中不包含LC Proxy部分,執(zhí)行引擎在應(yīng)用啟動(dòng)的時(shí)候自動(dòng)加載包中特定路徑的流程文件、腳本文件等。
?日志打印到特定目錄,供用戶自己的日志采集器采集
?埋點(diǎn)文件按照特定格式打印到特定目錄,供自己的日志采集器采集
4、低代碼平臺(tái)和部署平臺(tái)的關(guān)系
?內(nèi)部
?內(nèi)部部署的低代碼平臺(tái)為了方便各業(yè)務(wù)方靈活使用,平臺(tái)提供兩種能力
?1、共享資源模式:平臺(tái)租戶共享平臺(tái)資源池,適用于消耗資源不大并發(fā)量不高的應(yīng)用, 使用低代碼平臺(tái)本身提供的日志平臺(tái)、監(jiān)控平臺(tái)結(jié)合做到各個(gè)維度的立體監(jiān)控
?2、自定義資源模式:平臺(tái)對(duì)接體系內(nèi)的JDOS平臺(tái),可以將低代碼應(yīng)用與JDOS應(yīng)用進(jìn)行關(guān)聯(lián),使用在JDOS平臺(tái)申請(qǐng)的應(yīng)用進(jìn)行部署。這種方式提供單獨(dú)的鏡像文件進(jìn)行部署,可結(jié)合體系內(nèi)的日志中間件、監(jiān)控平臺(tái), 與低代碼平臺(tái)本身提供的日志平臺(tái)、監(jiān)控平臺(tái)結(jié)合做到各個(gè)維度的立體監(jiān)控
?外部
?外部需求為成品包的時(shí)候,只需要構(gòu)建出 如上所述的 jar、war供其下載即可
?外部需求為低代碼平臺(tái)私有化部署的時(shí)候,需要將方案設(shè)計(jì)中的幾大應(yīng)用為用戶做私有化部署
六、一些問(wèn)題的思考與收獲
1、擴(kuò)展性不僅僅是在某一項(xiàng)功能上的擴(kuò)展,站在全局視角看在架構(gòu)設(shè)計(jì)中所有產(chǎn)品功能理論上都要盡可能考慮模塊化,可插拔,進(jìn)而搭積木成平臺(tái)化,真正做到全場(chǎng)景和全鏈路可擴(kuò)展
2、團(tuán)隊(duì)小伙伴對(duì)HTTP 觸發(fā)器的設(shè)計(jì)輸出,讓我聯(lián)想到 JSF注冊(cè)中心等通用類注冊(cè)中心都要解決的高可用問(wèn)題,舉一反三,同場(chǎng)景的同類解決方案的核心問(wèn)題是相通的
3、對(duì)于未來(lái)業(yè)務(wù)發(fā)展生命周期沒(méi)那么長(zhǎng),數(shù)據(jù)要求沒(méi)有強(qiáng)隔離訴求的場(chǎng)景,能否基于數(shù)據(jù)模型做一層數(shù)據(jù)層的0代碼開(kāi)發(fā)?
4、流程驅(qū)動(dòng)的低代碼可以和數(shù)據(jù)驅(qū)動(dòng)的低代碼很好地結(jié)合起來(lái)
5、低代碼平臺(tái)產(chǎn)出物的多樣化,為之后交付項(xiàng)目的產(chǎn)出物打開(kāi)了思路,很多時(shí)候要站在客戶角度考慮,客戶的應(yīng)用場(chǎng)景是什么,需要什么,那么我們就提供什么,張宇軒單元可跑,也可圈定某一部分功能集合,打包輸出
低代碼平臺(tái)適合的場(chǎng)景的一些思考
1、可以應(yīng)用在上層營(yíng)銷系統(tǒng)的開(kāi)發(fā)中
2、可以用在流程較為通用的場(chǎng)景如:消息轉(zhuǎn)化、數(shù)據(jù)統(tǒng)計(jì)、接口轉(zhuǎn)發(fā)
3、可以應(yīng)用在已有成熟的業(yè)務(wù)線進(jìn)行外圍的業(yè)務(wù)開(kāi)發(fā),如支付、結(jié)算等穩(wěn)定系統(tǒng)上層要做一些簡(jiǎn)單業(yè)務(wù)編排的場(chǎng)景用
4、 面對(duì)同樣一個(gè)業(yè)務(wù)需求是使用低代碼開(kāi)發(fā)還是使用純代碼開(kāi)發(fā),沒(méi)有明確的可量化的分水嶺,但是建議嘗試,從中獲到提效之后下一次面臨需求的時(shí)候就會(huì)有較為明確的答案
案例1:我們?cè)谝粋€(gè)上層營(yíng)銷活動(dòng)系統(tǒng)重嘗試基于表達(dá)式引擎做了一個(gè)半配置化的活動(dòng)配置系統(tǒng)(那個(gè)時(shí)候還沒(méi)聽(tīng)過(guò)低代碼這個(gè)詞),現(xiàn)在想來(lái)算是比較原始的支持低代碼系統(tǒng),上新一個(gè)活動(dòng)原本需要3個(gè)人日的開(kāi)發(fā)量,基于對(duì)以往流程的復(fù)用,使用腳本語(yǔ)言,使用表達(dá)式進(jìn)行編排和發(fā)布,0.5人日就搞定了,且系統(tǒng)無(wú)需重新發(fā)布。不得不說(shuō)在合適的場(chǎng)景,低代碼還是非常有空的。
案例2:大促的時(shí)的業(yè)務(wù)數(shù)據(jù)大屏的制作相信很多人都經(jīng)歷過(guò),我們最近兩次大促采取的方案都是使用星鏈對(duì)已有的數(shù)據(jù)接口和新的數(shù)據(jù)指標(biāo)進(jìn)行簡(jiǎn)單編排加工,提供JSF服務(wù),再結(jié)合我們內(nèi)部的網(wǎng)關(guān)系統(tǒng)將接口協(xié)議轉(zhuǎn)化為HTTP, 直接在展示平臺(tái)(如莫奈大屏)上直接使用,大促過(guò)后資源也可隨之釋放,非常方便與高效,同時(shí)也降低了研發(fā)成本
七、結(jié)語(yǔ)
參加訓(xùn)練營(yíng)后還是有一些感觸想分享給大家
1、感謝馬老師的指導(dǎo)和各位評(píng)委老師的指點(diǎn),感恩大家的信任,感謝同組的大佬們,從大家身上學(xué)習(xí)到不同的思路。每個(gè)人來(lái)此不同團(tuán)隊(duì),通過(guò)和大家的討論,發(fā)掘了很多新的看待產(chǎn)品與架構(gòu)的視角
2、流程驅(qū)動(dòng)的低代碼平臺(tái)可以和數(shù)據(jù)驅(qū)動(dòng)的低代碼以及部分0代碼開(kāi)發(fā)組件可以很好地有機(jī)整合成統(tǒng)一的低代碼平臺(tái),進(jìn)一步提升研發(fā)效率
3、整體感覺(jué)訓(xùn)練營(yíng)節(jié)奏緊湊,干貨滿滿,架構(gòu)設(shè)計(jì)方面對(duì)平臺(tái)擴(kuò)展性的思考充分得到訓(xùn)練