黨嘉楠
(西安交通大學(xué)軟件學(xué)院,陜西 西安 710049)
在互聯(lián)網(wǎng)開發(fā)“小步快跑,迭代試錯”的大環(huán)境下,DDD(領(lǐng)域驅(qū)動設(shè)計)似乎是一種比較“古老而緩慢”的思想。然而,隨著互聯(lián)網(wǎng)公司逐漸深入實體經(jīng)濟,業(yè)務(wù)日益復(fù)雜,在開發(fā)中也越來越多地遇到傳統(tǒng)行業(yè)軟件開發(fā)中所面臨的問題,如過度耦合、貧血癥(貧血領(lǐng)域?qū)ο螅珹nemic Domain Object,是指僅用作數(shù)據(jù)載體而沒有行為和動作的領(lǐng)域?qū)ο螅┖褪洶Y。而使用領(lǐng)域驅(qū)動設(shè)計思想可以很好地解決這些問題。為了降低系統(tǒng)耦合程度,在軟件的設(shè)計階段,基于領(lǐng)域驅(qū)動的建模需要軟件開發(fā)人員和相關(guān)領(lǐng)域?qū)<医Y(jié)合軟件開發(fā)人員的專業(yè)技能和領(lǐng)域?qū)<业膶I(yè)知識,建立準(zhǔn)確的領(lǐng)域模型,以更好地響應(yīng)需求變更,并縮短軟件開發(fā)周期。為了解決貧血癥和失憶癥問題,建立的多個領(lǐng)域模型都應(yīng)闡述現(xiàn)實中的實際問題,使相關(guān)軟件開發(fā)人員易于理解業(yè)務(wù),對系統(tǒng)進(jìn)行快速的維護和迭代。
領(lǐng)域驅(qū)動設(shè)計(Domain-Driven Design,簡稱DDD)是一種在軟件設(shè)計中應(yīng)該遵循的思維方式,其目標(biāo)在于加快具有復(fù)雜需求的軟件項目的研發(fā)速度[1]。領(lǐng)域驅(qū)動設(shè)計可以實現(xiàn)對應(yīng)到持續(xù)進(jìn)化的模型。領(lǐng)域驅(qū)動設(shè)計中最重要的理念是通過構(gòu)建領(lǐng)域模型來解決軟件開發(fā)的復(fù)雜性問題[1],因為在大多數(shù)軟件項目中,最困難的往往是解決業(yè)務(wù)領(lǐng)域復(fù)雜性,而非技術(shù)復(fù)雜性。領(lǐng)域驅(qū)動設(shè)計的一個顯著特征就是設(shè)計與開發(fā)的綁定,領(lǐng)域驅(qū)動設(shè)計強調(diào)軟件設(shè)計概念必須在開發(fā)過程中得以成功實現(xiàn)[2]。
領(lǐng)域驅(qū)動設(shè)計的前提是把項目的主要重點放在核心領(lǐng)域(Core Domain)和領(lǐng)域邏輯中;以領(lǐng)域中的模型為基礎(chǔ),進(jìn)行復(fù)雜的設(shè)計;讓軟件開發(fā)人員與領(lǐng)域?qū)<液献鳎缘绞絹硗晟铺囟I(lǐng)域問題的概念模型。
領(lǐng)域驅(qū)動設(shè)計的核心原則是模型設(shè)計概念必須在代碼中成功實現(xiàn),否則,它們將會變成抽象的討論。將模型與實現(xiàn)相綁定意味著在設(shè)計模型時既要反映業(yè)務(wù)概念又要考慮程序的實現(xiàn),這使得我們在選擇模型要做更多的考量,并且通常會經(jīng)歷多次反復(fù)修改和重新設(shè)計的過程。但是這樣的過程帶來的價值也是巨大的。將模型與實現(xiàn)相綁定,保證了程序代碼忠實地反映了領(lǐng)域知識的要求,有助于確保軟件正確地滿足用戶的需求。另一方面,由于代碼是嚴(yán)格按照領(lǐng)域模型來實現(xiàn)的,意味著開發(fā)人員與業(yè)務(wù)專家們有了共同的語言,這有助于他們之間展開高效的協(xié)作。
由于客戶端防私接技術(shù)需要強制學(xué)生用戶安裝客戶端,易引起學(xué)生的反感而遇到較大推行阻力,由此產(chǎn)生了非客戶端的防私接技術(shù),在不要求學(xué)生安裝任何客戶端的情況,通過對學(xué)生上網(wǎng)的數(shù)據(jù)進(jìn)行應(yīng)用特征的分析從而發(fā)現(xiàn)用戶的私接行為[3]。非客戶端防私接技術(shù)主要是對學(xué)生上網(wǎng)的流量報文進(jìn)行監(jiān)控,基于深度包檢測(DPI)技術(shù)、通過識別用戶接入設(shè)備類型和接入數(shù)量,確定用戶是否存在私接行為的監(jiān)控手段。與基于客戶端檢測的方法相比,流量防私接部署相對簡單,用戶無感知,但是實現(xiàn)技術(shù)比較復(fù)雜,準(zhǔn)確性和識別率存在問題。
在分析業(yè)界主流防私接系統(tǒng)的基礎(chǔ)上,發(fā)現(xiàn)不管是客戶端防私接系統(tǒng)還是非客戶端防私接系統(tǒng),系統(tǒng)耦合情況非常嚴(yán)重,軟件開發(fā)人員難以維護和迭代。因此基于領(lǐng)域驅(qū)動設(shè)計思想和校園防私接的需求基礎(chǔ)上,創(chuàng)新地提出了校園寬帶防私接整體方案。
將整個系統(tǒng)分為5個大模塊,將業(yè)務(wù)架構(gòu)映射到系統(tǒng)架構(gòu)上,實現(xiàn)高內(nèi)聚低耦合。
Horus Manager模塊:防私接平臺中的管理節(jié)點,它可以在Site模式和Controller模式下運行(相同的應(yīng)用程序在不同的模式下運行)。Site和Controller使用RabbitMQ相互通信。在Controller模式下運行的Horus Manager也是一個Site,但提供了一組REST API來定義/控制和管理集群。
Console模塊:防私接平臺前端Web控制中心,直接與Horus Manager進(jìn)行交互。
Client模塊:一款帶防共享功能的撥號管理客戶端,包含Windows、MacOS、iOS、Android下的一系列客戶端。
IVS(Identity Verification Service)模塊:與客戶端進(jìn)行心跳機制驗證的后端模塊。客戶端撥號后,與心跳服務(wù)器之間按預(yù)定或協(xié)商的算法通訊;服務(wù)器通過檢查數(shù)據(jù)是否按時到來、是否有效,來判斷客戶端是否還在線,是否偽造的客戶端。
主題學(xué)習(xí)模式 20世紀(jì)60年代,美國教育者熱衷于將學(xué)習(xí)目標(biāo)進(jìn)行分類研究,如布盧姆把教學(xué)目標(biāo)分為三個領(lǐng)域,但在實踐過程中發(fā)現(xiàn)這三個領(lǐng)域?qū)嶋H是一個整體,這種分類方法造成它們之間相互分離。所以,20世紀(jì)90年代中期,整合課程研究的熱潮在美國興起,主題學(xué)習(xí)作為整合教學(xué)目標(biāo)的有效方式,開始被廣泛應(yīng)用。
Trafficam(Network Traffic Monitor)模塊:是防私接平臺的一個流量監(jiān)控應(yīng)用模塊。它接受傳入的網(wǎng)絡(luò)流量對象(例如pcap、suricata-eve等)并嘗試從中提取信息并以持久的方式保留這些信息。
系統(tǒng)架構(gòu)關(guān)系如圖1所示。

