陳玉貴,羅紅梅,郭海峰,朱國(guó)強(qiáng),唐 群
1.湖南省氣象服務(wù)中心,湖南長(zhǎng)沙 410118;2.氣象防災(zāi)減災(zāi)湖南省重點(diǎn)實(shí)驗(yàn)室,湖南長(zhǎng)沙 410118
湖南是氣象災(zāi)害頻發(fā)、重發(fā)的省份,汛期災(zāi)害性天氣頻發(fā),如何防汛救災(zāi)、減少人員傷亡備受關(guān)注,氣象預(yù)報(bào)預(yù)警是防御和減輕氣象及次生災(zāi)害的第一道防線[1]。2016年11月,湖南省級(jí)突發(fā)預(yù)警信息發(fā)布平臺(tái)建成,平臺(tái)已實(shí)現(xiàn)13種發(fā)布渠道,包括手機(jī)短信、聲訊、大喇叭、顯示屏、網(wǎng)站、電視廣播、微博微信、北斗衛(wèi)星等可傳播預(yù)警信息,但手機(jī)短信、聲訊等傳播渠道是基于群組向防汛責(zé)任人發(fā)布的[2]。近年來(lái),習(xí)近平總書記多次強(qiáng)調(diào)要加強(qiáng)預(yù)警體系建設(shè),提出“預(yù)警發(fā)布要精準(zhǔn)”,“預(yù)警信息發(fā)布要到村到戶到人”,2021年湖南建設(shè)了全省統(tǒng)一應(yīng)用的湖南省應(yīng)急預(yù)警信息精準(zhǔn)靶向發(fā)布系統(tǒng),通過(guò)與移動(dòng)、聯(lián)通、電信三大運(yùn)營(yíng)商打通精準(zhǔn)靶向發(fā)布接口,實(shí)現(xiàn)了基于電子圍欄技術(shù),確保預(yù)警信息精確發(fā)送到圈定區(qū)域內(nèi)社會(huì)公眾的每個(gè)手機(jī)號(hào)碼,讓省、市、縣、鄉(xiāng)鎮(zhèn)(街道)、村(社區(qū))各級(jí)防汛責(zé)任人針對(duì)性地采取防御措施,贏得寶貴的轉(zhuǎn)移避險(xiǎn)時(shí)間,保障人民群眾生命財(cái)產(chǎn)安全,為決策部門應(yīng)急聯(lián)動(dòng)提供支撐[3]。
2021年湖南省應(yīng)急預(yù)警信息精準(zhǔn)靶向發(fā)布系統(tǒng),實(shí)現(xiàn)市州氣象局、省級(jí)突發(fā)預(yù)警信息發(fā)布責(zé)任單位靈活、快速接入,且提供給第三方系統(tǒng)平臺(tái)外部接口能力服務(wù)。隨著精準(zhǔn)靶向發(fā)布系統(tǒng)對(duì)接部門的增加,原有單服務(wù)器架構(gòu)已不足以滿足業(yè)務(wù)需求,使用微服務(wù)架構(gòu),可以分區(qū)域部署多個(gè)數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)進(jìn)行拆分,顯著降低服務(wù)器的壓力;采用微服務(wù)架構(gòu),構(gòu)建獨(dú)立部署、水平擴(kuò)展、獨(dú)立訪問(wèn)的服務(wù)單元,以提高整個(gè)系統(tǒng)訪問(wèn)的時(shí)效性和并發(fā)性[4]。
系統(tǒng)總體架構(gòu)采用微服務(wù)架構(gòu)設(shè)計(jì),主要分為業(yè)務(wù)前臺(tái)、業(yè)務(wù)中臺(tái)、技術(shù)中臺(tái)(圖1)。業(yè)務(wù)前臺(tái)主要為客戶端,展示各個(gè)功能模塊和對(duì)外接口能力的輸出。業(yè)務(wù)中臺(tái)主要是服務(wù)端的內(nèi)部服務(wù),支撐前端功能需求,負(fù)責(zé)業(yè)務(wù)邏輯處理、權(quán)限管理、對(duì)接外部接口能力等。技術(shù)中臺(tái)是服務(wù)端核心支撐功能點(diǎn),支撐業(yè)務(wù)中臺(tái)的相關(guān)業(yè)務(wù),主要為數(shù)據(jù)庫(kù)、緩存、網(wǎng)絡(luò)、監(jiān)控、安全,資源調(diào)度等服務(wù)端支撐體系。

