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