圖1 系統(tǒng)架構(gòu)關(guān)系圖
Horus Manager模塊是整個系統(tǒng)中的核心,也是業(yè)務(wù)邏輯最復(fù)雜的一部分。使用領(lǐng)域驅(qū)動設(shè)計思想設(shè)計該模塊,可以有效降低系統(tǒng)復(fù)雜度,有利于軟件開發(fā)人員快速開發(fā)和維護。
將一個復(fù)雜的程序切分成層。開發(fā)每一個層中內(nèi)聚的設(shè)計,讓每個層僅依賴于它底下的那層。遵照標(biāo)準(zhǔn)的架構(gòu)模式以提供層的低耦合。將領(lǐng)域模型相關(guān)的代碼集中到一個層中,把它從用戶界面、應(yīng)用和基礎(chǔ)設(shè)施代碼中分隔開來。
因此,Horus Manager模塊的總體框架基于領(lǐng)域驅(qū)動進(jìn)行設(shè)計,分為4層,具體如下。
API層(用戶接口層):本層的主要功能是提供接口使后端與前端進(jìn)行交互。在實現(xiàn)過程中,要先確認(rèn)與前端進(jìn)行交互的各種DTO,用于滿足系統(tǒng)前后端交互數(shù)據(jù)的安全性。其次,使用外觀模式(Facade Pattern)隱藏系統(tǒng)的復(fù)雜性,給前端提供一個統(tǒng)一入口,并對外屏蔽內(nèi)部子系統(tǒng)的調(diào)用細(xì)節(jié)。
Application層(應(yīng)用層):本層是很薄的一層,本層的主要功能是是用于協(xié)調(diào)各種應(yīng)用情況。本層主要負(fù)責(zé)DTO和實體值對象的數(shù)據(jù)轉(zhuǎn)換,對于簡單的業(yè)務(wù),也可以在本層直接加載實體,執(zhí)行實體行為方法。本層不包含業(yè)務(wù)邏輯,注意本層可以包含查詢邏輯,但核心業(yè)務(wù)邏輯必須下沉到Domain層。本層不保留業(yè)務(wù)對象的狀態(tài),只保有應(yīng)用任務(wù)的進(jìn)度狀態(tài)。
Domin層(領(lǐng)域?qū)樱罕緦邮穷I(lǐng)域驅(qū)動設(shè)計思想中最重要的一層,包含關(guān)于系統(tǒng)領(lǐng)域的信息。本層是業(yè)務(wù)軟件的核心所在,在本層實現(xiàn)核心的業(yè)務(wù)邏輯。只有在本層可以保留業(yè)務(wù)對象的狀態(tài),對業(yè)務(wù)對象和它們狀態(tài)的持久化被委托給了Infrastructure層。
Infrastructure層(基礎(chǔ)設(shè)施層):本層主要功能是對Domin模塊進(jìn)行持久化。本層可以把領(lǐng)域?qū)ο笮蛄谢街付ǖ脑校鐢?shù)據(jù)庫、文件或者內(nèi)存對象,當(dāng)然也提供從物理元件取出數(shù)據(jù)到領(lǐng)域?qū)ο蟮墓δ堋1緦幼鳛槠渌麑拥闹螏齑嬖冢峁┝藢娱g的通信,實現(xiàn)了對業(yè)務(wù)對象的持久化。
Horus Manager模塊最重要的功能就是接收IVS模塊與Trafficam模塊傳來的信息,分析并判斷該用戶是否私接。對此,當(dāng)然可以使用復(fù)雜的業(yè)務(wù)邏輯對此進(jìn)行判斷。但當(dāng)開發(fā)此功能的軟件開發(fā)人員離職后,其他軟件開發(fā)人員接手此系統(tǒng)時,會發(fā)現(xiàn)此業(yè)務(wù)邏輯非常難以理解,需要花費大量時間讀懂這些業(yè)務(wù)邏輯。于是需要基于領(lǐng)域驅(qū)動設(shè)計思想解決該問題,我們發(fā)現(xiàn)判斷一個人是否私接與現(xiàn)實生活中司法系統(tǒng)判斷一個人是否有罪有異曲同工之妙,因此基于現(xiàn)實中的司法系統(tǒng)對解決該問題進(jìn)行建模,可以使沒有開發(fā)此系統(tǒng)的軟件開發(fā)人員易于理解復(fù)雜的業(yè)務(wù)邏輯。
現(xiàn)實中的司法系統(tǒng)判斷一個人是否有罪需要經(jīng)過搜集證據(jù)、訴訟、定罪、執(zhí)法4步。因此,基于司法系統(tǒng)對判斷該用戶是否私接進(jìn)行建模,建立CaseInstance、Prosecution、Conviction、Enforcement這4個主要實體。CaseInstance表示會話,其中保存著會話的私接證據(jù)、身份信息、網(wǎng)絡(luò)信息等;Prosecution表示訴訟過程;Conviction表示定罪過程;Enforcement表示執(zhí)法過程。這樣建模將原本復(fù)雜的判斷私接過程拆分開來,使相關(guān)軟件開發(fā)人員易于理解,因為司法系統(tǒng)本就是現(xiàn)實中存在的東西,就此實現(xiàn)和維護功能將變得非常簡單。4個核心實體的類圖如圖2所示。

