韓 鈺,丁 悅,石明翔,郭昕銳,郭子巖
(北京城市學(xué)院信息學(xué)部,北京 100080)
當(dāng)前,微服務(wù)架構(gòu)[1]已成為軟件開發(fā)領(lǐng)域的熱點(diǎn)之一,特別是在分布式環(huán)境下,微服務(wù)已經(jīng)成為首選架構(gòu)。許多互聯(lián)網(wǎng)公司都在廣泛地應(yīng)用微服務(wù)架構(gòu),同時(shí)許多傳統(tǒng)企業(yè)也在利用微服務(wù)和容器進(jìn)行互聯(lián)網(wǎng)技術(shù)轉(zhuǎn)型。在這個(gè)過程中,Dubbo 和Spring Cloud 等傳統(tǒng)微服務(wù)框架成為國(guó)內(nèi)最受歡迎的開發(fā)框架之一。然而,軟件開發(fā)沒有單一的解決方案,基于這些傳統(tǒng)框架構(gòu)建的應(yīng)用系統(tǒng)在享受開發(fā)的同時(shí)也面臨一些痛點(diǎn),因此需要進(jìn)一步研究和探索新的方案來解決這些問題。
針對(duì)上述問題,國(guó)內(nèi)做了很多的研究,廖艷艷[2]、彭永勇等[3]研究分析了Istio 在企業(yè)級(jí)微服務(wù)管理方面的相關(guān)問題。論述中提到,采用Istio 服務(wù)網(wǎng)格之后企業(yè)級(jí)微服務(wù)系統(tǒng)可以實(shí)現(xiàn)獨(dú)立運(yùn)行、動(dòng)態(tài)擴(kuò)容、鏈路追蹤等功能,相較于面向服務(wù)的架構(gòu)和SpringCloud 等框架,Istio能夠幫助企業(yè)有效降低開發(fā)和運(yùn)維成本,提高企業(yè)的效率。因此,本文以網(wǎng)絡(luò)輿情分析系統(tǒng)為例,嘗 試 使用DDD 和ServiceMesh[4]等 技術(shù),實(shí)現(xiàn)基于領(lǐng)域驅(qū)動(dòng)與服務(wù)網(wǎng)格的網(wǎng)絡(luò)輿情分析系統(tǒng),使用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)對(duì)網(wǎng)絡(luò)輿情分析系統(tǒng)進(jìn)行拆分,使其更加易于迭代和擴(kuò)展,滿足開閉原則。在此基礎(chǔ)上使用Kuberbetes和Istio等技術(shù)把系統(tǒng)整合進(jìn)服務(wù)網(wǎng)格(Service Mesh)中并進(jìn)行服務(wù)治理,對(duì)系統(tǒng)實(shí)現(xiàn)負(fù)載均衡、熔斷、限流、可插拔的服務(wù)安全、服務(wù)運(yùn)行可觀察性等治理能力。
本文所治理和監(jiān)控的網(wǎng)絡(luò)輿情分析系統(tǒng)的主要功能是為相關(guān)部門提供智能化決策支持,提升應(yīng)對(duì)處理輿情的速度,以此來引導(dǎo)輿論方向,快速化解危機(jī)輿論。此項(xiàng)目是在原單體架構(gòu)的基礎(chǔ)上,設(shè)計(jì)出態(tài)勢(shì)感知、輿情分析、智能決策和輿情預(yù)警等功能。主要用于多源網(wǎng)絡(luò)內(nèi)容的篩選與檢測(cè)、影響力評(píng)價(jià)模型的建立與分析、系統(tǒng)核心業(yè)務(wù)的實(shí)現(xiàn)。系統(tǒng)功能主要包括:自然語言處理、多維度查詢、智能分析及決策支持、系統(tǒng)管理等模塊。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(domain driven design,DDD)的概念誕生于2003 年,由Evans[5]提出。它是一種設(shè)計(jì)思想方法論,用來指導(dǎo)將復(fù)雜問題進(jìn)行拆分、找出各子系統(tǒng)間的關(guān)聯(lián),來解決復(fù)雜系統(tǒng)開發(fā)中遇到的問題。在領(lǐng)域模型創(chuàng)建后,DDD 得到需求的第一步是通過領(lǐng)域模型的變化來指導(dǎo)數(shù)據(jù)和業(yè)務(wù)的變化,而不是將其分割,對(duì)數(shù)據(jù)和業(yè)務(wù)的變化分別考量,這樣會(huì)造成需求的前后分離。DDD 首先考慮的是業(yè)務(wù)模型,而不是數(shù)據(jù)。
整體服務(wù)拆分共分為三步,首先是梳理需求劃分子域;其次是創(chuàng)建領(lǐng)域模型;最后是對(duì)限界上下文中的實(shí)體、值對(duì)象、聚合根等信息進(jìn)行挖掘。
對(duì)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)而言,在分析較為復(fù)雜的問題域時(shí),可以采用“分而治之”的思想[6],將復(fù)雜的功能需求拆分成子域。根據(jù)賈子甲[7]在先啟階段對(duì)微服務(wù)系統(tǒng)拆分方法的研究對(duì)本系統(tǒng)進(jìn)行拆分得到的限界上下文[8](本系統(tǒng)中子域約等于限界上下文)為:數(shù)據(jù)中心模塊、管理中心模塊、消息中心模塊、智庫(kù)中心模塊,輿情中心模塊,如圖1所示。
圖1 基于DDD劃分的子域
通過領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法繪制領(lǐng)域模型,從而確定業(yè)務(wù)和應(yīng)用邊界,保證業(yè)務(wù)模型與代碼模型的一致性。如果存在一個(gè)類被多個(gè)程序包所依賴,甚至成為“上帝類”時(shí),開發(fā)工作就必須協(xié)調(diào)開發(fā)的工序,而這一協(xié)調(diào)過程也將是反復(fù)和低效的。理想情況下,我們希望一個(gè)變更只影響一個(gè)敏捷團(tuán)隊(duì)或者一個(gè)服務(wù)[9]。通過DDD 的方法對(duì)網(wǎng)絡(luò)輿情分析系統(tǒng)進(jìn)行設(shè)計(jì)和構(gòu)建,發(fā)掘重要的業(yè)務(wù)領(lǐng)域概念,建立業(yè)務(wù)領(lǐng)域概念之間的關(guān)系。
本系統(tǒng)的領(lǐng)域模型劃分如圖2所示。表示層負(fù)責(zé)與用戶交互,向用戶呈現(xiàn)數(shù)據(jù),并處理用戶輸入的請(qǐng)求;應(yīng)用層負(fù)責(zé)協(xié)調(diào)領(lǐng)域?qū)拥母鱾€(gè)對(duì)象來完成用戶請(qǐng)求,同時(shí)處理來自表示層的請(qǐng)求和領(lǐng)域?qū)拥捻憫?yīng);領(lǐng)域?qū)迂?fù)責(zé)存放業(yè)務(wù)中總結(jié)的聚合根、實(shí)體、對(duì)象和業(yè)務(wù)的處理邏輯,同時(shí)對(duì)業(yè)務(wù)規(guī)則進(jìn)行驗(yàn)證和實(shí)施;對(duì)限界上下文中相關(guān)的詳細(xì)信息會(huì)在后文分開說明;基礎(chǔ)設(shè)施層負(fù)責(zé)提供基礎(chǔ)設(shè)施支持,通過防腐層進(jìn)行數(shù)據(jù)庫(kù)訪問、網(wǎng)絡(luò)連接等,以便達(dá)到保護(hù)領(lǐng)域?qū)又袠I(yè)務(wù)的目的。
圖2 網(wǎng)絡(luò)輿情分析系統(tǒng)的領(lǐng)域模型
以數(shù)據(jù)中心為例進(jìn)行主要元素分析,其限界上下文的分析結(jié)果見表1。
表1 數(shù)據(jù)中心關(guān)鍵元素分析表
輿情是一個(gè)重要的實(shí)體,包含了輿情標(biāo)簽、話題關(guān)注度、輿情所屬平臺(tái)和輿情來源的網(wǎng)民等值對(duì)象。時(shí)間段是一個(gè)實(shí)體,用于表示輿情數(shù)量趨勢(shì)變化和近三年追蹤輿情數(shù)量趨勢(shì)變化等趨勢(shì)分析的相關(guān)信息。用戶操作是一個(gè)實(shí)體,用于記錄用戶對(duì)輿情系統(tǒng)的使用情況,例如添加、修改、刪除等操作。
輿情狀態(tài)分析功能中,聚合根是“輿情狀態(tài)分析”,它由輿情實(shí)體和狀態(tài)值對(duì)象組成。輿情實(shí)體代表一條具體的輿情信息,狀態(tài)值對(duì)象代表輿情的狀態(tài),其中的狀態(tài)有:已處理、已解決、已退回、未處理、線上回應(yīng)等。每條輿情信息都對(duì)應(yīng)著一個(gè)狀態(tài),輿情實(shí)體的生命周期由聚合根控制。
通過領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)拆分的系統(tǒng)中存在多個(gè)服務(wù),如果單獨(dú)進(jìn)行部署就會(huì)存在配置管理困難、版本迭代時(shí)操作復(fù)雜、服務(wù)間調(diào)用情況無法監(jiān)控等問題,因此要進(jìn)行服務(wù)網(wǎng)格[10]治理。
服務(wù)網(wǎng)格是一種用于管理和控制分布式系統(tǒng)中的服務(wù)間通信的基礎(chǔ)設(shè)施。它通過將網(wǎng)絡(luò)基礎(chǔ)設(shè)施從應(yīng)用程序中分離出來,為應(yīng)用程序提供透明的服務(wù)間通信,并提供諸如路由、負(fù)載均衡、故障恢復(fù)、監(jiān)視等功能。服務(wù)網(wǎng)格通常由一組網(wǎng)絡(luò)代理組成,這組代理通常是以Sidecar 形式實(shí)現(xiàn),它與應(yīng)用程序運(yùn)行在同一容器內(nèi),通過共享網(wǎng)絡(luò)命名空間和卷等方式與服務(wù)集成在一起攔截服務(wù)請(qǐng)求和響應(yīng)。通過這種方式,可以在不修改應(yīng)用程序代碼的情況下提供額外的功能和可靠性保障。
本系統(tǒng)架構(gòu)采用分布式服務(wù)網(wǎng)格高可用的架構(gòu)方式,使用DDD 的方法論進(jìn)行拆分,被拆分成如圖2所示的智庫(kù)中心、管理中心、消息中心等五個(gè)服務(wù)子集。每個(gè)服務(wù)子集通過docker進(jìn)行容器化后以pod 形式運(yùn)行并管理,使用Kubernetes 實(shí)現(xiàn)容器編排、動(dòng)態(tài)擴(kuò)展等功能,使用Istio 管理流量規(guī)則和策略來控制服務(wù)間通信,進(jìn)而實(shí)現(xiàn)服務(wù)治理。
服務(wù)中每一個(gè)pod 中都會(huì)有一個(gè)以Sidecar模式存在的Envoy,Envoy 從Istio 中心獲取各服務(wù)的地址并把請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)服務(wù)的Envoy 中,再由其轉(zhuǎn)到服務(wù)中,通過Envoy來進(jìn)行各服務(wù)注冊(cè)和發(fā)現(xiàn)服務(wù)之間的網(wǎng)絡(luò)代理。如圖3所示。
圖3 服務(wù)網(wǎng)格架構(gòu)圖
各責(zé)任單位發(fā)出消息請(qǐng)求到Ingress 進(jìn)行統(tǒng)一接入和負(fù)載均衡,之后轉(zhuǎn)發(fā)到擁有Nginx 的pod 中進(jìn)行靜態(tài)資源的請(qǐng)求。用ActiveMQ 進(jìn)行異步通信實(shí)現(xiàn)削峰處理,讓通信具有良好的峰值處理能力和送達(dá)保障,其中用戶管理服務(wù)、輿情信息管理服務(wù)、輿情監(jiān)控服務(wù)、輿情反饋管理服務(wù)采用邊車代理進(jìn)行通信,通過Envoy進(jìn)網(wǎng)絡(luò)代理;服務(wù)網(wǎng)格控制中心實(shí)現(xiàn)服務(wù)編排、流量控制規(guī)則管理、服務(wù)發(fā)現(xiàn)、負(fù)載均衡規(guī)則管理等機(jī)制,實(shí)現(xiàn)系統(tǒng)的動(dòng)態(tài)擴(kuò)容和高可用。
為了驗(yàn)證系統(tǒng)的執(zhí)行效率,本文環(huán)境采用三臺(tái)阿里云服務(wù)器,一個(gè)為主節(jié)點(diǎn)Master,兩個(gè)子節(jié)點(diǎn)node1、node2,云服務(wù)器硬件配置為一臺(tái)4核和8 GB內(nèi)存的云服務(wù)器、兩臺(tái)2核和2 GB內(nèi)存的云服務(wù)器,使用的操作系統(tǒng)為Centos8.2 64 位。在實(shí)驗(yàn)中,被網(wǎng)格化和未被網(wǎng)格化的網(wǎng)絡(luò)輿情系統(tǒng)依次做了兩組實(shí)驗(yàn),其中吞吐量的差異如圖4所示。
圖4 不同架構(gòu)下執(zhí)行效率對(duì)比圖
并發(fā)數(shù)大于200時(shí),未經(jīng)過領(lǐng)域驅(qū)動(dòng)拆分和經(jīng)過領(lǐng)域驅(qū)動(dòng)拆分的吞吐量仍相對(duì)同步遞增,但未經(jīng)過領(lǐng)域驅(qū)動(dòng)拆分的程序,吞吐量在達(dá)到一定并發(fā)量后便停止上升,反而有下降的趨勢(shì),其原因判斷為未經(jīng)過服務(wù)治理的程序達(dá)到了硬件性能的上限,其緩存和負(fù)載均衡也不能進(jìn)一步提升程序的性能。領(lǐng)域驅(qū)動(dòng)拆分后,因?yàn)橛袆?dòng)態(tài)擴(kuò)容負(fù)載均衡和降級(jí)熔斷方法的影響,使得吞吐量相對(duì)于未經(jīng)領(lǐng)域驅(qū)動(dòng)拆分的可以進(jìn)一步增長(zhǎng)。
并發(fā)數(shù)達(dá)到本次最大時(shí),很明顯可以看到,未經(jīng)領(lǐng)域驅(qū)動(dòng)拆分和經(jīng)過領(lǐng)域驅(qū)動(dòng)拆分的吞吐量差距顯著,此時(shí)可以證明,本系統(tǒng)中使用的領(lǐng)域驅(qū)動(dòng)拆分有著明顯的成效。
本文通過領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)從子域劃分到主要元素分析,對(duì)網(wǎng)絡(luò)輿情系統(tǒng)進(jìn)行服務(wù)子集劃分,從而更好地應(yīng)對(duì)復(fù)雜業(yè)務(wù),使技術(shù)實(shí)現(xiàn)與業(yè)務(wù)更好地分離,使外部調(diào)用與內(nèi)部系統(tǒng)相互隔離。本文研究了有關(guān)服務(wù)網(wǎng)格的理論與Istio 的應(yīng)用,并使用kuberbetes 與Istio 對(duì)經(jīng)過DDD 拆分后的系統(tǒng)進(jìn)行網(wǎng)格化,降低了運(yùn)營(yíng)維護(hù)成本,提高了微服務(wù)的可擴(kuò)展性和可用性。通過實(shí)驗(yàn)結(jié)果的對(duì)比分析證明,在經(jīng)過領(lǐng)域驅(qū)動(dòng)拆分和服務(wù)網(wǎng)格治理后系統(tǒng)有著良好的性能。