陳家豪,劉宇杰,宋暉
(東華大學計算機科學與技術學院,上海 201620)
隨著社會的發展,政府機構產業經濟的管理部門需要對所屬區域內的企業進行管理并提供相應的服務。但是面對轄區內的所有企業,政府難以及時了解產業細分領域的整體情況以及把握企業發展運行的動態情況和經濟運行情況。并且隨著經濟的快速發展,也暴露了政府在產業政策扶持以及企業幫扶等方面的問題。文獻[1]也指出政府在融資、稅收等方面存在資源調配先國企后民企的現象,這樣就使得民企獲得的支持越發顯得薄弱。
隨著時代的發展與信息技術的進步,云計算技術取得了突飛猛進的發展,SaaS(software as a service:軟件即服務)作為云計算中最為成熟、出名的模式,已得到了廣泛的應用。與此同時,SaaS 模式的發展使得傳統的單體架構開發模式已經逐漸無法滿足當前互聯網時代的軟件開發需求,于是微服務架構應運而生。在傳統單體架構開發方式下,應用的開發很簡單,測試也相對簡單直觀,但是單體架構存在很大的局限性,隨著時間的推移,開發、測試、部署和擴展都會變得更加困難。而微服務架構在開發過程中不僅擁有更好的容錯性,其最大的好處就是可以實現大型復雜應用程序的持續交付和部署[2]。
本文針對政府管理部門為企業提供服務過程中存在的問題,基于SaaS 軟件服務模式以及微服務架構設計并實現了產業經濟信息的管理,助力政府借此平臺增強產業結構調整的準確性,促進產業結構的轉型升級[3]。該系統依靠SaaS 的多重租賃的特性[4],完成平臺由單一用戶到多租戶的轉變,并且結合微服務架構服務獨立擴展、獨立部署的優點,靈活的對功能服務進行擴展。
微服務架構是一種面向服務的架構,可將應用程序構建為松耦合、可獨立部署的一組服務,每個服務都是獨立的進程,可以由不同團隊開發維護,實現團隊的自治。通過對當下主流的微服務架構進行對比分析,本文選用Spring Cloud[5]作為系統的微服務架構。Spring Cloud 是若干框架的集合,通過提供一系列開發組件幫助開發者迅速搭建一個分布式的微服務系統,其常用組件包括服務注冊和發現、配置中心、路由網關、控制總線、熔斷器等。
為實現系統在只有一個應用實例的情況下能被多區域政府共同使用,本文采用多租戶技術對其進行改進。多租戶[6]是SaaS 領域的特有產物,是SaaS 服務模式與傳統軟件模式的重要差別。多租戶技術是用于實現在同一環境下多租戶可以共用相同的系統或者程序組件,并仍然可以保證租戶之間的數據隔離性。多租戶數據隔離的方式有以下三種:第一是獨立數據庫,第二是共享數據庫但隔離數據結構,第三是共享數據庫和數據結構。本系統中采用的是第一種方式,在創建租戶時為其創建專屬的數據庫并完成數據庫的初始化,雖然該方式成本最高,但是數據的隔離級別和安全性也是最高的。采用多租戶技術,可以將系統角色分為三種:平臺管理員、租戶系統管理員以及租戶普通管理員。多租戶業務流程如圖1所示。平臺管理員可通過初始化租戶組和權限信息完成租戶的創建,啟用租戶后由該租戶的租戶系統管理員對租用的系統進行管理,租戶系統管理員也可以創建普通管理員用戶。

圖1 多租戶業務流程
本文通過動態切換數據庫的方式來實現SaaS服務模式并保證多租戶之間數據的隔離性,讓每個用戶在使用本系統的時候,只能訪問其所屬租戶的數據庫。動態切換數據庫,其本質是通過切換數據源來實現連接不同數據庫,最常用的做法是在配置文件中配置多個數據源,在固定數目的數據源之間進行切換連接,但本文所使用的方式可以實現在數目不限的數據源之間進行切換,切換過程如圖2所示。具體實現可分為以下3步。

