李浩涌
(昆明理工大學(xué) 信息工程與自動(dòng)化學(xué)院,云南 昆明 650500)
關(guān)鍵字:太陽活動(dòng)指數(shù);預(yù)報(bào)系統(tǒng);Spring Boot;微服務(wù)
太陽活動(dòng)是指發(fā)生在太陽大氣層中的各種太陽活動(dòng)現(xiàn)象,其具體表現(xiàn)形式包括太陽黑子浮現(xiàn)和太陽耀斑爆發(fā)等現(xiàn)象。太陽活動(dòng)發(fā)生時(shí),會(huì)影響地球的通信設(shè)備以及基礎(chǔ)設(shè)施,同時(shí)還會(huì)增強(qiáng)空間環(huán)境中的太陽輻射,從而影響人類的航海和天氣等國防和國民經(jīng)濟(jì)的眾多領(lǐng)域[1]。太陽活動(dòng)指數(shù)是對(duì)太陽活動(dòng)的一種量化描述,常用的太陽活動(dòng)指數(shù)包括太陽黑子數(shù)和F10.7射電流量等。太陽活動(dòng)指數(shù)的預(yù)報(bào)是一種重要的預(yù)報(bào)類型,同時(shí)也是一種復(fù)雜的綜合系統(tǒng)。建立一個(gè)性能穩(wěn)定、可擴(kuò)展的預(yù)報(bào)系統(tǒng),對(duì)于太陽活動(dòng)的預(yù)報(bào)尤為重要。
目前對(duì)于太陽活動(dòng)的預(yù)報(bào)系統(tǒng)大多采用傳統(tǒng)的單體服務(wù)[2-3]。傳統(tǒng)的單體架構(gòu)可以在小型系統(tǒng)中運(yùn)行良好,但是系統(tǒng)的復(fù)雜度會(huì)隨著業(yè)務(wù)功能的增多而急劇上升。業(yè)務(wù)代碼之間的耦合度會(huì)增多,從而對(duì)系統(tǒng)的穩(wěn)定性造成影響。另外,系統(tǒng)無法靈活地對(duì)業(yè)務(wù)功能進(jìn)行擴(kuò)展。針對(duì)這一問題,提出使用微服務(wù)架構(gòu)的思想來構(gòu)建太陽活動(dòng)指數(shù)預(yù)報(bào)系統(tǒng)。從預(yù)報(bào)系統(tǒng)的實(shí)際業(yè)務(wù)功能出發(fā),將預(yù)報(bào)系統(tǒng)中不同的功能劃分為不同的服務(wù),服務(wù)之間互不影響,且各個(gè)微服務(wù)可以同步開發(fā)[4],提高了系統(tǒng)的可用性與可擴(kuò)展性。
微服務(wù)是一種基于面向服務(wù)架構(gòu)(Service-Oriented Architecture,SOA)的軟件開發(fā)思想與技術(shù)。傳統(tǒng)的單體軟件架構(gòu)習(xí)慣將所有的功能集合在一個(gè)系統(tǒng)中,之后將其打包為jar包或者war包部署在服務(wù)器中。系統(tǒng)中各功能的耦合度較高,而且不方便測試與部署。在系統(tǒng)出現(xiàn)故障時(shí),單體架構(gòu)的系統(tǒng)需要將整個(gè)項(xiàng)目進(jìn)行調(diào)試分析后重新部署。微服務(wù)架構(gòu)將不同的業(yè)務(wù)功能分解為不同的服務(wù),每個(gè)服務(wù)獨(dú)立運(yùn)行,服務(wù)之間使用遠(yuǎn)程過程調(diào)用(Remote Procedure Call,RPC)進(jìn)行相互調(diào)用。相對(duì)于傳統(tǒng)的單體架構(gòu),微服務(wù)架構(gòu)具有以下優(yōu)點(diǎn)[5]。
(1)降低了系統(tǒng)耦合性與復(fù)雜性。微服務(wù)通過對(duì)單體架構(gòu)系統(tǒng)的細(xì)粒度拆分,降低了服務(wù)之間的耦合性;每個(gè)服務(wù)只關(guān)注特定業(yè)務(wù)的功能,降低了系統(tǒng)的復(fù)雜性。
(2)靈活性更高。不同的服務(wù)可以使用不同的開發(fā)語言來實(shí)現(xiàn),可以結(jié)合具體的業(yè)務(wù)功能來選擇最優(yōu)的技術(shù)路線。
(3)獨(dú)立部署。在微服務(wù)架構(gòu)中,每個(gè)服務(wù)都是一個(gè)獨(dú)立的系統(tǒng),可以獨(dú)立部署在服務(wù)器中。當(dāng)某個(gè)服務(wù)需要迭代更新時(shí),只需對(duì)當(dāng)前服務(wù)進(jìn)行重新部署即可。
(4)容錯(cuò)性更強(qiáng)。每個(gè)服務(wù)可以部署多個(gè)備用服務(wù),當(dāng)一個(gè)服務(wù)出現(xiàn)故障時(shí),可以利用注冊中心的健康監(jiān)控機(jī)制將其下線,將服務(wù)請求發(fā)送到備用服務(wù)中。
微服務(wù)架構(gòu)包含Spring Boot、Nacos及Spring Cloud Gateway這3個(gè)主要組件。
(1)Spring Boot。Spring Boot是Spring Cloud微服務(wù)架構(gòu)體系的基石。Spring Boot繼承了Spring框架的控制反轉(zhuǎn)(Inversion of Control,IoC)與面向切面編程(Aspect Oriented Programming,AOP)的思想,同時(shí)提出“約定優(yōu)于配置”的思想,優(yōu)化了Spring應(yīng)用復(fù)雜的配置。
(2)Nacos。在微服務(wù)系統(tǒng)中,一個(gè)服務(wù)會(huì)被拆分為多個(gè)微服務(wù)。服務(wù)可以分為服務(wù)消費(fèi)者和服務(wù)提供者,當(dāng)服務(wù)消費(fèi)者請求服務(wù)提供者的功能時(shí),為了防止服務(wù)消費(fèi)者將請求發(fā)送到出現(xiàn)故障的消費(fèi)提供者節(jié)點(diǎn),需要服務(wù)注冊中心來判斷節(jié)點(diǎn)是否正常。Alibaba Nacos可以解決此類問題。Nacos可以統(tǒng)一管理系統(tǒng)的服務(wù)消費(fèi)者與提供者,對(duì)服務(wù)進(jìn)行統(tǒng)一配置管理,同時(shí)實(shí)時(shí)檢查服務(wù)的健康情況,阻止服務(wù)消費(fèi)者向出現(xiàn)故障的節(jié)點(diǎn)發(fā)送請求。
(3)Spring Cloud Gateway。在服務(wù)進(jìn)行請求操作時(shí),存在權(quán)限以及請求協(xié)議的區(qū)別。不同的請求擁有不同的權(quán)限,在每次的請求調(diào)用中,服務(wù)提供者都需要對(duì)該請求進(jìn)行判斷,增加了通信的成本。為了解決這一問題,采用Spring Cloud Gateway對(duì)請求進(jìn)行統(tǒng)一的認(rèn)證鑒權(quán)。
太陽活動(dòng)指數(shù)預(yù)報(bào)系統(tǒng)功能需求包括用戶管理模塊、可視化模塊、太陽活動(dòng)預(yù)報(bào)模塊、數(shù)據(jù)預(yù)處理模塊以及模型管理模塊。每個(gè)功能模塊在系統(tǒng)中作為一個(gè)單獨(dú)的微服務(wù)應(yīng)用進(jìn)行開發(fā)設(shè)計(jì)。系統(tǒng)功能模塊如圖1所示。
圖1 系統(tǒng)功能模塊圖
用戶管理模塊包括用戶管理、角色管理以及菜單管理等功能,可以為不同的用戶分配不同的角色,不同角色擁有不同的菜單權(quán)限。可視化模塊支持對(duì)歷史數(shù)據(jù)進(jìn)行查詢,包括對(duì)太陽黑子、耀斑指數(shù)以及F10.7射電流量等太陽活動(dòng)指數(shù)的歷史數(shù)據(jù)查詢,同時(shí)支持根據(jù)不同的時(shí)間查詢不同的太陽活動(dòng)指數(shù),并基于Echarts框架將其可視化。預(yù)報(bào)模塊是系統(tǒng)的核心功能,用戶在界面選擇要顯示的太陽活動(dòng)指數(shù)預(yù)報(bào)值后,系統(tǒng)通過調(diào)用數(shù)據(jù)庫保存好的預(yù)測模型,在界面中顯示對(duì)太陽黑子和耀斑指數(shù)等太陽活動(dòng)指數(shù)的預(yù)報(bào)值。數(shù)據(jù)預(yù)處理模塊可以對(duì)太陽黑子等序列數(shù)據(jù)進(jìn)行平滑和去噪等預(yù)處理操作。模型管理模塊的主要功能是負(fù)責(zé)管理系統(tǒng)的預(yù)報(bào)模型。預(yù)報(bào)模型是指經(jīng)過神經(jīng)網(wǎng)絡(luò)訓(xùn)練得到的后綴為h5的模型文件。當(dāng)預(yù)報(bào)模型是傳統(tǒng)的差分整合移動(dòng)平均自回歸模型(Autoregressive Integrated Moving Average model,ARIMA)等模型時(shí),則使用Java中的Runtime類來調(diào)用python接口,得到預(yù)測值后將其保存到MySQL數(shù)據(jù)庫。系統(tǒng)管理員可以在模型管理模塊更換不同的預(yù)測模型。
本文提出的太陽活動(dòng)預(yù)報(bào)系統(tǒng)設(shè)計(jì)架構(gòu)如圖2所示。系統(tǒng)依次分為訪問層、展示層、網(wǎng)關(guān)層、微服務(wù)層以及持久層。預(yù)報(bào)系統(tǒng)主體框架采用Java語言開發(fā);預(yù)報(bào)模型的構(gòu)建則使用python語言編寫,通過前臺(tái)界面顯示;選擇MySQL作為系統(tǒng)數(shù)據(jù)庫,IDEA作為開發(fā)編輯器;選用Nacos作為系統(tǒng)的注冊中心,Spring Cloud Gateway作為系統(tǒng)的網(wǎng)關(guān)服務(wù)。
圖2 系統(tǒng)架構(gòu)圖
訪問層代表系統(tǒng)所支持的訪問設(shè)備,包括個(gè)人電腦、移動(dòng)設(shè)備以及其他終端設(shè)備。展示層負(fù)責(zé)系統(tǒng)與用戶之間的交互。本系統(tǒng)使用網(wǎng)頁界面進(jìn)行系統(tǒng)展示,使用Bootstrap框架對(duì)頁面進(jìn)行優(yōu)化,利用Echarts開源庫對(duì)系統(tǒng)中的圖表進(jìn)行前端渲染展現(xiàn),展示層與后臺(tái)交互使用JQuery和Ajax技術(shù)。網(wǎng)關(guān)層選用Spring Cloud Gateway框架,負(fù)責(zé)對(duì)系統(tǒng)的請求進(jìn)行統(tǒng)一的權(quán)限校驗(yàn)。微服務(wù)層是系統(tǒng)的業(yè)務(wù)功能層,根據(jù)系統(tǒng)的業(yè)務(wù)功能將其拆分為不同的微服務(wù),服務(wù)之間通過RESTful風(fēng)格的請求來進(jìn)行相互調(diào)用。使用Nacos注冊中心對(duì)系統(tǒng)中所有的微服務(wù)進(jìn)行統(tǒng)一配置,統(tǒng)一管理服務(wù)之間的相互訪問請求。持久層代表對(duì)數(shù)據(jù)的持久化,具體包括使用MySQL數(shù)據(jù)庫對(duì)系統(tǒng)用戶的相關(guān)信息、太陽活動(dòng)指數(shù)數(shù)據(jù)以及系統(tǒng)預(yù)報(bào)模型等進(jìn)行存儲(chǔ)。采用redis數(shù)據(jù)庫作為系統(tǒng)的緩存數(shù)據(jù)庫,提高系統(tǒng)的訪問速度。同時(shí),系統(tǒng)支持將太陽活動(dòng)指數(shù)數(shù)據(jù)保存為csv格式,方便用戶下載使用。
本系統(tǒng)的整體框架選用Spring Cloud微服務(wù)架構(gòu)體系,其中,注冊中心選用Nacos,網(wǎng)關(guān)選用Spring Cloud Gateway。預(yù)測模型使用python 3.0進(jìn)行訓(xùn)練,前臺(tái)顯示界面選用Bootstrap框架優(yōu)化,使用Echarts框架對(duì)數(shù)據(jù)進(jìn)行可視化展示。數(shù)據(jù)庫存儲(chǔ)使用MySQL數(shù)據(jù)庫,緩存使用redis數(shù)據(jù)庫。系統(tǒng)整體軟硬件如表1所示。
表1 系統(tǒng)環(huán)境清單
選用Nacos注冊中心作為預(yù)報(bào)系統(tǒng)的注冊中心,將不同的預(yù)測服務(wù)注冊到同一個(gè)服務(wù)中心。具體實(shí)現(xiàn)如圖3所示。其中,forecast-history代表數(shù)據(jù)可視化服務(wù),forecast-user代表用戶管理服務(wù),forecast-prediction代表太陽活動(dòng)預(yù)報(bào)服務(wù),forecsatpretreatment代表數(shù)據(jù)預(yù)處理服務(wù),forecast-model代表預(yù)報(bào)模型管理服務(wù)。通過Nacos服務(wù)臺(tái)中的實(shí)例數(shù)與健康實(shí)例數(shù),可以實(shí)時(shí)監(jiān)測服務(wù)是否健康。
圖3 Nacos注冊中心
網(wǎng)關(guān)選用Spring Cloud Gateway框架實(shí)現(xiàn)。具體實(shí)現(xiàn)需要在服務(wù)項(xiàng)目的pom.xml文件中添加對(duì)Spring Cloud Gateway的依賴項(xiàng),依賴代碼如下所示:
將Spring Cloud Gateway依賴加入到項(xiàng)目中后,需要在項(xiàng)目的配置文件中對(duì)Gateway的網(wǎng)關(guān)路由規(guī)則進(jìn)行配置。配置文件規(guī)范遵循yml語法規(guī)范,具體配置規(guī)則如圖4所示。
圖4 Gateway配置文件
系統(tǒng)界面左側(cè)為預(yù)報(bào)系統(tǒng)的菜單欄,右側(cè)區(qū)域?yàn)橄到y(tǒng)頁面區(qū)域。注冊用戶登錄系統(tǒng)后,系統(tǒng)根據(jù)用戶角色所擁有的權(quán)限來展示不同的菜單。歷史數(shù)據(jù)可視化界面如圖5所示,用戶選擇展示時(shí)間和太陽活動(dòng)指數(shù)類型后,系統(tǒng)基于Echarts框架將數(shù)據(jù)庫中的太陽活動(dòng)指數(shù)以折線圖的形式動(dòng)態(tài)顯示到頁面中。圖6為預(yù)報(bào)系統(tǒng)的模型管理界面,在這個(gè)界面可以增加和刪除預(yù)測模型、選擇啟用的預(yù)測模型。圖7為系統(tǒng)預(yù)報(bào)界面,用戶需要首先選擇查看的預(yù)報(bào)類型,選擇完預(yù)報(bào)的太陽活動(dòng)指數(shù)后,系統(tǒng)可以根據(jù)訓(xùn)練好的模型,對(duì)未來一段時(shí)間的太陽活動(dòng)指數(shù)進(jìn)行預(yù)報(bào)并顯示在頁面中,同時(shí)標(biāo)記出預(yù)報(bào)的最大值和最小值。
圖5 歷史數(shù)據(jù)可視化界面
圖6 模型管理界面
圖7 系統(tǒng)預(yù)報(bào)界面
太陽活動(dòng)的預(yù)測是一種復(fù)雜的業(yè)務(wù)功能。本文針對(duì)傳統(tǒng)單體架構(gòu)的太陽活動(dòng)預(yù)報(bào)系統(tǒng)的不足,提出了一種基于微服務(wù)的太陽活動(dòng)指數(shù)預(yù)報(bào)系統(tǒng)。利用微服務(wù)的思想,將系統(tǒng)的各個(gè)功能分成不同的服務(wù)。各服務(wù)之間耦合度低,從而降低了預(yù)報(bào)系統(tǒng)的復(fù)雜性,提高了系統(tǒng)的穩(wěn)定性與靈活性,方便后續(xù)對(duì)系統(tǒng)功能進(jìn)行擴(kuò)展和升級(jí)改進(jìn)。后續(xù)考慮支持對(duì)太陽活動(dòng)圖像的處理、預(yù)報(bào)以及使用爬蟲技術(shù)來獲取最新的太陽活動(dòng)指數(shù)數(shù)據(jù)并加入到數(shù)據(jù)庫中,提高系統(tǒng)的自動(dòng)化程度。