圖2 核心功能類圖
Horus Manager模塊的核心功能如下。
對用戶會話進(jìn)行管理:案件管理、登記和結(jié)案。從RADIUS服務(wù)器接收RADIUS計費數(shù)據(jù)包以創(chuàng)建和銷毀會話。
獲得私接證據(jù)過程:實施“身份驗證”協(xié)議并處理來自已知客戶端應(yīng)用程序(IVS)的協(xié)商和通知,監(jiān)控網(wǎng)絡(luò)流量并從網(wǎng)絡(luò)流量中提取已知數(shù)據(jù)庫的信息(Trafficam)。接受來自IVS/Trafficam的案件調(diào)查。
進(jìn)行訴訟過程:案件調(diào)查適用條例。
進(jìn)行定罪過程:根據(jù)組織/用戶組和配置的策略定罪案例。
進(jìn)行執(zhí)法過程:執(zhí)行強制(斷開連接、限速或阻止私接賬號使用操作),將判決結(jié)果發(fā)送給BAS(高校寬帶運營管理平臺)進(jìn)行執(zhí)行。
校園防私接系統(tǒng)應(yīng)用領(lǐng)域驅(qū)動設(shè)計思想進(jìn)行設(shè)計開發(fā),降低了系統(tǒng)耦合度,使系統(tǒng)易于維護和迭代。領(lǐng)域驅(qū)動設(shè)計的最大優(yōu)勢是直接將核心業(yè)務(wù)邏輯與領(lǐng)域模型結(jié)合起來,更好實現(xiàn)高內(nèi)聚、松耦合,這種優(yōu)勢逐漸使其成為軟件設(shè)計的主流思想,特別是面對大型復(fù)雜的互聯(lián)網(wǎng)系統(tǒng)。同時現(xiàn)如今的企業(yè)發(fā)展也越來越重視維護和迭代,所以領(lǐng)域驅(qū)動設(shè)計也會取得越來越廣泛的應(yīng)用。在進(jìn)行系統(tǒng)設(shè)計時,需要按照需求合理設(shè)計模型。在進(jìn)行分層建設(shè)過程中,也需要充分考慮好各種不必要因素,及時調(diào)整,選擇合理框架以及開發(fā)系統(tǒng),提高運行效率。