沈錫城,任 杰
(杭州市交通運(yùn)輸行政執(zhí)法隊(duì),杭州 310014)
隨著云計(jì)算技術(shù)的不斷發(fā)展,越來(lái)越多的行業(yè)正在加快推動(dòng)上云,進(jìn)行自身的數(shù)字化轉(zhuǎn)型升級(jí)[1-2]。新形勢(shì)下運(yùn)營(yíng)需求變化快,業(yè)務(wù)系統(tǒng)也從傳統(tǒng)單體應(yīng)用架構(gòu)加快向輕量化、容器化、微服務(wù)化的互聯(lián)網(wǎng)新架構(gòu)轉(zhuǎn)變[3-4]。越來(lái)越多的業(yè)務(wù)需要結(jié)合應(yīng)用場(chǎng)景選擇適當(dāng)?shù)奈⒎?wù)拆分策略,從而可以形成與業(yè)務(wù)應(yīng)用訪問(wèn)匹配的微服務(wù)顆粒度[5-6]。
隨著業(yè)務(wù)系統(tǒng)不斷提出上云需求,如何發(fā)揮微服務(wù)單體靈活的特性,促進(jìn)業(yè)務(wù)快速發(fā)布、迭代一直是業(yè)界研究的重點(diǎn)方向[7-8]。業(yè)務(wù)拆分并不是拆的越小越好,也不是顆粒度越大越好,在進(jìn)行微服務(wù)拆分的時(shí)候,既要考慮業(yè)務(wù)的特點(diǎn)與資源的情況,又要綜合加權(quán)形成業(yè)務(wù)拆分顆粒度,指導(dǎo)微服務(wù)拆分上云[9-10]。
微服務(wù)架構(gòu)主要包括服務(wù)網(wǎng)關(guān)API、注冊(cè)中心RA、服務(wù)監(jiān)控、配置中心、緩存、數(shù)據(jù)庫(kù)等組件,以及相關(guān)的微服務(wù)。整體架構(gòu)如圖1所示。
圖1 微服務(wù)整體架構(gòu)
通過(guò)配置中心實(shí)現(xiàn)微服務(wù)的有效動(dòng)態(tài)配置信息的存儲(chǔ),在不同的運(yùn)行場(chǎng)景下通過(guò)訂閱的模式將信息及時(shí)同步到微服務(wù)中。
業(yè)務(wù)系統(tǒng)拆分需要采用合理的粒度劃分,并不是簡(jiǎn)單地將服務(wù)變小,要綜合考慮服務(wù)本身的業(yè)務(wù)復(fù)雜度。在微服務(wù)的設(shè)計(jì)階段,需要明確劃分微服務(wù)的邊界界面,微服務(wù)之間需要采取相對(duì)獨(dú)立并保持松耦合的劃分。服務(wù)拆分主要是為了增強(qiáng)橫向擴(kuò)展性,微服務(wù)拆分應(yīng)該以橫向拆分為主,而非縱向拆分成一串連續(xù)服務(wù)。
在信息提取階段,提取源代碼中結(jié)構(gòu)信息,并利用結(jié)構(gòu)信息和擬定的微服務(wù)列表來(lái)確定微服務(wù)之間的依賴(lài)關(guān)系。要識(shí)別微服務(wù)之間的依賴(lài)關(guān)系,有必要識(shí)別類(lèi)之間的依賴(lài)關(guān)系,并將依賴(lài)關(guān)系與微服務(wù)建議關(guān)聯(lián)起來(lái)。
在數(shù)據(jù)庫(kù)重構(gòu)階段,利用結(jié)構(gòu)信息和微服務(wù)之間的依賴(lài)關(guān)系來(lái)確定哪些關(guān)系需要重構(gòu),通過(guò)將數(shù)據(jù)庫(kù)調(diào)用替換為微服務(wù)服務(wù)調(diào)用來(lái)實(shí)現(xiàn)對(duì)這些實(shí)體的重構(gòu),同時(shí)用外鍵維護(hù)了實(shí)體與實(shí)體之間的關(guān)系。
在代碼重構(gòu)階段,利用結(jié)構(gòu)信息和微服務(wù)之間的依賴(lài)關(guān)系來(lái)識(shí)別與其他微服務(wù)的類(lèi)有依賴(lài)關(guān)系的實(shí)例變量,將這些實(shí)例變量對(duì)其他微服務(wù)的方法調(diào)用重構(gòu)為微服務(wù)的服務(wù)調(diào)用。
微服務(wù)的拆分主要是基于業(yè)務(wù)復(fù)雜度,當(dāng)業(yè)務(wù)復(fù)雜度高時(shí)基于領(lǐng)域驅(qū)動(dòng)劃分服務(wù),當(dāng)業(yè)務(wù)復(fù)雜度較低時(shí)可以選擇基于數(shù)據(jù)驅(qū)動(dòng)模式劃分服務(wù)。所有數(shù)據(jù)模型、領(lǐng)域模型設(shè)計(jì)均應(yīng)遵循模型規(guī)范。基于領(lǐng)域驅(qū)動(dòng)劃分服務(wù)流程如圖2所示。
圖2 基于領(lǐng)域驅(qū)動(dòng)劃分服務(wù)
單體程序源碼和通過(guò)微服務(wù)拆分得到的擬定的微服務(wù)作為輸入,通過(guò)信息提取、數(shù)據(jù)庫(kù)重構(gòu)和代碼重構(gòu)三個(gè)步驟將代碼自動(dòng)重構(gòu)為微服務(wù)架構(gòu)的應(yīng)用程序。通用語(yǔ)言盡量以業(yè)務(wù)語(yǔ)言為主,而非技術(shù)語(yǔ)言,通用語(yǔ)言和代碼都需要不斷地重構(gòu),然后確定核心的業(yè)務(wù)流程逐步擴(kuò)展到全部,內(nèi)部討論逐步細(xì)化?;跀?shù)據(jù)驅(qū)動(dòng)劃分服務(wù)如圖3所示。
圖3 基于數(shù)據(jù)驅(qū)動(dòng)劃分服務(wù)
通過(guò)領(lǐng)域?qū)<曳治鰳I(yè)務(wù)場(chǎng)景和特點(diǎn),確定核心的業(yè)務(wù)流程,然后從中提煉出相關(guān)的數(shù)據(jù)結(jié)構(gòu),接著分析數(shù)據(jù)結(jié)構(gòu),識(shí)別服務(wù),服務(wù)應(yīng)該滿足高內(nèi)聚、低耦合、單一職責(zé)等特征,確定服務(wù)調(diào)用關(guān)系,以服務(wù)為粒度實(shí)現(xiàn)時(shí)序圖。
同時(shí)融合綜合加權(quán)將詞粒度和句特征提取思路,設(shè)計(jì)基于詞句上下文的微服務(wù)特征提取方法,實(shí)現(xiàn)局部微服務(wù)拆分最優(yōu),基于詞語(yǔ)上下文的局部最優(yōu)微服務(wù)提取方法如圖4所示。
圖4 基于詞語(yǔ)上下文的局部最優(yōu)微服務(wù)提取方法
業(yè)務(wù)抽象提出詞語(yǔ)上下文,將提取出來(lái)的詞作為詞粒度編碼器的輸入、句作為句粒度編碼器的輸入,結(jié)合業(yè)務(wù)上下文語(yǔ)境,可以推導(dǎo)出詞粒度、句粒度向量,兩者融合可以形成線性層,最后形成融合上下文語(yǔ)境的特征向量。
結(jié)合微服務(wù)架構(gòu)設(shè)計(jì),應(yīng)用到微服務(wù)拆分及微服務(wù)拓?fù)潢P(guān)聯(lián)方面,初步實(shí)現(xiàn)微服務(wù)的快速故障診斷和便捷維護(hù)功能,提升用戶對(duì)微服務(wù)體系運(yùn)維的交付體驗(yàn),提供基于微服務(wù)的探索和列表展示,展示接入到平臺(tái)的微服務(wù)有多少個(gè)節(jié)點(diǎn),以及節(jié)點(diǎn)運(yùn)行情況,根據(jù)微服務(wù)調(diào)用鏈路形成微服務(wù)調(diào)用拓?fù)鋱D,展示微服務(wù)的調(diào)用依賴(lài)。微服務(wù)拓?fù)浼軜?gòu)如圖5所示。
圖5 微服務(wù)拓?fù)浼軜?gòu)
根據(jù)微服務(wù)調(diào)用時(shí)序形成微服務(wù)接口調(diào)用鏈,并且根據(jù)每個(gè)調(diào)用鏈的調(diào)用軌跡判斷服務(wù)調(diào)用異常點(diǎn),在業(yè)務(wù)微服務(wù)不做任何改動(dòng)的情況下可以方便接入,有助于后續(xù)大規(guī)模部署和實(shí)踐應(yīng)用,自動(dòng)形成微服務(wù)調(diào)用鏈和跟蹤鏈,方便在大型微服務(wù)應(yīng)用場(chǎng)景下快速定位問(wèn)題。
綜上所述,提出微應(yīng)用、微服務(wù)拆分設(shè)計(jì)的原則,從多個(gè)維度給出了拆分需要遵循的技術(shù)要求,描繪了兩種拆分模式,給出了信息系統(tǒng)向微應(yīng)用、微服務(wù)轉(zhuǎn)換過(guò)程中的拆分策略。