黨嘉楠
(西安交通大學軟件學院,陜西 西安 710049)
在互聯(lián)網(wǎng)開發(fā)“小步快跑,迭代試錯”的大環(huán)境下,DDD(領域驅動設計)似乎是一種比較“古老而緩慢”的思想。然而,隨著互聯(lián)網(wǎng)公司逐漸深入實體經(jīng)濟,業(yè)務日益復雜,在開發(fā)中也越來越多地遇到傳統(tǒng)行業(yè)軟件開發(fā)中所面臨的問題,如過度耦合、貧血癥(貧血領域對象,Anemic Domain Object,是指僅用作數(shù)據(jù)載體而沒有行為和動作的領域對象)和失憶癥。而使用領域驅動設計思想可以很好地解決這些問題。為了降低系統(tǒng)耦合程度,在軟件的設計階段,基于領域驅動的建模需要軟件開發(fā)人員和相關領域專家結合軟件開發(fā)人員的專業(yè)技能和領域專家的專業(yè)知識,建立準確的領域模型,以更好地響應需求變更,并縮短軟件開發(fā)周期。為了解決貧血癥和失憶癥問題,建立的多個領域模型都應闡述現(xiàn)實中的實際問題,使相關軟件開發(fā)人員易于理解業(yè)務,對系統(tǒng)進行快速的維護和迭代。
領域驅動設計(Domain-Driven Design,簡稱DDD)是一種在軟件設計中應該遵循的思維方式,其目標在于加快具有復雜需求的軟件項目的研發(fā)速度[1]。領域驅動設計可以實現(xiàn)對應到持續(xù)進化的模型。領域驅動設計中最重要的理念是通過構建領域模型來解決軟件開發(fā)的復雜性問題[1],因為在大多數(shù)軟件項目中,最困難的往往是解決業(yè)務領域復雜性,而非技術復雜性。領域驅動設計的一個顯著特征就是設計與開發(fā)的綁定,領域驅動設計強調軟件設計概念必須在開發(fā)過程中得以成功實現(xiàn)[2]。
領域驅動設計的前提是把項目的主要重點放在核心領域(Core Domain)和領域邏輯中;以領域中的模型為基礎,進行復雜的設計;讓軟件開發(fā)人員與領域專家合作,以迭代方式來完善特定領域問題的概念模型。
領域驅動設計的核心原則是模型設計概念必須在代碼中成功實現(xiàn),否則,它們將會變成抽象的討論。將模型與實現(xiàn)相綁定意味著在設計模型時既要反映業(yè)務概念又要考慮程序的實現(xiàn),這使得我們在選擇模型要做更多的考量,并且通常會經(jīng)歷多次反復修改和重新設計的過程。但是這樣的過程帶來的價值也是巨大的。將模型與實現(xiàn)相綁定,保證了程序代碼忠實地反映了領域知識的要求,有助于確保軟件正確地滿足用戶的需求。另一方面,由于代碼是嚴格按照領域模型來實現(xiàn)的,意味著開發(fā)人員與業(yè)務專家們有了共同的語言,這有助于他們之間展開高效的協(xié)作。
由于客戶端防私接技術需要強制學生用戶安裝客戶端,易引起學生的反感而遇到較大推行阻力,由此產(chǎn)生了非客戶端的防私接技術,在不要求學生安裝任何客戶端的情況,通過對學生上網(wǎng)的數(shù)據(jù)進行應用特征的分析從而發(fā)現(xiàn)用戶的私接行為[3]。非客戶端防私接技術主要是對學生上網(wǎng)的流量報文進行監(jiān)控,基于深度包檢測(DPI)技術、通過識別用戶接入設備類型和接入數(shù)量,確定用戶是否存在私接行為的監(jiān)控手段。與基于客戶端檢測的方法相比,流量防私接部署相對簡單,用戶無感知,但是實現(xiàn)技術比較復雜,準確性和識別率存在問題。
在分析業(yè)界主流防私接系統(tǒng)的基礎上,發(fā)現(xiàn)不管是客戶端防私接系統(tǒng)還是非客戶端防私接系統(tǒng),系統(tǒng)耦合情況非常嚴重,軟件開發(fā)人員難以維護和迭代。因此基于領域驅動設計思想和校園防私接的需求基礎上,創(chuàng)新地提出了校園寬帶防私接整體方案。
將整個系統(tǒng)分為5個大模塊,將業(yè)務架構映射到系統(tǒng)架構上,實現(xiàn)高內聚低耦合。
Horus Manager模塊:防私接平臺中的管理節(jié)點,它可以在Site模式和Controller模式下運行(相同的應用程序在不同的模式下運行)。Site和Controller使用RabbitMQ相互通信。在Controller模式下運行的Horus Manager也是一個Site,但提供了一組REST API來定義/控制和管理集群。
Console模塊:防私接平臺前端Web控制中心,直接與Horus Manager進行交互。
Client模塊:一款帶防共享功能的撥號管理客戶端,包含Windows、MacOS、iOS、Android下的一系列客戶端。
IVS(Identity Verification Service)模塊:與客戶端進行心跳機制驗證的后端模塊??蛻舳藫芴柡?,與心跳服務器之間按預定或協(xié)商的算法通訊;服務器通過檢查數(shù)據(jù)是否按時到來、是否有效,來判斷客戶端是否還在線,是否偽造的客戶端。
主題學習模式 20世紀60年代,美國教育者熱衷于將學習目標進行分類研究,如布盧姆把教學目標分為三個領域,但在實踐過程中發(fā)現(xiàn)這三個領域實際是一個整體,這種分類方法造成它們之間相互分離。所以,20世紀90年代中期,整合課程研究的熱潮在美國興起,主題學習作為整合教學目標的有效方式,開始被廣泛應用。
Trafficam(Network Traffic Monitor)模塊:是防私接平臺的一個流量監(jiān)控應用模塊。它接受傳入的網(wǎng)絡流量對象(例如pcap、suricata-eve等)并嘗試從中提取信息并以持久的方式保留這些信息。
系統(tǒng)架構關系如圖1所示。
圖1 系統(tǒng)架構關系圖
Horus Manager模塊是整個系統(tǒng)中的核心,也是業(yè)務邏輯最復雜的一部分。使用領域驅動設計思想設計該模塊,可以有效降低系統(tǒng)復雜度,有利于軟件開發(fā)人員快速開發(fā)和維護。
將一個復雜的程序切分成層。開發(fā)每一個層中內聚的設計,讓每個層僅依賴于它底下的那層。遵照標準的架構模式以提供層的低耦合。將領域模型相關的代碼集中到一個層中,把它從用戶界面、應用和基礎設施代碼中分隔開來。
因此,Horus Manager模塊的總體框架基于領域驅動進行設計,分為4層,具體如下。
API層(用戶接口層):本層的主要功能是提供接口使后端與前端進行交互。在實現(xiàn)過程中,要先確認與前端進行交互的各種DTO,用于滿足系統(tǒng)前后端交互數(shù)據(jù)的安全性。其次,使用外觀模式(Facade Pattern)隱藏系統(tǒng)的復雜性,給前端提供一個統(tǒng)一入口,并對外屏蔽內部子系統(tǒng)的調用細節(jié)。
Application層(應用層):本層是很薄的一層,本層的主要功能是是用于協(xié)調各種應用情況。本層主要負責DTO和實體值對象的數(shù)據(jù)轉換,對于簡單的業(yè)務,也可以在本層直接加載實體,執(zhí)行實體行為方法。本層不包含業(yè)務邏輯,注意本層可以包含查詢邏輯,但核心業(yè)務邏輯必須下沉到Domain層。本層不保留業(yè)務對象的狀態(tài),只保有應用任務的進度狀態(tài)。
Domin層(領域層):本層是領域驅動設計思想中最重要的一層,包含關于系統(tǒng)領域的信息。本層是業(yè)務軟件的核心所在,在本層實現(xiàn)核心的業(yè)務邏輯。只有在本層可以保留業(yè)務對象的狀態(tài),對業(yè)務對象和它們狀態(tài)的持久化被委托給了Infrastructure層。
Infrastructure層(基礎設施層):本層主要功能是對Domin模塊進行持久化。本層可以把領域對象序列化到指定的元件中,如數(shù)據(jù)庫、文件或者內存對象,當然也提供從物理元件取出數(shù)據(jù)到領域對象的功能。本層作為其他層的支撐庫存在,提供了層間的通信,實現(xiàn)了對業(yè)務對象的持久化。
Horus Manager模塊最重要的功能就是接收IVS模塊與Trafficam模塊傳來的信息,分析并判斷該用戶是否私接。對此,當然可以使用復雜的業(yè)務邏輯對此進行判斷。但當開發(fā)此功能的軟件開發(fā)人員離職后,其他軟件開發(fā)人員接手此系統(tǒng)時,會發(fā)現(xiàn)此業(yè)務邏輯非常難以理解,需要花費大量時間讀懂這些業(yè)務邏輯。于是需要基于領域驅動設計思想解決該問題,我們發(fā)現(xiàn)判斷一個人是否私接與現(xiàn)實生活中司法系統(tǒng)判斷一個人是否有罪有異曲同工之妙,因此基于現(xiàn)實中的司法系統(tǒng)對解決該問題進行建模,可以使沒有開發(fā)此系統(tǒng)的軟件開發(fā)人員易于理解復雜的業(yè)務邏輯。
現(xiàn)實中的司法系統(tǒng)判斷一個人是否有罪需要經(jīng)過搜集證據(jù)、訴訟、定罪、執(zhí)法4步。因此,基于司法系統(tǒng)對判斷該用戶是否私接進行建模,建立CaseInstance、Prosecution、Conviction、Enforcement這4個主要實體。CaseInstance表示會話,其中保存著會話的私接證據(jù)、身份信息、網(wǎng)絡信息等;Prosecution表示訴訟過程;Conviction表示定罪過程;Enforcement表示執(zhí)法過程。這樣建模將原本復雜的判斷私接過程拆分開來,使相關軟件開發(fā)人員易于理解,因為司法系統(tǒng)本就是現(xiàn)實中存在的東西,就此實現(xiàn)和維護功能將變得非常簡單。4個核心實體的類圖如圖2所示。
圖2 核心功能類圖
Horus Manager模塊的核心功能如下。
對用戶會話進行管理:案件管理、登記和結案。從RADIUS服務器接收RADIUS計費數(shù)據(jù)包以創(chuàng)建和銷毀會話。
獲得私接證據(jù)過程:實施“身份驗證”協(xié)議并處理來自已知客戶端應用程序(IVS)的協(xié)商和通知,監(jiān)控網(wǎng)絡流量并從網(wǎng)絡流量中提取已知數(shù)據(jù)庫的信息(Trafficam)。接受來自IVS/Trafficam的案件調查。
進行訴訟過程:案件調查適用條例。
進行定罪過程:根據(jù)組織/用戶組和配置的策略定罪案例。
進行執(zhí)法過程:執(zhí)行強制(斷開連接、限速或阻止私接賬號使用操作),將判決結果發(fā)送給BAS(高校寬帶運營管理平臺)進行執(zhí)行。
校園防私接系統(tǒng)應用領域驅動設計思想進行設計開發(fā),降低了系統(tǒng)耦合度,使系統(tǒng)易于維護和迭代。領域驅動設計的最大優(yōu)勢是直接將核心業(yè)務邏輯與領域模型結合起來,更好實現(xiàn)高內聚、松耦合,這種優(yōu)勢逐漸使其成為軟件設計的主流思想,特別是面對大型復雜的互聯(lián)網(wǎng)系統(tǒng)。同時現(xiàn)如今的企業(yè)發(fā)展也越來越重視維護和迭代,所以領域驅動設計也會取得越來越廣泛的應用。在進行系統(tǒng)設計時,需要按照需求合理設計模型。在進行分層建設過程中,也需要充分考慮好各種不必要因素,及時調整,選擇合理框架以及開發(fā)系統(tǒng),提高運行效率。