陳玉貴,羅紅梅,郭海峰,朱國強,唐 群
1.湖南省氣象服務中心,湖南長沙 410118;2.氣象防災減災湖南省重點實驗室,湖南長沙 410118
湖南是氣象災害頻發(fā)、重發(fā)的省份,汛期災害性天氣頻發(fā),如何防汛救災、減少人員傷亡備受關注,氣象預報預警是防御和減輕氣象及次生災害的第一道防線[1]。2016年11月,湖南省級突發(fā)預警信息發(fā)布平臺建成,平臺已實現(xiàn)13種發(fā)布渠道,包括手機短信、聲訊、大喇叭、顯示屏、網(wǎng)站、電視廣播、微博微信、北斗衛(wèi)星等可傳播預警信息,但手機短信、聲訊等傳播渠道是基于群組向防汛責任人發(fā)布的[2]。近年來,習近平總書記多次強調(diào)要加強預警體系建設,提出“預警發(fā)布要精準”,“預警信息發(fā)布要到村到戶到人”,2021年湖南建設了全省統(tǒng)一應用的湖南省應急預警信息精準靶向發(fā)布系統(tǒng),通過與移動、聯(lián)通、電信三大運營商打通精準靶向發(fā)布接口,實現(xiàn)了基于電子圍欄技術,確保預警信息精確發(fā)送到圈定區(qū)域內(nèi)社會公眾的每個手機號碼,讓省、市、縣、鄉(xiāng)鎮(zhèn)(街道)、村(社區(qū))各級防汛責任人針對性地采取防御措施,贏得寶貴的轉(zhuǎn)移避險時間,保障人民群眾生命財產(chǎn)安全,為決策部門應急聯(lián)動提供支撐[3]。
2021年湖南省應急預警信息精準靶向發(fā)布系統(tǒng),實現(xiàn)市州氣象局、省級突發(fā)預警信息發(fā)布責任單位靈活、快速接入,且提供給第三方系統(tǒng)平臺外部接口能力服務。隨著精準靶向發(fā)布系統(tǒng)對接部門的增加,原有單服務器架構(gòu)已不足以滿足業(yè)務需求,使用微服務架構(gòu),可以分區(qū)域部署多個數(shù)據(jù)庫,對數(shù)據(jù)進行拆分,顯著降低服務器的壓力;采用微服務架構(gòu),構(gòu)建獨立部署、水平擴展、獨立訪問的服務單元,以提高整個系統(tǒng)訪問的時效性和并發(fā)性[4]。
系統(tǒng)總體架構(gòu)采用微服務架構(gòu)設計,主要分為業(yè)務前臺、業(yè)務中臺、技術中臺(圖1)。業(yè)務前臺主要為客戶端,展示各個功能模塊和對外接口能力的輸出。業(yè)務中臺主要是服務端的內(nèi)部服務,支撐前端功能需求,負責業(yè)務邏輯處理、權限管理、對接外部接口能力等。技術中臺是服務端核心支撐功能點,支撐業(yè)務中臺的相關業(yè)務,主要為數(shù)據(jù)庫、緩存、網(wǎng)絡、監(jiān)控、安全,資源調(diào)度等服務端支撐體系。
圖1 湖南省應急預警精準靶向發(fā)布系統(tǒng)微服務架構(gòu)圖
微服務是一種分布式系統(tǒng)解決方案,2012年最先被提出,用于解決快速發(fā)展中可用軟件問題,實現(xiàn)像更換零件一樣更換軟件的愿景[5]。微服務按照業(yè)務而非技術劃分的特性,具有高內(nèi)聚性、高擴展性和高自治性的特點。微服務與微服務之間通過網(wǎng)絡調(diào)用進行通信,從而加強了服務間的隔離性,避免了緊耦合[6]。在微服務平臺上,每個服務都是可熱插拔的,且某個服務的水平降級不顯著影響整個系統(tǒng)的使用。
SpringCloud是當前最流行、先進的微服務實現(xiàn)框架,它是一系列微服務開發(fā)工具集,提供包括微服務的分布式配置、服務發(fā)現(xiàn)、路由、負載均衡、斷路器、服務網(wǎng)關、消息傳遞等應用組件[7]。在該系統(tǒng)架構(gòu)設計研發(fā)過程中,將系統(tǒng)拆分成用戶服務、授權服務、網(wǎng)關服務、群組服務、靶向發(fā)布服務等多個微服務。每個微服務專注于單一功能,并通過定義良好的接口清晰表述服務邊界,易于保持高可維護性和開發(fā)效率。根據(jù)實際應用場景,可以動態(tài)擴展使用頻率高、負載大的服務,橫向增加每個服務的能力。通過靈活水平擴展和集成,獨立部署及運維,使得按需彈性擴展服務更容易。
系統(tǒng)采用SpringCloud微服務架構(gòu)設計思想,通過Vue.js作為前端框架和SpringBoot作為后端框架進行結(jié)合設計開發(fā),主要包括系統(tǒng)基礎服務、基礎公共服務和業(yè)務服務[8]。業(yè)務服務中各微服務都定義成獨立的服務接口,相比于原來單體結(jié)構(gòu)的難以維護的情況,新的系統(tǒng)由實現(xiàn)不同功能的微服務組成,每個微服務只關注單一的業(yè)務功能[9]。
2.1.1 系統(tǒng)基礎服務系統(tǒng)基礎服務主要包括服務注冊中心(consul)、服務配置中心(springcloud-config)、服務網(wǎng)關(springcloud-gateway)、授權中心(authcenter)、服務監(jiān)控中心(monitor-center)等。系統(tǒng)通過Consul組件開發(fā)自己的注冊服務,實現(xiàn)服務注冊統(tǒng)一管理;通過springcloud-config組件開發(fā)配置中心服務,實現(xiàn)微服務配置統(tǒng)一管理;通過springcloud-gateway組件開發(fā)服務網(wǎng)關,負責請求路由,來自外部客戶端的API請求先轉(zhuǎn)到服務網(wǎng)關,再由網(wǎng)關轉(zhuǎn)到各自對應的服務,實現(xiàn)預警信息入口統(tǒng)一管理[10]。
2.1.2 基礎公共服務基礎公共服務包括對引用的第三方中間件的封裝集成和系統(tǒng)各個服務所需的公共處理組件模塊(如log日志組件、oss組件、job任務組件等)。系統(tǒng)通過redis中間件實現(xiàn)熱點數(shù)據(jù)緩存加速;通過mysql集群實現(xiàn)數(shù)據(jù)持久化存儲;通過fastdfs中間件實現(xiàn)文件的持久化存儲;通過ELK套件(Elasticsearch-Logstash-Kibana) 實現(xiàn)日志收集展示;通過XXL-JOB實現(xiàn)分布式任務調(diào)度。
2.1.3 業(yè)務服務業(yè)務服務包括用戶服務、群組服務、靶向任務服務等。該系統(tǒng)通過Springboot-admin實現(xiàn)系統(tǒng)服務的監(jiān)控;通過rabbitmq實現(xiàn)靶向任務等消息的訂閱發(fā)布;系統(tǒng)服務之間通過基于openfeign提供的RESTFULAPI進行服務調(diào)用,通過LoadBalance處理服務間的負載均衡,通過Sentinel處理服務限流;通過git、maven、docker、harbor、kubernetes實現(xiàn)系統(tǒng)自動化運維流程。系統(tǒng)總體架構(gòu)見圖2。
圖2 湖南省應急預警信息精準靶向發(fā)布系統(tǒng)架構(gòu)圖
該系統(tǒng)實現(xiàn)主要包括發(fā)布渠道接入、動態(tài)信息接入、精準靶向推送和發(fā)布內(nèi)容詳情查看等功能。
2.2.1 發(fā)布渠道接入該系統(tǒng)通過restful接口與移動、電信、聯(lián)通三大運營商對接相關接口,如區(qū)選人數(shù)預估、圈選人數(shù)預估、框選人數(shù)預估、精準靶向任務發(fā)布、精準靶向任務查詢、精準靶向任務終止等接口。
2.2.2 動態(tài)信息接入及精準靶向推送系統(tǒng)基于GIS地圖,以平面圖層方式展示,接入的各運營商數(shù)據(jù),包括靜態(tài)數(shù)據(jù)、動態(tài)實時用戶數(shù)據(jù)等。靜態(tài)數(shù)據(jù)包括湖南省地圖GIS數(shù)據(jù)信息、電子圍欄信息等,動態(tài)數(shù)據(jù)包括區(qū)選、圈選、框選范圍內(nèi)的人數(shù)、精準靶向歷史發(fā)布數(shù)據(jù)等。這些數(shù)據(jù)通過運營商提供的接口接入本系統(tǒng),通過不同范圍的選擇方式,實時計算人口數(shù),根據(jù)精準靶向預估發(fā)送模型,對數(shù)據(jù)進行加工,融合處理后得到預估發(fā)送結(jié)果,并通過反饋的信息,精準計算發(fā)布人群及數(shù)量、發(fā)布內(nèi)容、預警類型和等級、發(fā)布時間。使用定時任務和消息隊列推送發(fā)布任務實現(xiàn)預警消息精準、快速推送到對應人群。
2.2.3 發(fā)布內(nèi)容及詳情查看針對已經(jīng)發(fā)布的精準靶向任務,通過任務管理可以實時監(jiān)控查看推送進度、各運營商發(fā)布人數(shù)、推送總量及當前任務狀態(tài)。
單個精準靶向任務通過詳情入口,可以查看更詳細的發(fā)布信息,如推送時間、推送進度、各運營商發(fā)布人數(shù)等信息,并通過GIS地圖,清晰地展示發(fā)布區(qū)域。
該系統(tǒng)核心處理流程包括搭建注冊中心、構(gòu)建配置中心、服務注冊與發(fā)現(xiàn)、微服務使用,協(xié)同采用IntelliJ IDEA作為開發(fā)工具,Maven作為構(gòu)建工具,git作為代碼管理工具。
通過dockerhub獲取Consul鏡像地址,在kubernetes中通過構(gòu)建部署文件consul.yaml,實現(xiàn)注冊服務部署。
在分布式微服務架構(gòu)中,服務數(shù)量越來越多,每個服務實例都會有配置文件,如.yml文件、.properties文件、.json文件等。這些文件分布在系統(tǒng)的各個服務中,管理復雜,要承擔反復修改編譯代碼、重啟系統(tǒng)、重新打包等風險,為了方便所有服務的配置統(tǒng)一管理,實時更新,因此引入分布式配置中心。
(1)使用IntelliJ IDEA,創(chuàng)建新應用項目platform-config,把該項目作為配置中心的服務創(chuàng)建完成后。先在配置管理文件,如以下定義項目配置文件pom.xml,在其中配置必須的依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-configserver</artifactId>
</dependency>
(2)實現(xiàn)配置服務啟動類PlatformConfigApplication
例如,在代碼PlatformConfigApplication.java文件中類聲明上添加注解,即可實現(xiàn)服務的啟動類,用于啟動配置中心:
@EnableConfigServer
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
publicclassPlatformConfigApplicati on{
publicstaticvoidmain(String[]args){
SpringApplication.run(Platform ConfigApplication.class,args);
}
}
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
(3)配置訪問路徑及相關參數(shù),例如,定義bootstrap.yml配置文件,參數(shù)可如下進行:
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}
配置中心啟動后可通過注冊中心服務的管理界面,查看配置中心微服務的相關信息。
在完成服務注冊中心和配置中心搭建后,將其他服務添加到注冊中心Consul的服務體系中,作為服務的提供者提供相應的服務。下面以imasphonebook-service群組微服務為例,介紹微服務的創(chuàng)建和注冊流程。
(1)創(chuàng)建新應用模塊,定義為imasphonebook-service,并在pom.xml配置,配置情況如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starterconsul-discovery</artifactId>
</dependency>
(2)創(chuàng)建微服務啟動類PhoneBook ServiceApplication
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
publicclassPhoneBookServiceAppli cation{
publicstaticvoidmain(String[]args){
SpringApplication.run(PhoneBook ServiceApplication.class,args);
}
}
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
(3)配置訪問路徑及相關參數(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
在注冊中心中注冊的微服務可以向整個系統(tǒng)提供該微服務所具備的功能,即實現(xiàn)服務消費。
(4)創(chuàng)建一個使用imas-phonebookservice服 務 的SpringBoot基 礎 工 程imas-platform-service,在pom.xml中 引入相應的依賴。配置情況如下:
<dependency>
<groupId>com.vphonor.imas</groupId>
<artifactId>imas-phonebook-api</artifactId>
</dependency>
(5)創(chuàng)建應用的入口類,在入口類的實現(xiàn)文件中通過使用@EnableDiscoveryClient注解讓該應用注冊為Consul的客戶端應用,以獲得服務發(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)用群組服務
publicResultgroupCreate(ApiReque strequest){
returnphoneBookClient.platform GroupCreate(request);
}
經(jīng)過上述步驟,可以通過platformservice能開服務對群組服務發(fā)起遠程調(diào)用。
分布式架構(gòu)是微服務的主要特性,系統(tǒng)細分功能服務,各個細分后的模塊進程是獨立的,從而確保部署時能夠獨立操作[11]。當發(fā)生系統(tǒng)故障而影響系統(tǒng)穩(wěn)定性時,工作人員可將故障影響控制在單個應用中,這樣既避免了對其他服務造成影響,還極大地保證了軟件運行的穩(wěn)定性、安全性和可靠性[12]。
系統(tǒng)通過git、maven、docker、harbor、kubernetes實現(xiàn)系統(tǒng)自動化運維部署流程。其中,git用于存儲系統(tǒng)代碼、管理代碼分支;maven作為依賴管理工具,用于項目構(gòu)建、打包等;docker用于保存系統(tǒng)打包的鏡像文件,docker技術具有開箱即用、快速部署、可移植性強、環(huán)境隔離的特點,可以很好地解決微服務架構(gòu)部署面臨的諸多問題;harbor作為鏡像倉庫,用于保存生成的鏡像文件;kubernetes作為容器化平臺,用于承載系統(tǒng)服務,并提供靈活的伸縮機制,實現(xiàn)動態(tài)擴容,保證系統(tǒng)穩(wěn)定性和高可用性[13]。
基于Spring Cloud架構(gòu)的微服務框架已經(jīng)應用于湖南省應急預警信息精準靶向發(fā)布系統(tǒng),系統(tǒng)融合移動、聯(lián)通、電信運營商數(shù)據(jù)及接口,實現(xiàn)了對災害的精準預警和對預警發(fā)布任務的實時動態(tài)監(jiān)測,驗證了微服務架構(gòu)用于復雜的預警發(fā)布和監(jiān)測的可行性與實用性,降低了系統(tǒng)各功能模塊間的耦合度,更有利于應用系統(tǒng)的擴充和完善。相較于采用傳統(tǒng)單體架構(gòu)應用的開發(fā)過程,其降低了開發(fā)的難度,與外省同類系統(tǒng)相比提高了系統(tǒng)運行效率,也更便于發(fā)布渠道等擴展系統(tǒng)的對接。本系統(tǒng)今后的重點研究方向:隨著接入更多的發(fā)布通道和更多的發(fā)布類型,通過開發(fā)新的微服務或者迭代現(xiàn)有的微服務,為湖南省應急預警信息精準靶向發(fā)布系統(tǒng)提供更優(yōu)質(zhì)、更穩(wěn)定的服務,并通過更多的大數(shù)據(jù)分析技術手段使其不斷完善,更好地應用于各類災害預警,更好地服務于防災減災。