圖1 湖南省應(yīng)急預(yù)警精準(zhǔn)靶向發(fā)布系統(tǒng)微服務(wù)架構(gòu)圖
微服務(wù)是一種分布式系統(tǒng)解決方案,2012年最先被提出,用于解決快速發(fā)展中可用軟件問(wèn)題,實(shí)現(xiàn)像更換零件一樣更換軟件的愿景[5]。微服務(wù)按照業(yè)務(wù)而非技術(shù)劃分的特性,具有高內(nèi)聚性、高擴(kuò)展性和高自治性的特點(diǎn)。微服務(wù)與微服務(wù)之間通過(guò)網(wǎng)絡(luò)調(diào)用進(jìn)行通信,從而加強(qiáng)了服務(wù)間的隔離性,避免了緊耦合[6]。在微服務(wù)平臺(tái)上,每個(gè)服務(wù)都是可熱插拔的,且某個(gè)服務(wù)的水平降級(jí)不顯著影響整個(gè)系統(tǒng)的使用。
SpringCloud是當(dāng)前最流行、先進(jìn)的微服務(wù)實(shí)現(xiàn)框架,它是一系列微服務(wù)開發(fā)工具集,提供包括微服務(wù)的分布式配置、服務(wù)發(fā)現(xiàn)、路由、負(fù)載均衡、斷路器、服務(wù)網(wǎng)關(guān)、消息傳遞等應(yīng)用組件[7]。在該系統(tǒng)架構(gòu)設(shè)計(jì)研發(fā)過(guò)程中,將系統(tǒng)拆分成用戶服務(wù)、授權(quán)服務(wù)、網(wǎng)關(guān)服務(wù)、群組服務(wù)、靶向發(fā)布服務(wù)等多個(gè)微服務(wù)。每個(gè)微服務(wù)專注于單一功能,并通過(guò)定義良好的接口清晰表述服務(wù)邊界,易于保持高可維護(hù)性和開發(fā)效率。根據(jù)實(shí)際應(yīng)用場(chǎng)景,可以動(dòng)態(tài)擴(kuò)展使用頻率高、負(fù)載大的服務(wù),橫向增加每個(gè)服務(wù)的能力。通過(guò)靈活水平擴(kuò)展和集成,獨(dú)立部署及運(yùn)維,使得按需彈性擴(kuò)展服務(wù)更容易。
系統(tǒng)采用SpringCloud微服務(wù)架構(gòu)設(shè)計(jì)思想,通過(guò)Vue.js作為前端框架和SpringBoot作為后端框架進(jìn)行結(jié)合設(shè)計(jì)開發(fā),主要包括系統(tǒng)基礎(chǔ)服務(wù)、基礎(chǔ)公共服務(wù)和業(yè)務(wù)服務(wù)[8]。業(yè)務(wù)服務(wù)中各微服務(wù)都定義成獨(dú)立的服務(wù)接口,相比于原來(lái)單體結(jié)構(gòu)的難以維護(hù)的情況,新的系統(tǒng)由實(shí)現(xiàn)不同功能的微服務(wù)組成,每個(gè)微服務(wù)只關(guān)注單一的業(yè)務(wù)功能[9]。
2.1.1 系統(tǒng)基礎(chǔ)服務(wù)系統(tǒng)基礎(chǔ)服務(wù)主要包括服務(wù)注冊(cè)中心(consul)、服務(wù)配置中心(springcloud-config)、服務(wù)網(wǎng)關(guān)(springcloud-gateway)、授權(quán)中心(authcenter)、服務(wù)監(jiān)控中心(monitor-center)等。系統(tǒng)通過(guò)Consul組件開發(fā)自己的注冊(cè)服務(wù),實(shí)現(xiàn)服務(wù)注冊(cè)統(tǒng)一管理;通過(guò)springcloud-config組件開發(fā)配置中心服務(wù),實(shí)現(xiàn)微服務(wù)配置統(tǒng)一管理;通過(guò)springcloud-gateway組件開發(fā)服務(wù)網(wǎng)關(guān),負(fù)責(zé)請(qǐng)求路由,來(lái)自外部客戶端的API請(qǐng)求先轉(zhuǎn)到服務(wù)網(wǎng)關(guān),再由網(wǎng)關(guān)轉(zhuǎn)到各自對(duì)應(yīng)的服務(wù),實(shí)現(xiàn)預(yù)警信息入口統(tǒng)一管理[10]。
2.1.2 基礎(chǔ)公共服務(wù)基礎(chǔ)公共服務(wù)包括對(duì)引用的第三方中間件的封裝集成和系統(tǒng)各個(gè)服務(wù)所需的公共處理組件模塊(如log日志組件、oss組件、job任務(wù)組件等)。系統(tǒng)通過(guò)redis中間件實(shí)現(xiàn)熱點(diǎn)數(shù)據(jù)緩存加速;通過(guò)mysql集群實(shí)現(xiàn)數(shù)據(jù)持久化存儲(chǔ);通過(guò)fastdfs中間件實(shí)現(xiàn)文件的持久化存儲(chǔ);通過(guò)ELK套件(Elasticsearch-Logstash-Kibana) 實(shí)現(xiàn)日志收集展示;通過(guò)XXL-JOB實(shí)現(xiàn)分布式任務(wù)調(diào)度。
2.1.3 業(yè)務(wù)服務(wù)業(yè)務(wù)服務(wù)包括用戶服務(wù)、群組服務(wù)、靶向任務(wù)服務(wù)等。該系統(tǒng)通過(guò)Springboot-admin實(shí)現(xiàn)系統(tǒng)服務(wù)的監(jiān)控;通過(guò)rabbitmq實(shí)現(xiàn)靶向任務(wù)等消息的訂閱發(fā)布;系統(tǒng)服務(wù)之間通過(guò)基于openfeign提供的RESTFULAPI進(jìn)行服務(wù)調(diào)用,通過(guò)LoadBalance處理服務(wù)間的負(fù)載均衡,通過(guò)Sentinel處理服務(wù)限流;通過(guò)git、maven、docker、harbor、kubernetes實(shí)現(xiàn)系統(tǒng)自動(dòng)化運(yùn)維流程。系統(tǒng)總體架構(gòu)見圖2。

