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