劉一田,劉士進(jìn)
(南京南瑞信息通信科技有限公司,南京 210003)
“互聯(lián)網(wǎng)+”等新的生產(chǎn)和經(jīng)濟(jì)發(fā)展模式迫切需要企業(yè)業(yè)務(wù)流程改進(jìn)和再造,業(yè)務(wù)流程作為代表企業(yè)服務(wù)水平和競爭力的核心資產(chǎn),需要隨著市場變化靈活快速按需重構(gòu),亟需一種低成本、可擴(kuò)展、可動態(tài)配置的柔性工作流開發(fā)框架支撐.
云技術(shù)的發(fā)展為企業(yè)信息化流程再造提供了階梯,云技術(shù)通過虛擬化技術(shù)將計(jì)算、存儲、網(wǎng)絡(luò)和服務(wù)變成可動態(tài)配置的資源,而容器技術(shù)因其輕量級、易部署、啟動快等優(yōu)點(diǎn)正逐步取代傳統(tǒng)虛擬機(jī)成為新一代云化基礎(chǔ)設(shè)施,而且隨著Kubernetes (k8s)、Docker 等容器化技術(shù)的日益成熟[1]和微服務(wù)架構(gòu)的廣泛應(yīng)用,結(jié)合DEVOPS 的敏捷開發(fā)、持續(xù)集成、快速迭代已逐步成為保障業(yè)務(wù)交付安全及性能的主流技術(shù)發(fā)展趨勢.
目前國外已有很多比較成熟的工作流管理系統(tǒng)Pegasus[2]、GridFlow[3],這些工作流引擎框架提升了流程任務(wù)的編排和管理能力,但偏向于科學(xué)計(jì)算,業(yè)務(wù)流程運(yùn)行時靈活變更支持不足;在流程引擎的服務(wù)能力提升方面,文獻(xiàn)[4-6]研究了云環(huán)境下容器化的有限狀態(tài)機(jī)工作流彈性伸縮技術(shù),提出了基于CPU 使用率的工作流自動伸縮模型,結(jié)合流程負(fù)荷自動伸縮流程的容器數(shù)目以提升流程引擎服務(wù)性能,但不太適用于順序工作流.因此,主流工作流框架在柔性適配流程開發(fā)和運(yùn)維方面還面臨著一些問題和挑戰(zhàn),主要表現(xiàn)在:(1)業(yè)務(wù)活動的簡單變更需要修改流程模板、流程表單及流程遷移事件,但修改無法即時生效,增加開發(fā)運(yùn)維成本并影響生產(chǎn)效率.(2)流程活動參與者范圍篩選計(jì)算復(fù)雜,影響業(yè)務(wù)開發(fā)效率.(3)順序工作流引擎的運(yùn)行時擴(kuò)展柔性不足,云計(jì)算結(jié)合容器技術(shù)雖然讓資源擴(kuò)縮變得方便,但依然需要人工手動操作,智能和自動化程度較低.
針對上述問題,本文提出一種容器環(huán)境下基于領(lǐng)域驅(qū)動設(shè)計(jì)的工作流開發(fā)框架,將企業(yè)應(yīng)用根據(jù)領(lǐng)域模型細(xì)分后,拆分為分工明確的核心子域微服務(wù)、邊界上下文和業(yè)務(wù)微服務(wù),通過容器作為微服務(wù)的載體,靈活集成企業(yè)工具鏈,在提高服務(wù)質(zhì)量、可擴(kuò)展性和可靠性的同時,降低了企業(yè)運(yùn)行成本,具備以下特征:(1)支持基于領(lǐng)域模型驅(qū)動的在線流程表單零代碼開發(fā)、運(yùn)行模型變更和屬性狀態(tài)權(quán)限控制;(2)支持動態(tài)的業(yè)務(wù)組織關(guān)鍵點(diǎn)設(shè)計(jì),柔性適配活動參與者,支持流程活動腳本的運(yùn)行時更新.(3)結(jié)合監(jiān)控微服務(wù)的容器服務(wù)柔性伸縮策略及控制.
本文設(shè)計(jì)的容器化柔性微服務(wù)工作流開發(fā)框架結(jié)構(gòu)如圖1所示.通用服務(wù)和業(yè)務(wù)服務(wù)都以Docker 鏡像方式發(fā)布,并推送到容器鏡像倉庫,通過K8S 容器管理組件從容器鏡像倉庫拉取鏡像并部署到容器池中.數(shù)據(jù)庫不做容器化部署.框架的結(jié)構(gòu)說明如下.
(1)所有微服務(wù)統(tǒng)一走網(wǎng)關(guān)路由,微服務(wù)網(wǎng)關(guān)采用集群方式部署,支持高可用路由和基于安全策略的最小權(quán)限訪問控制.
圖1 容器化微服務(wù)流程開發(fā)框架結(jié)構(gòu)
(2) 所有服務(wù)以容器化方式啟動運(yùn)行并注冊到Spring Cloud Netflix Eureka[7]中,接入監(jiān)控代理,監(jiān)控代理將容器及服務(wù)的監(jiān)控?cái)?shù)據(jù)發(fā)送給監(jiān)控服務(wù),實(shí)現(xiàn)Docker 容器及微服務(wù)的服務(wù)水平質(zhì)量監(jiān)控.
(3)權(quán)限微服務(wù)提供基于RBAC 的訪問控制,并支持業(yè)務(wù)組織管理、用戶管理、角色管理、菜單管理、功能管理等.
(4)工作流微服務(wù)提供基于Web 的可視化流程建模和發(fā)布、監(jiān)控管理.其中工作流模型的機(jī)構(gòu)模型主要描述使用者的角色、權(quán)限分配、活動狀態(tài)以及組織機(jī)構(gòu)關(guān)系等,并基于權(quán)限微服務(wù)提供的組織、角色和用戶進(jìn)行配置和解析.
(5)模型微服務(wù)提供基于Web 在線運(yùn)行時領(lǐng)域?qū)ο竽P徒9δ埽С謹(jǐn)?shù)據(jù)源、業(yè)務(wù)字典、編輯器模板、業(yè)務(wù)對象模型、展現(xiàn)模型、應(yīng)用控制模型等模型的建模,其中,業(yè)務(wù)對象模型是業(yè)務(wù)表的抽象,并增加屬性編輯器模板的綁定等約束,屬性編輯器模板和業(yè)務(wù)字典綁定,支持運(yùn)行時表單編輯,應(yīng)用控制模型提供業(yè)務(wù)展現(xiàn)場景視圖基于狀態(tài)的對象和屬性訪問控制配置.
(6)監(jiān)控微服務(wù)提供對包含自身在內(nèi)的所有微服務(wù)的URL 鏈路服務(wù)質(zhì)量監(jiān)控,容器CPU、內(nèi)存、線程等資源的實(shí)時監(jiān)控;基于監(jiān)控指標(biāo)的容器伸縮策略配置,并根據(jù)服務(wù)質(zhì)量狀態(tài)伸縮策略進(jìn)行實(shí)時告警推送和容器伸縮控制.
一個完整的工作流模型由3 個子模型組成:其中組織模型描述工作流執(zhí)行中的組織實(shí)體,框架中基于通用權(quán)限服務(wù)配置業(yè)務(wù)組織實(shí)體以及角色、用戶等實(shí)體;信息模型描述工作流執(zhí)行中的信息項(xiàng),框架中基于領(lǐng)域建模實(shí)現(xiàn);過程模型描述工作流的功能,框架中基于可視化流程建模配置及解析實(shí)現(xiàn).微服務(wù)工作流子模型之間的實(shí)體關(guān)系形式化描述如圖2所示.
圖2 微服務(wù)工作流子模型的實(shí)體關(guān)系描述
結(jié)合微服務(wù)工作流子模型實(shí)體關(guān)系,容器化微服務(wù)工作流開發(fā)框架的開發(fā)流程如下:
(1)通過模型驅(qū)動微服務(wù)提供的建模視圖按業(yè)務(wù)領(lǐng)域建模,構(gòu)建領(lǐng)域?qū)ο竽P停⒒陬I(lǐng)域?qū)ο竽P蜆?gòu)建業(yè)務(wù)表單模型.(2)通過工作流微服務(wù)提供的流程設(shè)計(jì)器構(gòu)建業(yè)務(wù)流程,設(shè)置流程啟動者和參與者,限定參與者為指定組織用戶,在流程活動模板中綁定表單模型,并允許在表單中設(shè)置流程活動狀態(tài)的表單屬性訪問控制.(3)通過可視化界面設(shè)計(jì)器[8]設(shè)計(jì)界面,支持最終用戶的業(yè)務(wù)流程操作流轉(zhuǎn).
根據(jù)上述開發(fā)流程,需要實(shí)現(xiàn)3 個主要關(guān)鍵技術(shù)組件:(1)基于模型驅(qū)動微服務(wù)的零代碼流程開發(fā)套件;(2)基于通用權(quán)限微服務(wù)的流程活動組織關(guān)鍵點(diǎn)策略和流程腳本的熱更新機(jī)制;(3)結(jié)合監(jiān)控微服務(wù)的容器彈性伸縮策略和伸縮控制.
模型微服務(wù)基于多租戶模式,實(shí)現(xiàn)了基于領(lǐng)域模型驅(qū)動的在線業(yè)務(wù)對象模型建模、流程表單模型建模、和應(yīng)用控制屬性狀態(tài)管理,模型關(guān)系如圖3所示.領(lǐng)域?qū)ο竽P途唧w構(gòu)建方式為:(1)首先基于分層架構(gòu)將領(lǐng)域?qū)觿澐殖鰜?,領(lǐng)域?qū)<覄澐诸I(lǐng)域?yàn)楹线m的子域、邊界上下文、實(shí)體、值對象和服務(wù);(2)研發(fā)人員基于子域分包建模,通過可視化建模視圖構(gòu)建領(lǐng)域包、數(shù)據(jù)源、業(yè)務(wù)對象類型和類型屬性、類型關(guān)聯(lián).表單建模是根據(jù)業(yè)務(wù)需求構(gòu)建應(yīng)用控制和表單模型,應(yīng)用控制模型設(shè)置對業(yè)務(wù)類型和基于狀態(tài)的類型屬性的訪問控制,表單模型引用應(yīng)用控制模型,在表單模型中設(shè)計(jì)表單屬性的編輯器模板,添加業(yè)務(wù)字典并和編輯器綁定以支持界面交互.最后創(chuàng)建流程模型,在流程活動模板中綁定表單模型并發(fā)布流程,通過界面設(shè)計(jì)器設(shè)計(jì)界面并綁定對象類型和流程參數(shù)完成零碼開發(fā).
圖3 領(lǐng)域模型構(gòu)建
通用權(quán)限微服務(wù)提供了多租戶的權(quán)限管理功能,并支持基于網(wǎng)關(guān)和安全策略的統(tǒng)一權(quán)限認(rèn)證,實(shí)現(xiàn)了基于租戶的業(yè)務(wù)組織、菜單、功能等資源管理,并通過角色和資源及用戶的綁定實(shí)現(xiàn)權(quán)限解耦和授權(quán),如圖4(a)所示.服務(wù)之間的認(rèn)證采用輕量級JWT 認(rèn)證[9].
圖4 通用權(quán)限服務(wù)的資源授權(quán)及組織關(guān)鍵點(diǎn)
工作流引擎微服務(wù)基于開源引擎Activiti 實(shí)現(xiàn),Activiti 提供了工作流存儲、運(yùn)行時、任務(wù)、身份、管理、歷史、表單等7 類流程服務(wù)接口,框架對其身份接口進(jìn)行擴(kuò)展,集成框架通用權(quán)限微服務(wù),允許操作者將流程活動參與者設(shè)置為和流程啟動者或上一個活動的發(fā)送者相同的業(yè)務(wù)組織,實(shí)現(xiàn)了基于通用權(quán)限業(yè)務(wù)組織的活動關(guān)鍵點(diǎn)功能:給出業(yè)務(wù)組織列表,允許操作者將指定的業(yè)務(wù)組織設(shè)置為活動關(guān)鍵點(diǎn),如圖4(b)所示.當(dāng)發(fā)送流程時,當(dāng)發(fā)送者隸屬于某已設(shè)置的關(guān)鍵點(diǎn)組織時,則將發(fā)送范圍限定為該關(guān)鍵點(diǎn)內(nèi)具有可接受任務(wù)角色的用戶,解決了活動參與者設(shè)置業(yè)務(wù)的復(fù)雜計(jì)算等問題.框架采用JSON 描述流程定義,用關(guān)鍵字描述了圖2中子模型之間的關(guān)系,其中流程、活動、遷移線都抽象為資源對象,表單作為活動資源對象的子對象,通過遷移事件支持二次開發(fā).如圖5所示.其中user 表示活動參與者,以角色描述,formtemplate 表示表單模型,overlay 表示組織關(guān)鍵點(diǎn),stateId 表示應(yīng)用控制模型狀態(tài).event 表示事件,action 表示事件方法.
圖5 微服務(wù)流程的形式化定義
框架提供流程腳本管理界面,支持將流程腳本jar 包上傳到流程微服務(wù)內(nèi)存及數(shù)據(jù)庫中,由于流程活動腳本相對獨(dú)立,利用JVM classloader 的動態(tài)代理機(jī)制,實(shí)現(xiàn)了流程活動腳本運(yùn)行時即時熱更新,避免了需求變更升級腳本時對運(yùn)行時生產(chǎn)流程的影響.
資源使用率通常都有峰谷期,傳統(tǒng)工作流框架無法根據(jù)任務(wù)量或任務(wù)到達(dá)速率進(jìn)行動態(tài)伸縮來提高集群的整體資源利用率和服務(wù)質(zhì)量,本文設(shè)計(jì)的框架是通過基于監(jiān)控策略的監(jiān)控框架對微服務(wù)容器和微服務(wù)進(jìn)行監(jiān)控[10],全自動的收集Docker 容器實(shí)例、微服務(wù)實(shí)例及服務(wù)接口的信息.圖6給出了結(jié)合監(jiān)控微服務(wù)的容器彈性伸縮策略控制過程.其中容器彈性伸縮策略支持配置兩種策略算法:(1)基于閾值的響應(yīng)式伸縮算法實(shí)現(xiàn):定義容器伸縮配置yaml 文件,作為K8S 創(chuàng)建容器的配置,周期性地采集微服務(wù)宿主Docker 容器的CPU、內(nèi)存、網(wǎng)絡(luò)、IO 等指標(biāo)占用率,以及服務(wù)平均響應(yīng)時間等,通過與設(shè)定閾值進(jìn)行比較從而動態(tài)改變集群數(shù)量,為了避免瞬時資源消耗峰谷造成的頻繁伸縮,在策略的配置上增加了伸縮延遲時間配置.(2)基于預(yù)測的伸縮算法實(shí)現(xiàn):主要采用時間序列分析和機(jī)器學(xué)習(xí)兩類,其中時間序列分析主要提供了簡單移動平均法和指數(shù)平滑法兩種算法;機(jī)器學(xué)習(xí)法采用了BP 神經(jīng)網(wǎng)絡(luò)預(yù)測模型[11],將正確的結(jié)果和產(chǎn)生的結(jié)果進(jìn)行比較,根據(jù)誤差逆推對神經(jīng)網(wǎng)絡(luò)中的權(quán)重進(jìn)行反饋修正,從而來完成學(xué)習(xí)的過程.
為了驗(yàn)證本文提出的容器化微服務(wù)工作流開發(fā)框架,在一個真實(shí)的環(huán)境中進(jìn)行了案例的部署和研究.案例環(huán)境由3 臺8 核32 GB 內(nèi)存的浪潮服務(wù)器(SA5248L)組成,其中數(shù)據(jù)庫采用虛擬機(jī)部署,網(wǎng)關(guān)微服務(wù)、服務(wù)注冊微服務(wù)、工作流微服務(wù)、權(quán)限微服務(wù)、模型驅(qū)動微服務(wù)、監(jiān)控微服務(wù)采用容器部署,容器副本數(shù)均默認(rèn)為3.數(shù)據(jù)庫和應(yīng)用服務(wù)采用某電力公司綜合停電管理系統(tǒng)的測試數(shù)據(jù)庫和經(jīng)過領(lǐng)域劃分的微服務(wù),微服務(wù)實(shí)例以K8S 部署的Docker 容器形式運(yùn)行.
圖6 基于監(jiān)控微服務(wù)的容器彈性伸縮
部署完成后,由兩名業(yè)務(wù)配置人員經(jīng)過培訓(xùn)后基于停電檢修流程所涉及的領(lǐng)域?qū)ο蟆⒈韱魏土鞒探?,并根?jù)流程活動和應(yīng)用控制狀態(tài)設(shè)置流程表單對象的不同字段的動態(tài)訪問控制權(quán)限.其中檢修流程活動包括方式專責(zé)初審、通信處和調(diào)度處等各部門會簽、方式處審批、網(wǎng)公司審批、調(diào)度執(zhí)行、歸檔等活動環(huán)節(jié),檢修流程定義的形式化描述如圖7所示.
圖7 停電檢修流程的形式化定義
在檢修活動表單授權(quán)時,每個檢修流程活動對應(yīng)于一個檢修單狀態(tài),狀態(tài)是類型屬性和屬性權(quán)限的屬性安全域,并基于角色設(shè)置屬性的訪問控制,狀態(tài)和流程活動匹配,以支持運(yùn)行時獲取表單及屬性訪問控制.如圖8所示.將基于模型的表單和流程活動掛接,設(shè)置流程活動參與者及關(guān)聯(lián)組織關(guān)鍵點(diǎn),組織關(guān)鍵點(diǎn)的定義和選擇是以省內(nèi)地市供電局和電廠為關(guān)鍵點(diǎn),這樣地市供電局和電廠的用戶在處理流程時,流程活動的參與者被限定為當(dāng)前供電局或電廠.經(jīng)評估,相同人工下較之前代碼開發(fā)方式提升開發(fā)效率35%以上.
圖8 檢修流程表單類型屬性權(quán)限授權(quán)模型
在運(yùn)行時工作流等微服務(wù)性能彈性伸縮方面,通過loadrunner 模擬并發(fā)300 用戶的登錄、檢修流程創(chuàng)建、保存、發(fā)送、審批等流程活動,通過監(jiān)控策略和容器彈性伸縮策略,即監(jiān)控每3 分鐘內(nèi)服務(wù)容器CPU 和內(nèi)存占用率,15 分鐘后取監(jiān)控周期內(nèi)CPU和內(nèi)存占用平均值,當(dāng)CPU 或內(nèi)存平均占用率達(dá)到80%時,啟動容器擴(kuò)容操作,自動增加1 個指定服務(wù)的容器,當(dāng)CPU 或內(nèi)存平均占用率低于30%時,刪除指定服務(wù)的1 個容器服務(wù)實(shí)例,以避免因?yàn)楸O(jiān)控?cái)?shù)據(jù)抖動而引起頻繁的擴(kuò)容或縮容操作,觀察容器化微服務(wù)流程開發(fā)框架的自動彈性伸縮能力和服務(wù)穩(wěn)定性,結(jié)果見表1.
表1 檢修流程性能壓力測試
驗(yàn)證結(jié)果表明,柔性微服務(wù)工作流開發(fā)框架能有效根據(jù)資源使用率的峰谷進(jìn)行容器服務(wù)伸縮,保證了工作流等微服務(wù)的運(yùn)行時性能、擴(kuò)展能力和高可用,但也發(fā)現(xiàn)了一些問題,針對小規(guī)模的應(yīng)用現(xiàn)有框架的部署架構(gòu)略顯復(fù)雜,增加了運(yùn)維難度,尚有提升空間.目前,柔性微服務(wù)工作流開發(fā)框架已在南網(wǎng)某省綜合停電管理系統(tǒng)中實(shí)現(xiàn)并應(yīng)用,取得了較好的應(yīng)用效果.
本文研究了傳統(tǒng)工作流框架建模、領(lǐng)域驅(qū)動設(shè)計(jì)、容器化微服務(wù)運(yùn)行時自動伸縮等技術(shù),在此基礎(chǔ)上,設(shè)計(jì)了容器化柔性微服務(wù)流程開發(fā)框架,給出了基于領(lǐng)域驅(qū)動設(shè)計(jì)的微服務(wù)的零代碼流程開發(fā)套件、基于通用權(quán)限微服務(wù)的流程活動組織關(guān)鍵點(diǎn)適配和流程腳本熱更新機(jī)制、結(jié)合監(jiān)控微服務(wù)的容器彈性伸縮策略及伸縮控制等創(chuàng)新點(diǎn),闡述了該框架的架構(gòu)設(shè)計(jì)及關(guān)鍵實(shí)現(xiàn)技術(shù).最后,以南方電網(wǎng)某省綜合停電管理系統(tǒng)的檢修單應(yīng)用案例為背景,給出了柔性微服務(wù)工作流開發(fā)框架的應(yīng)用驗(yàn)證評估,驗(yàn)證結(jié)果、效率評估及生產(chǎn)運(yùn)行實(shí)踐表明,該框架提升了分布式環(huán)境下微服務(wù)工作流應(yīng)用開發(fā)和管理的靈活度、效率,實(shí)現(xiàn)了基于容器的工作流等微服務(wù)運(yùn)行時柔性伸縮能力,提高了電網(wǎng)應(yīng)用信息系統(tǒng)的服務(wù)水平.后續(xù)將針對遺留問題持續(xù)改進(jìn)優(yōu)化該框架.