作者簡介
袁健,中國移動云能力中心SaaS產(chǎn)品部技術(shù)專家組成員,曾負(fù)責(zé)能力開放平臺、云能OA門戶、集中化遠(yuǎn)程交付、集中化計(jì)劃建設(shè)等產(chǎn)品及項(xiàng)目的研發(fā)工作,架構(gòu)設(shè)計(jì)及研發(fā)管理經(jīng)驗(yàn)豐富,在微服務(wù)架構(gòu)設(shè)計(jì)及領(lǐng)域驅(qū)動設(shè)計(jì)方面有較為深入的研究。
導(dǎo)讀
隨著云原生基礎(chǔ)設(shè)施的日漸完善,微服務(wù)等架構(gòu)的日漸成熟,信息化系統(tǒng)能夠支撐的業(yè)務(wù)也越來越復(fù)雜。如果沒有適當(dāng)?shù)姆椒,就很難對復(fù)雜的業(yè)務(wù)進(jìn)行分析與實(shí)現(xiàn),云原生基礎(chǔ)設(shè)施與架構(gòu)的效能也很難充分體現(xiàn)。領(lǐng)域驅(qū)動設(shè)計(jì)就是這樣的一種思想,它可以指導(dǎo)研發(fā)團(tuán)隊(duì)更好的進(jìn)行業(yè)務(wù)分析與規(guī)劃,高效高質(zhì)的提煉領(lǐng)域模型,用領(lǐng)域模型指導(dǎo)架構(gòu)設(shè)計(jì)和研發(fā)實(shí)現(xiàn)。
一、微服務(wù)不是銀彈
1、微服務(wù)架構(gòu)的難點(diǎn)
云原生時代微服務(wù)架構(gòu)由于高擴(kuò)展性、高容錯性、高可用性以及快捷交付的優(yōu)勢,得到廣泛的應(yīng)用。但是微服務(wù)架構(gòu)對研發(fā)團(tuán)隊(duì)也存在拆分難、治理難的困擾。微服務(wù)拆不好,影響系統(tǒng)的后續(xù)擴(kuò)展與實(shí)際運(yùn)行,微服務(wù)的優(yōu)勢得不到體現(xiàn)。微服務(wù)治理不好,影響微服務(wù)的運(yùn)行與后期運(yùn)維。
2、難點(diǎn)應(yīng)對措施
目前微服務(wù)治理工具發(fā)展較為完善,不管從框架層面還是基礎(chǔ)設(shè)施層面都有很好的解決方案。相對于微服務(wù)治理,微服務(wù)拆分沒有實(shí)體工具來支撐,更多的是需要設(shè)計(jì)人員的自身能力,不但需要對業(yè)務(wù)有很好理解,還需要有一定的技術(shù)功底,更需要有科學(xué)方法論的加持。但是,往往負(fù)責(zé)微服務(wù)拆分的設(shè)計(jì)人員都缺少科學(xué)方法論的支撐,領(lǐng)域驅(qū)動設(shè)計(jì)思想正好能彌補(bǔ)這一方面的空缺。
二、完善的設(shè)計(jì)思想-領(lǐng)域驅(qū)動設(shè)計(jì)
1、什么是領(lǐng)域驅(qū)動設(shè)計(jì)
領(lǐng)域驅(qū)動設(shè)計(jì)不是架構(gòu)方法,也不是設(shè)計(jì)模式,就是一種思維方式(在此基礎(chǔ)上延伸出了一些方法論),通過領(lǐng)域驅(qū)動設(shè)計(jì)這種思維方式,定義領(lǐng)域模型,從而確定業(yè)務(wù)邊界和應(yīng)用邊界,保證業(yè)務(wù)模型和代碼模型的一致性。
很多讀者因?yàn)槠鋸?fù)雜的理論而認(rèn)為領(lǐng)域驅(qū)動設(shè)計(jì)只適用于復(fù)雜系統(tǒng)或者是微服務(wù)架構(gòu)的系統(tǒng)。這是認(rèn)識上的誤區(qū),由于整套理論的目的之一是解決設(shè)計(jì)與研發(fā)脫節(jié)的問題,因此對于簡單業(yè)務(wù)或者單體系統(tǒng)也同樣適用。
2、領(lǐng)域驅(qū)動思想的由來與發(fā)展
領(lǐng)域驅(qū)動設(shè)計(jì)思想首先是Eric Evans提出來的,后來又由Jimmy Nilsson等人不斷的充實(shí)和豐富。當(dāng)前這個思想不是一蹴而就的,在他之前Martin Fower先提出了技術(shù)架構(gòu)領(lǐng)域的設(shè)計(jì)模式思想。
• 2002年Martin Fower在其出版《企業(yè)應(yīng)用架構(gòu)模式》中,歸納總結(jié)了40多種企業(yè)應(yīng)用架構(gòu)的設(shè)計(jì)模式。其中所提到的多種設(shè)計(jì)模式和概念,如事務(wù)腳本、活動記錄和領(lǐng)域模型等,對業(yè)界產(chǎn)生了深遠(yuǎn)的影響。
• 2004年著名建模專家Eric Evans發(fā)表了他最具影響力的著名書籍:《Domain-Driven Design –Tackling Complexity in the Heart of Software》(中文譯名:領(lǐng)域驅(qū)動設(shè)計(jì)—軟件核心復(fù)雜性應(yīng)對之道),書中提出了“領(lǐng)域驅(qū)動設(shè)計(jì)(簡稱DDD)”的概念。
• 此后Jimmy Nilsson的《Applying Domain-Driven Design and Patterns》、Abel Avram和Floyd Marinescu合作的《Domain-Driven Design Quickly》、Dan Haywood的《Domain-Driven Design Using Naked Objects》、以及Vaughn Vernon的《Implementing Domain-Driven Design》等書籍的出版,豐富了領(lǐng)域驅(qū)動設(shè)計(jì)的實(shí)踐和指導(dǎo)。
領(lǐng)域驅(qū)動設(shè)計(jì)思想基于架構(gòu)設(shè)計(jì)模式,相輔相成,互為補(bǔ)充。Martin Fower的架構(gòu)設(shè)計(jì)模式主要是技術(shù)架構(gòu)的設(shè)計(jì)方法論。而Eric Evans的領(lǐng)域驅(qū)動設(shè)計(jì)填補(bǔ)了業(yè)務(wù)領(lǐng)域設(shè)計(jì)的空白,并且為業(yè)務(wù)設(shè)計(jì)到技術(shù)設(shè)計(jì)的銜接起到了重要的指導(dǎo)作用,Eric Evans提出領(lǐng)域驅(qū)動思想的一個重要目的之一就是希望業(yè)務(wù)架構(gòu)設(shè)計(jì)人員不能和一線研發(fā)人員脫節(jié),要不斷接收研發(fā)的反饋,不斷的迭代業(yè)務(wù)架構(gòu)的設(shè)計(jì),使設(shè)計(jì)真正的能夠落地。
3、領(lǐng)域驅(qū)動設(shè)計(jì)的過程
領(lǐng)域驅(qū)動設(shè)計(jì)貫穿了整個軟件開發(fā)的生命周期,包括對需求的分析,建模,架構(gòu),設(shè)計(jì)以及最終的編碼實(shí)現(xiàn)。大致可以分為兩個階段,戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì)。所謂戰(zhàn)略設(shè)計(jì),可以簡單理解為粗粒度設(shè)計(jì),即領(lǐng)域的劃分。所謂戰(zhàn)術(shù)設(shè)計(jì),可以簡單理解為細(xì)粒度的設(shè)計(jì),采用模型驅(qū)動設(shè)計(jì)方法對各領(lǐng)域分而治之,不涉及技術(shù)層面的細(xì)節(jié)但對研發(fā)具有指導(dǎo)意義。
領(lǐng)域驅(qū)動設(shè)計(jì)過程是一個演進(jìn)的過程,戰(zhàn)略設(shè)計(jì)控制和分解戰(zhàn)術(shù)設(shè)計(jì)的邊界與粒度,戰(zhàn)術(shù)設(shè)計(jì)則以實(shí)證角度驗(yàn)證領(lǐng)域模型的有效性、完整性與一致性,進(jìn)而以演進(jìn)的方式對之前的戰(zhàn)略設(shè)計(jì)階段進(jìn)行迭代,從而形成一種螺旋式上升的迭代設(shè)計(jì)過程,兩個不同階段的設(shè)計(jì)目標(biāo)是保持一致的,它們是一個連貫的過程,彼此之間又相互指導(dǎo)與規(guī)范,并最終保證一個有效的領(lǐng)域模型和一個富有表達(dá)力的實(shí)現(xiàn)同時演進(jìn),如下圖所示:
三、領(lǐng)域驅(qū)動設(shè)計(jì)思想的微服務(wù)實(shí)踐案例
1、實(shí)踐案例介紹
1.1、實(shí)踐案例背景及目標(biāo)
隨著中國移動戰(zhàn)略轉(zhuǎn)型,計(jì)劃建設(shè)領(lǐng)域的項(xiàng)目管理辦法逐漸完善及各省信息化系統(tǒng)的逐步實(shí)施,導(dǎo)致當(dāng)前計(jì)劃建設(shè)管理系統(tǒng)為集團(tuán)與省公司兩級平臺的建設(shè)方式,存在管理方式不統(tǒng)一,精細(xì)化管理水平差異大,數(shù)據(jù)標(biāo)準(zhǔn)化和互通流轉(zhuǎn)不暢,嵌入式風(fēng)險管理薄弱等問題,已不能滿足日益提高的項(xiàng)目管理要求,亟待建設(shè)集中化的計(jì)劃建設(shè)管理系統(tǒng),以達(dá)到規(guī)范各省項(xiàng)目管理流程、統(tǒng)一數(shù)據(jù)規(guī)范、防范生產(chǎn)及管理風(fēng)險等目的。
基于上述背景,中國移動集團(tuán)啟動了集中化計(jì)劃建設(shè)系統(tǒng)的研發(fā)工作。集中化計(jì)劃建設(shè)管理系統(tǒng)是一個融管理, 業(yè)務(wù), 架構(gòu)于一體的管理系統(tǒng),實(shí)現(xiàn)了計(jì)劃建設(shè)領(lǐng)域全生命周期流程覆蓋、全專業(yè)支撐,要求做到管理一體化、業(yè)務(wù)一體化以及架構(gòu)一體化。
1.2、項(xiàng)目研發(fā)存在諸多困難與挑戰(zhàn)
集中化計(jì)劃建設(shè)系統(tǒng)由于需要在管理、業(yè)務(wù)以及架構(gòu)三個維度對全國各省各專業(yè)公司已有系統(tǒng)及數(shù)據(jù)進(jìn)行統(tǒng)一管理,因此在這三個維度分別存在巨大的困難與挑戰(zhàn)。
• 業(yè)務(wù)維度:隨著業(yè)務(wù)持續(xù)演進(jìn),業(yè)務(wù)復(fù)雜度越來越高,業(yè)務(wù)要求的響應(yīng)速度也越來越快。
• 技術(shù)維度:流程數(shù)量較多,流程設(shè)計(jì)、變更頻次高,對平臺易用性及擴(kuò)展性要求越來越高;接口交互調(diào)用頻次高,對性能及穩(wěn)定性要求較高;分布式部署環(huán)境復(fù)雜,需要同時支持集中監(jiān)控及分域管理。
• 管理維度:跨系統(tǒng)間協(xié)作,參與單位多,涉及的人員多,管理復(fù)雜度高;流程數(shù)量較多,流程發(fā)布、變更、下線等管理復(fù)雜度高。
針對以上三個維度的困難,在架構(gòu)及業(yè)務(wù)領(lǐng)域設(shè)計(jì)上分別采用了先進(jìn)的微服務(wù)+PaaS的架構(gòu)模式和領(lǐng)域驅(qū)動設(shè)計(jì)思想。
1.3、采用微服務(wù)+PaaS技術(shù)架構(gòu)
系統(tǒng)包括多個獨(dú)立自治的子模塊、對于系統(tǒng)可擴(kuò)展性、容錯率等要求較高,這些要求與微服務(wù)架構(gòu)的優(yōu)點(diǎn)不謀而合;同時由于其對接系統(tǒng)多、體量大、資源維護(hù)難度大,若采用傳統(tǒng)管理模式勢必帶來資源難以管控等問題,因此采用PaaS平臺化的管理模式進(jìn)行資源及能力統(tǒng)一管控,有利于實(shí)現(xiàn)系統(tǒng)彈性擴(kuò)展能力。
1.4、采用領(lǐng)域驅(qū)動設(shè)計(jì)解決業(yè)務(wù)復(fù)雜問題
由于計(jì)劃建設(shè)管理系統(tǒng)目標(biāo)是建設(shè)全國集中的、服務(wù)一線生產(chǎn)與管理的系統(tǒng),并且能夠達(dá)到規(guī)范各單位項(xiàng)目管理流程、統(tǒng)一數(shù)據(jù)規(guī)范、防范生產(chǎn)及管理風(fēng)險等目的,實(shí)現(xiàn)計(jì)劃建設(shè)領(lǐng)域全生命周期流程覆蓋,全專業(yè)支撐,內(nèi)部及外部用戶全員使用,因此業(yè)務(wù)邏輯非常復(fù)雜。
系統(tǒng)整體業(yè)務(wù)復(fù)雜,從投資計(jì)劃到項(xiàng)目歸檔貫穿資產(chǎn)管理全生命周期,沒有科學(xué)的業(yè)務(wù)分析方法,很難做到業(yè)務(wù)的細(xì)化拆解,實(shí)現(xiàn)高內(nèi)聚低耦合的目標(biāo),項(xiàng)目團(tuán)隊(duì)通過深入調(diào)研和對比,最終決定采用領(lǐng)域驅(qū)動設(shè)計(jì)思想解決目前面臨的業(yè)務(wù)復(fù)雜、微服務(wù)拆解困難的問題。
2、基于領(lǐng)域驅(qū)動設(shè)計(jì)思路的微服務(wù)落地
項(xiàng)目整體采用領(lǐng)域驅(qū)動設(shè)計(jì)思想。領(lǐng)域驅(qū)動設(shè)計(jì)是自頂向下的設(shè)計(jì)方法,先在業(yè)務(wù)期望明確的基礎(chǔ)上進(jìn)行戰(zhàn)略設(shè)計(jì),再進(jìn)行戰(zhàn)術(shù)設(shè)計(jì)。戰(zhàn)略設(shè)計(jì)從宏觀角度來觀察和審視軟件系統(tǒng),戰(zhàn)術(shù)設(shè)計(jì)將戰(zhàn)略設(shè)計(jì)進(jìn)行具體化和細(xì)節(jié)化,側(cè)重于技術(shù)實(shí)現(xiàn)。統(tǒng)一語言的建立貫穿整個項(xiàng)目研發(fā)的始終。
2.1、項(xiàng)目團(tuán)隊(duì)領(lǐng)域驅(qū)動設(shè)計(jì)實(shí)踐概覽及團(tuán)隊(duì)協(xié)作關(guān)系
項(xiàng)目團(tuán)隊(duì)在領(lǐng)域?qū)<业膸ьI(lǐng)下通過對行業(yè)最佳實(shí)踐的學(xué)習(xí)以及對PMS現(xiàn)狀診斷及業(yè)務(wù)期望的分析,梳理系統(tǒng)全景業(yè)務(wù)流程并對流程進(jìn)行業(yè)務(wù)邊界的劃分;跇I(yè)務(wù)邊界,依據(jù)康威定律劃分團(tuán)隊(duì),各團(tuán)隊(duì)由領(lǐng)域?qū)<液脱邪l(fā)組成,每個團(tuán)隊(duì)在各自的業(yè)務(wù)領(lǐng)域進(jìn)行分析與設(shè)計(jì),團(tuán)隊(duì)間協(xié)作關(guān)系由項(xiàng)目經(jīng)理進(jìn)行協(xié)調(diào)。架構(gòu)師在領(lǐng)域?qū)<遗浜舷拢诩夹g(shù)實(shí)現(xiàn)層面進(jìn)行微服務(wù)設(shè)計(jì)指導(dǎo)研發(fā)編碼實(shí)現(xiàn)。
2.2、系統(tǒng)的頂層價值設(shè)計(jì)
2.2.1、業(yè)務(wù)期望分析與明確
分析系統(tǒng)的業(yè)務(wù)期望,首先需要分析系統(tǒng)的相關(guān)干系人,對干系人進(jìn)行歸納,分析他們對系統(tǒng)的期望。借助業(yè)務(wù)需求和管理關(guān)注點(diǎn)分析模型,發(fā)現(xiàn)并匯總集團(tuán)、省分、地市不同關(guān)注者的關(guān)注點(diǎn)和問題,明確各環(huán) 節(jié)投資與建設(shè)目標(biāo)。
組織干系人進(jìn)行頭腦風(fēng)暴,以便干系人對業(yè)務(wù)系統(tǒng)期望達(dá)成一致。在設(shè)計(jì)過程中,團(tuán)隊(duì)成員對于愿景的輸入相對較少,潛在原因是前期未達(dá)成共識,討論思想較少,目標(biāo)系統(tǒng) 知識缺乏,主要通過目標(biāo)系統(tǒng)歸口部門完成相關(guān)的信息輸入。
2.2.2、統(tǒng)一語言的建立
為了統(tǒng)一所有領(lǐng)域公共概念的表達(dá)形式,項(xiàng)目組在開始進(jìn)行領(lǐng)域分析之前,先把全局概念進(jìn)行定義,為戰(zhàn)略設(shè)計(jì)階段的分析奠定溝通基礎(chǔ)。所有領(lǐng)域?qū)<遗c研發(fā)團(tuán)隊(duì)分別從計(jì)劃建設(shè)主流程的資金管理和項(xiàng)目管理兩條線進(jìn)行梳理,從全局角度提煉統(tǒng)一語言。首先梳理了67條核心業(yè)務(wù)概念,待后續(xù)領(lǐng)域劃分好之后,各個領(lǐng)域團(tuán)隊(duì)再逐步細(xì)化與定義各自的領(lǐng)域術(shù)語,進(jìn)行領(lǐng)域內(nèi)表達(dá)方式的統(tǒng)一。
2.3、戰(zhàn)略設(shè)計(jì)階段
2.3.1、業(yè)務(wù)全景分析
進(jìn)入戰(zhàn)略設(shè)計(jì)階段,基于事件風(fēng)暴分析方法,以領(lǐng)域?qū)<覟橹鲗?dǎo),大家從項(xiàng)目前期、項(xiàng)目實(shí)施以及項(xiàng)目收尾三個階段,梳理了從需求規(guī)劃到項(xiàng)目結(jié)束,包含72個核心事件的全景業(yè)務(wù)流程。為進(jìn)一步領(lǐng)域劃分展示了清晰的全景視圖。
事件風(fēng)暴是一種高度強(qiáng)調(diào)交流與協(xié)作的可視化工作坊,在分析過程匯總,重點(diǎn)尋找業(yè)務(wù)流程中產(chǎn)生的領(lǐng)域事件,探索出業(yè)務(wù)全景;跇I(yè)務(wù)全景以及事件表達(dá)的業(yè)務(wù)概念,就可以對領(lǐng)域進(jìn)行劃分,確定子領(lǐng)域和限界上下文。
2.3.2、領(lǐng)域分析與微服務(wù)劃分
基于業(yè)務(wù)全景圖,領(lǐng)域?qū)<液脱邪l(fā)團(tuán)隊(duì)對系統(tǒng)業(yè)務(wù)場景分三個階段(項(xiàng)目前期、項(xiàng)目實(shí)施以及項(xiàng)目收尾)進(jìn)行領(lǐng)域分析與劃分。通過識別限界上下文,聚焦核心領(lǐng)域,以項(xiàng)目前期階段3個核心領(lǐng)域,項(xiàng)目實(shí)施階段3個核心領(lǐng)域以及項(xiàng)目收尾階段4個核心領(lǐng)域?yàn)橹行倪M(jìn)行分析,劃分出15個業(yè)務(wù)域,并通過上下文映射建立它們之間的關(guān)系。最后,基于核心業(yè)務(wù)領(lǐng)域的劃分,領(lǐng)域?qū)<遗c技術(shù)專家進(jìn)一步分析支撐核心領(lǐng)域的技術(shù)能力及非核心領(lǐng)域功能,在核心領(lǐng)域基礎(chǔ)上擴(kuò)展出20個領(lǐng)域,最終基于領(lǐng)域劃分20個微服務(wù)。同時領(lǐng)域?qū)<液脱邪l(fā)團(tuán)隊(duì)按微服務(wù)分成20個研發(fā)小組,一個微服務(wù)團(tuán)隊(duì)領(lǐng)域?qū)<液图夹g(shù)專家各一名。
2.4、戰(zhàn)術(shù)設(shè)計(jì)階段
在完成微服務(wù)劃分之后,項(xiàng)目組進(jìn)入單個微服務(wù)的詳細(xì)設(shè)計(jì)階段。20個微服務(wù)按組分別進(jìn)行領(lǐng)域模型分析,整個分析過程借鑒了事件風(fēng)暴和領(lǐng)域模型驅(qū)動設(shè)計(jì)的方法,先對領(lǐng)域進(jìn)行事件分析,然后細(xì)分領(lǐng)域,進(jìn)行領(lǐng)域內(nèi)模塊的劃分,最后對領(lǐng)域模型進(jìn)行建模,指導(dǎo)研發(fā)工程師進(jìn)行程序的研發(fā)。期間隨著領(lǐng)域模型分析的不斷深入,各微服務(wù)的模型也不斷進(jìn)行迭代與重構(gòu)。
其中以物資微服務(wù)為例,通過分析劃分出8個模塊(基礎(chǔ)數(shù)據(jù)、項(xiàng)目領(lǐng)料、物資接收、物料平衡、現(xiàn)場物資、現(xiàn)場物資調(diào)撥、項(xiàng)目退料和庫存查詢),然后分別對每個模塊進(jìn)行建模,指導(dǎo)研發(fā)工程師建立ER關(guān)系圖。
整個建模過程圍繞業(yè)務(wù)需求,分析與提煉領(lǐng)業(yè)務(wù)需求中的領(lǐng)域知識。為了避免受技術(shù)的干擾,完全表達(dá)業(yè)務(wù)的邏輯關(guān)系,建模過程由領(lǐng)域?qū)<抑鲗?dǎo),在領(lǐng)域?qū)<抑笇?dǎo)審核下,模型由研發(fā)團(tuán)隊(duì)創(chuàng)建,保證模型的順利落地,業(yè)務(wù)與技術(shù)不脫節(jié)。
總結(jié)
領(lǐng)域驅(qū)動設(shè)計(jì)的核心是化繁為簡,思想上有其普適性,方法上有其特殊性。實(shí)現(xiàn)上大概可以概括為,先以分層架構(gòu)突出業(yè)務(wù)領(lǐng)域,再以模型驅(qū)動的方法把業(yè)務(wù)進(jìn)行領(lǐng)域劃分,最后細(xì)分模型指導(dǎo)架構(gòu)設(shè)計(jì)與研發(fā)實(shí)現(xiàn)。在實(shí)際研發(fā)過程中應(yīng)該合理采用領(lǐng)域驅(qū)動設(shè)計(jì)思想,揚(yáng)長避短,靈活運(yùn)用。
隨著信息化程度的日益增高,業(yè)務(wù)和技術(shù)已深度融合。在業(yè)務(wù)對技術(shù)的要求不斷提高的同時,技術(shù)對業(yè)務(wù)的要求也在不斷提升。沒有好的業(yè)務(wù)架構(gòu)設(shè)計(jì),要設(shè)計(jì)好技術(shù)架構(gòu)就會很存在很大的局限性。在業(yè)務(wù)分析階段應(yīng)優(yōu)先考慮領(lǐng)域問題,只有在業(yè)務(wù)分析透徹的基礎(chǔ)上,才能設(shè)計(jì)出高內(nèi)聚低耦合、擴(kuò)展性良好的技術(shù)架構(gòu)。