圖2 湖南省應(yīng)急預(yù)警信息精準(zhǔn)靶向發(fā)布系統(tǒng)架構(gòu)圖
該系統(tǒng)實(shí)現(xiàn)主要包括發(fā)布渠道接入、動(dòng)態(tài)信息接入、精準(zhǔn)靶向推送和發(fā)布內(nèi)容詳情查看等功能。
2.2.1 發(fā)布渠道接入該系統(tǒng)通過(guò)restful接口與移動(dòng)、電信、聯(lián)通三大運(yùn)營(yíng)商對(duì)接相關(guān)接口,如區(qū)選人數(shù)預(yù)估、圈選人數(shù)預(yù)估、框選人數(shù)預(yù)估、精準(zhǔn)靶向任務(wù)發(fā)布、精準(zhǔn)靶向任務(wù)查詢、精準(zhǔn)靶向任務(wù)終止等接口。
2.2.2 動(dòng)態(tài)信息接入及精準(zhǔn)靶向推送系統(tǒng)基于GIS地圖,以平面圖層方式展示,接入的各運(yùn)營(yíng)商數(shù)據(jù),包括靜態(tài)數(shù)據(jù)、動(dòng)態(tài)實(shí)時(shí)用戶數(shù)據(jù)等。靜態(tài)數(shù)據(jù)包括湖南省地圖GIS數(shù)據(jù)信息、電子圍欄信息等,動(dòng)態(tài)數(shù)據(jù)包括區(qū)選、圈選、框選范圍內(nèi)的人數(shù)、精準(zhǔn)靶向歷史發(fā)布數(shù)據(jù)等。這些數(shù)據(jù)通過(guò)運(yùn)營(yíng)商提供的接口接入本系統(tǒng),通過(guò)不同范圍的選擇方式,實(shí)時(shí)計(jì)算人口數(shù),根據(jù)精準(zhǔn)靶向預(yù)估發(fā)送模型,對(duì)數(shù)據(jù)進(jìn)行加工,融合處理后得到預(yù)估發(fā)送結(jié)果,并通過(guò)反饋的信息,精準(zhǔn)計(jì)算發(fā)布人群及數(shù)量、發(fā)布內(nèi)容、預(yù)警類型和等級(jí)、發(fā)布時(shí)間。使用定時(shí)任務(wù)和消息隊(duì)列推送發(fā)布任務(wù)實(shí)現(xiàn)預(yù)警消息精準(zhǔn)、快速推送到對(duì)應(yīng)人群。
2.2.3 發(fā)布內(nèi)容及詳情查看針對(duì)已經(jīng)發(fā)布的精準(zhǔn)靶向任務(wù),通過(guò)任務(wù)管理可以實(shí)時(shí)監(jiān)控查看推送進(jìn)度、各運(yùn)營(yíng)商發(fā)布人數(shù)、推送總量及當(dāng)前任務(wù)狀態(tài)。
單個(gè)精準(zhǔn)靶向任務(wù)通過(guò)詳情入口,可以查看更詳細(xì)的發(fā)布信息,如推送時(shí)間、推送進(jìn)度、各運(yùn)營(yíng)商發(fā)布人數(shù)等信息,并通過(guò)GIS地圖,清晰地展示發(fā)布區(qū)域。
該系統(tǒng)核心處理流程包括搭建注冊(cè)中心、構(gòu)建配置中心、服務(wù)注冊(cè)與發(fā)現(xiàn)、微服務(wù)使用,協(xié)同采用IntelliJ IDEA作為開發(fā)工具,Maven作為構(gòu)建工具,git作為代碼管理工具。
通過(guò)dockerhub獲取Consul鏡像地址,在kubernetes中通過(guò)構(gòu)建部署文件consul.yaml,實(shí)現(xiàn)注冊(cè)服務(wù)部署。
在分布式微服務(wù)架構(gòu)中,服務(wù)數(shù)量越來(lái)越多,每個(gè)服務(wù)實(shí)例都會(huì)有配置文件,如.yml文件、.properties文件、.json文件等。這些文件分布在系統(tǒng)的各個(gè)服務(wù)中,管理復(fù)雜,要承擔(dān)反復(fù)修改編譯代碼、重啟系統(tǒng)、重新打包等風(fēng)險(xiǎn),為了方便所有服務(wù)的配置統(tǒng)一管理,實(shí)時(shí)更新,因此引入分布式配置中心。
(1)使用IntelliJ IDEA,創(chuàng)建新應(yīng)用項(xiàng)目platform-config,把該項(xiàng)目作為配置中心的服務(wù)創(chuàng)建完成后。先在配置管理文件,如以下定義項(xiàng)目配置文件pom.xml,在其中配置必須的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-configserver</artifactId>
</dependency>
(2)實(shí)現(xiàn)配置服務(wù)啟動(dòng)類PlatformConfigApplication
例如,在代碼PlatformConfigApplication.java文件中類聲明上添加注解,即可實(shí)現(xiàn)服務(wù)的啟動(dòng)類,用于啟動(dòng)配置中心:
@EnableConfigServer
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
publicclassPlatformConfigApplicati on{
publicstaticvoidmain(String[]args){
SpringApplication.run(Platform ConfigApplication.class,args);
}
}
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
(3)配置訪問(wèn)路徑及相關(guān)參數(shù),例如,定義bootstrap.yml配置文件,參數(shù)可如下進(jìn)行:
server:
port:9130
spring:
application:
name:@artifactId@
profiles:
active:native
cloud:
config:
server:
native:
search-locations:classpath:/config
consul:
host:${CONSUL_URL:127.0.0.1}
port:${CONSUL_PORT:8500}
discovery:
prefer-ip-address:true
health-check-interval:5s
instance-id:${spring.application.name}-${server.port}-${spring.cloud.client.ip-address}
log:
path:logs/${spring.application.name}
配置中心啟動(dòng)后可通過(guò)注冊(cè)中心服務(wù)的管理界面,查看配置中心微服務(wù)的相關(guān)信息。
在完成服務(wù)注冊(cè)中心和配置中心搭建后,將其他服務(wù)添加到注冊(cè)中心Consul的服務(wù)體系中,作為服務(wù)的提供者提供相應(yīng)的服務(wù)。下面以imasphonebook-service群組微服務(wù)為例,介紹微服務(wù)的創(chuàng)建和注冊(cè)流程。
(1)創(chuàng)建新應(yīng)用模塊,定義為imasphonebook-service,并在pom.xml配置,配置情況如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starterconsul-discovery</artifactId>
</dependency>
(2)創(chuàng)建微服務(wù)啟動(dòng)類PhoneBook ServiceApplication
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
publicclassPhoneBookServiceAppli cation{
publicstaticvoidmain(String[]args){
SpringApplication.run(PhoneBook ServiceApplication.class,args);
}
}
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
(3)配置訪問(wèn)路徑及相關(guān)參數(shù)
spring:
application:
name:@artifactId@
main:
profiles:
active:prod
cloud:
config:
name:imas-phonebook,imascommon
profile:prod
discovery:
enabled:true
service-id:${CLOUD_CONFIG_SERVICE:platform-config}
uri:${CONFIG_URL:http://platform-config:9130}
username:${CLOUD_CONFIG_USERNAME:admin}
password:${CLOUD_CONFIG_PASSWORD:imas@IMAS!@}
consul:
host:${CONSUL_HOST:10.111.124.197}
port:${CONSUL_PORT:8500}
discovery:
prefer-ip-address:true
health-check-interval:5s
在注冊(cè)中心中注冊(cè)的微服務(wù)可以向整個(gè)系統(tǒng)提供該微服務(wù)所具備的功能,即實(shí)現(xiàn)服務(wù)消費(fèi)。
(4)創(chuàng)建一個(gè)使用imas-phonebookservice服 務(wù) 的SpringBoot基 礎(chǔ) 工 程imas-platform-service,在pom.xml中 引入相應(yīng)的依賴。配置情況如下:
<dependency>
<groupId>com.vphonor.imas</groupId>
<artifactId>imas-phonebook-api</artifactId>
</dependency>
(5)創(chuàng)建應(yīng)用的入口類,在入口類的實(shí)現(xiàn)文件中通過(guò)使用@EnableDiscoveryClient注解讓該應(yīng)用注冊(cè)為Consul的客戶端應(yīng)用,以獲得服務(wù)發(fā)現(xiàn)能力。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
publicclassPlatformServiceApplicati on{
publicstaticvoidmain(String[]args){
SpringApplication.run(Platform ServiceApplication.class,args);
}
}
(6)創(chuàng)建調(diào)用函數(shù)調(diào)用群組服務(wù)
publicResultgroupCreate(ApiReque strequest){
returnphoneBookClient.platform GroupCreate(request);
}
經(jīng)過(guò)上述步驟,可以通過(guò)platformservice能開服務(wù)對(duì)群組服務(wù)發(fā)起遠(yuǎn)程調(diào)用。
分布式架構(gòu)是微服務(wù)的主要特性,系統(tǒng)細(xì)分功能服務(wù),各個(gè)細(xì)分后的模塊進(jìn)程是獨(dú)立的,從而確保部署時(shí)能夠獨(dú)立操作[11]。當(dāng)發(fā)生系統(tǒng)故障而影響系統(tǒng)穩(wěn)定性時(shí),工作人員可將故障影響控制在單個(gè)應(yīng)用中,這樣既避免了對(duì)其他服務(wù)造成影響,還極大地保證了軟件運(yùn)行的穩(wěn)定性、安全性和可靠性[12]。
系統(tǒng)通過(guò)git、maven、docker、harbor、kubernetes實(shí)現(xiàn)系統(tǒng)自動(dòng)化運(yùn)維部署流程。其中,git用于存儲(chǔ)系統(tǒng)代碼、管理代碼分支;maven作為依賴管理工具,用于項(xiàng)目構(gòu)建、打包等;docker用于保存系統(tǒng)打包的鏡像文件,docker技術(shù)具有開箱即用、快速部署、可移植性強(qiáng)、環(huán)境隔離的特點(diǎn),可以很好地解決微服務(wù)架構(gòu)部署面臨的諸多問(wèn)題;harbor作為鏡像倉(cāng)庫(kù),用于保存生成的鏡像文件;kubernetes作為容器化平臺(tái),用于承載系統(tǒng)服務(wù),并提供靈活的伸縮機(jī)制,實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容,保證系統(tǒng)穩(wěn)定性和高可用性[13]。
基于Spring Cloud架構(gòu)的微服務(wù)框架已經(jīng)應(yīng)用于湖南省應(yīng)急預(yù)警信息精準(zhǔn)靶向發(fā)布系統(tǒng),系統(tǒng)融合移動(dòng)、聯(lián)通、電信運(yùn)營(yíng)商數(shù)據(jù)及接口,實(shí)現(xiàn)了對(duì)災(zāi)害的精準(zhǔn)預(yù)警和對(duì)預(yù)警發(fā)布任務(wù)的實(shí)時(shí)動(dòng)態(tài)監(jiān)測(cè),驗(yàn)證了微服務(wù)架構(gòu)用于復(fù)雜的預(yù)警發(fā)布和監(jiān)測(cè)的可行性與實(shí)用性,降低了系統(tǒng)各功能模塊間的耦合度,更有利于應(yīng)用系統(tǒng)的擴(kuò)充和完善。相較于采用傳統(tǒng)單體架構(gòu)應(yīng)用的開發(fā)過(guò)程,其降低了開發(fā)的難度,與外省同類系統(tǒng)相比提高了系統(tǒng)運(yùn)行效率,也更便于發(fā)布渠道等擴(kuò)展系統(tǒng)的對(duì)接。本系統(tǒng)今后的重點(diǎn)研究方向:隨著接入更多的發(fā)布通道和更多的發(fā)布類型,通過(guò)開發(fā)新的微服務(wù)或者迭代現(xiàn)有的微服務(wù),為湖南省應(yīng)急預(yù)警信息精準(zhǔn)靶向發(fā)布系統(tǒng)提供更優(yōu)質(zhì)、更穩(wěn)定的服務(wù),并通過(guò)更多的大數(shù)據(jù)分析技術(shù)手段使其不斷完善,更好地應(yīng)用于各類災(zāi)害預(yù)警,更好地服務(wù)于防災(zāi)減災(zāi)。