圖2 動態切換數據庫流程
(1)修改配置文件。在配置文件application.yml中配置數據源時,將JDBC URL 中數據庫的IP和名稱等信息使用“%s”占位符代替,用于在連接數據庫時進行動態填充。租戶所對應的數據源信息在創建租戶時就已保存于Redis緩存中。
(2)攔截請求。使用Spring 的AOP 特性來攔截用戶請求,通過獲取用戶請求的域名來判斷對應的租戶,并且對應的租戶編碼保存至ThreadLo?cal線程變量中。
(3)創建并管理數據源。在項目中創建Data?SourceConfig 配置類,通過使用由DataSource 派生的子類DynamicDataSource 實現根據配置參數創建數據源,并完成數據庫的動態連接。同時增加數據庫標識類,從ThreadLocal 變量中獲取租戶編碼,根據此租戶編碼到Redis 數據庫中獲取對應的數據源信息。對于配置文件中使用占位符替換掉的數據,則使用該數據源信息進行一一填充,形成完整的數據源,進而連接數據庫。同時還可將已建立連接的數據源保存在Map 容器中,提供數據源的查詢和刪除功能。并且設置定時任務管理數據源,將當前時間與最近使用時間進行比較,若在一個空閑時間周期內沒有訪問,則將對應的數據庫連接關閉,并將數據源從Map容器中刪除。
將傳統的單體應用轉變為微服務應用,最重要的就是進行服務的拆分。進行服務拆分有兩種方法:第一種是使用領域驅動設計的方法,根據子域進行服務拆分,第二種是根據業務能力進行服務拆分。本文采用第二種方法,根據業務能力來定義服務,同時根據服務屬性將其分為輔助型服務和業務型服務,其中輔助型服務是指基于Spring Cloud框架所提供的用于構建分布式微服務系統的常用組件所實現的服務,業務型服務則是指根據系統功能所劃分的服務。具體服務劃分如下。
輔助型服務主要包含以下4 個服務:①配置管理服務,主要負責對分布式系統的各模塊的配置文件進行統一管理。②監控服務,主要負責監控所有服務的健康狀況,并可對服務中的請求進行鏈路追蹤。③網關服務,主要負責接收外界所有請求,并將其轉發至對應的微服務。④服務注冊與發現服務,主要負責提供服務的注冊與續約功能。
業務型服務包含以下7 個服務:①產業數據匯集服務,負責將政府提供的產業數據與外部采集的企業數據匯聚于一起,通過智能統計、數據分析等方式為政府制定管理措施、開展企業服務提供數據支撐。②企業管理服務,主要負責提供如企業建議、企業活動、企業支持等政府為企業服務提供的功能。③消息發布服務,主要負責為提供政府發布新聞、政策、知識庫等功能,方便企業了解政府的政策法規。④授權與認證服務,負責獲取當前登錄用戶信息并進行用戶身份驗證,同時還對系統資源進行權限管理。⑤組織管理服務,包括租戶管理與用戶管理,主要負責租戶的創建與權限初始化,以及對各租戶下使用該平臺的用戶進行管理。⑥系統管理服務,主要負責對系統用戶組、角色、部門以及權限等信息進行管理。⑦日志服務,負責通過RabbitMQ 接收其他服務所發送的日志信息并對其進行處理。
本系統基于前后端分離開發模式,前端使用Vue 與Element UI 進行開發,后臺則采用Spring Boot 作為單個服務的開發框架,使用Spring Cloud架構進行服務治理。系統采用Eureka 作為服務注冊與發現中心,給客戶端提供一個可用的服務注冊列表,負責完成服務的注冊、續約功能;使用Ribbon 和Feign 實現服務的調用以及負載均衡的功能;使用Spring Cloud Zuul 作為系統的服務網關;使用Spring Cloud Config 進行分布式配置文件的統一管理。除此之外,還使用Spring Security OAuth2保護微服務系統,并同時使用JWT的方式進行身份認證。系統總體架構設計如圖3 所示,自上而下依次分為訪問層、網關層、服務層以及數據層。①訪問層作為系統的使用入口,負責用戶對系統的操作和系統前端界面顯示。②網關層選用Spring Cloud Zuul 組件,負責所有服務的API接口統一聚合,并統一對外暴露。來自客戶端的所有外部請求在進入系統時,都要通過網關層進行處理,由網關將其轉發至對應的服務。③服務層作為系統的核心業務層,負責完成系統的核心功能,各個服務之間通過使用基于同步請求/響應的HTTP REST 機制進行通信,并使用Eureka服務認證與注冊中心對所有服務進行統一管理。④數據層負責對底層數據進行訪問以及持久化操作,所使用的數據庫包括MySQL、Redis 以及Mon?goDB。數據層同時還負責對數據源進行動態管理,通過動態切換數據源的方式使得租戶只能使用自己的數據源連接自己的數據庫,保證數據之間的隔離性。

圖3 系統架構
為使系統后期具有較高的維護和擴展能力,本系統選擇使用容器技術在服務端進行項目部署。容器是一種更現代、更輕量級的部署機制,與虛擬機技術相比所消耗的資源更少。本文選用容器中最有代表性的Docker[7]進行項目部署。使用Docker 技術,不僅可以實現系統的快速交付與部署,而且其兼容性與輕量級特性可以輕而易舉的實現應用的動態管理。
為完成系統上線,采用四臺操作系統為Cen?tOS 的Linux 服務器進行項目部署,并在服務器中安裝好Docker。每臺服務器所肩負的職責各不相同,具體分工如表1所示。

表1 服務器職責分工
Spring Cloud 應用是采用Spring Boot作為單個服務的開發框架,而由于Spring Boot 內置了Tom?cat服務器,因此系統的各個服務模塊都可以將其以jar 包的方式獨立運行。系統部署如圖4 所示。將每個服務打包成鏡像容器,再按照服務器職責分工將服務部署到對應的服務器上。

圖4 系統部署
將服務部署為容器的操作如下:對于系統的每個服務模塊,在本地機器上使用Maven 將其打成jar 包,然后將jar 包上傳到服務器上,通過編寫包含構建鏡像所需指令的Dockerfile文件,使用docker build 命令將其構建為鏡像并保存在鏡像倉庫中,最終根據鏡像文件生成容器并運行服務實例。
為實現政府對其區域內的產業經濟發展提供更好的保障,本文設計實現了產業經濟數據管理系統,助力政府更好的為企業提供服務。根據業務能力對系統進行服務劃分,拆分出多個可執行微服務,并通過使用Spring Cloud作為系統的微服務框架,構建了具有較高擴展性的軟件系統。同時基于SaaS 服務模型完成系統的多租戶功能,實現對多地政府提供系統租用服務。在以后還可以推出企業畫像、資質校驗等服務,進一步幫助政府了解企業,并利用微服務架構以及Docker 的特性實現服務的快速上線。