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