陈玉贵,罗红梅,郭海峰,朱国强,唐 群
1.湖南省气象服务中心,湖南长沙 410118;2.气象防灾减灾湖南省重点实验室,湖南长沙 410118
湖南是气象灾害频发、重发的省份,汛期灾害性天气频发,如何防汛救灾、减少人员伤亡备受关注,气象预报预警是防御和减轻气象及次生灾害的第一道防线[1]。2016年11月,湖南省级突发预警信息发布平台建成,平台已实现13种发布渠道,包括手机短信、声讯、大喇叭、显示屏、网站、电视广播、微博微信、北斗卫星等可传播预警信息,但手机短信、声讯等传播渠道是基于群组向防汛责任人发布的[2]。近年来,习近平总书记多次强调要加强预警体系建设,提出“预警发布要精准”,“预警信息发布要到村到户到人”,2021年湖南建设了全省统一应用的湖南省应急预警信息精准靶向发布系统,通过与移动、联通、电信三大运营商打通精准靶向发布接口,实现了基于电子围栏技术,确保预警信息精确发送到圈定区域内社会公众的每个手机号码,让省、市、县、乡镇(街道)、村(社区)各级防汛责任人针对性地采取防御措施,赢得宝贵的转移避险时间,保障人民群众生命财产安全,为决策部门应急联动提供支撑[3]。
2021年湖南省应急预警信息精准靶向发布系统,实现市州气象局、省级突发预警信息发布责任单位灵活、快速接入,且提供给第三方系统平台外部接口能力服务。随着精准靶向发布系统对接部门的增加,原有单服务器架构已不足以满足业务需求,使用微服务架构,可以分区域部署多个数据库,对数据进行拆分,显著降低服务器的压力;采用微服务架构,构建独立部署、水平扩展、独立访问的服务单元,以提高整个系统访问的时效性和并发性[4]。
系统总体架构采用微服务架构设计,主要分为业务前台、业务中台、技术中台(图1)。业务前台主要为客户端,展示各个功能模块和对外接口能力的输出。业务中台主要是服务端的内部服务,支撑前端功能需求,负责业务逻辑处理、权限管理、对接外部接口能力等。技术中台是服务端核心支撑功能点,支撑业务中台的相关业务,主要为数据库、缓存、网络、监控、安全,资源调度等服务端支撑体系。
图1 湖南省应急预警精准靶向发布系统微服务架构图
微服务是一种分布式系统解决方案,2012年最先被提出,用于解决快速发展中可用软件问题,实现像更换零件一样更换软件的愿景[5]。微服务按照业务而非技术划分的特性,具有高内聚性、高扩展性和高自治性的特点。微服务与微服务之间通过网络调用进行通信,从而加强了服务间的隔离性,避免了紧耦合[6]。在微服务平台上,每个服务都是可热插拔的,且某个服务的水平降级不显著影响整个系统的使用。
SpringCloud是当前最流行、先进的微服务实现框架,它是一系列微服务开发工具集,提供包括微服务的分布式配置、服务发现、路由、负载均衡、断路器、服务网关、消息传递等应用组件[7]。在该系统架构设计研发过程中,将系统拆分成用户服务、授权服务、网关服务、群组服务、靶向发布服务等多个微服务。每个微服务专注于单一功能,并通过定义良好的接口清晰表述服务边界,易于保持高可维护性和开发效率。根据实际应用场景,可以动态扩展使用频率高、负载大的服务,横向增加每个服务的能力。通过灵活水平扩展和集成,独立部署及运维,使得按需弹性扩展服务更容易。
系统采用SpringCloud微服务架构设计思想,通过Vue.js作为前端框架和SpringBoot作为后端框架进行结合设计开发,主要包括系统基础服务、基础公共服务和业务服务[8]。业务服务中各微服务都定义成独立的服务接口,相比于原来单体结构的难以维护的情况,新的系统由实现不同功能的微服务组成,每个微服务只关注单一的业务功能[9]。
2.1.1 系统基础服务系统基础服务主要包括服务注册中心(consul)、服务配置中心(springcloud-config)、服务网关(springcloud-gateway)、授权中心(authcenter)、服务监控中心(monitor-center)等。系统通过Consul组件开发自己的注册服务,实现服务注册统一管理;通过springcloud-config组件开发配置中心服务,实现微服务配置统一管理;通过springcloud-gateway组件开发服务网关,负责请求路由,来自外部客户端的API请求先转到服务网关,再由网关转到各自对应的服务,实现预警信息入口统一管理[10]。
2.1.2 基础公共服务基础公共服务包括对引用的第三方中间件的封装集成和系统各个服务所需的公共处理组件模块(如log日志组件、oss组件、job任务组件等)。系统通过redis中间件实现热点数据缓存加速;通过mysql集群实现数据持久化存储;通过fastdfs中间件实现文件的持久化存储;通过ELK套件(Elasticsearch-Logstash-Kibana) 实现日志收集展示;通过XXL-JOB实现分布式任务调度。
2.1.3 业务服务业务服务包括用户服务、群组服务、靶向任务服务等。该系统通过Springboot-admin实现系统服务的监控;通过rabbitmq实现靶向任务等消息的订阅发布;系统服务之间通过基于openfeign提供的RESTFULAPI进行服务调用,通过LoadBalance处理服务间的负载均衡,通过Sentinel处理服务限流;通过git、maven、docker、harbor、kubernetes实现系统自动化运维流程。系统总体架构见图2。
图2 湖南省应急预警信息精准靶向发布系统架构图
该系统实现主要包括发布渠道接入、动态信息接入、精准靶向推送和发布内容详情查看等功能。
2.2.1 发布渠道接入该系统通过restful接口与移动、电信、联通三大运营商对接相关接口,如区选人数预估、圈选人数预估、框选人数预估、精准靶向任务发布、精准靶向任务查询、精准靶向任务终止等接口。
2.2.2 动态信息接入及精准靶向推送系统基于GIS地图,以平面图层方式展示,接入的各运营商数据,包括静态数据、动态实时用户数据等。静态数据包括湖南省地图GIS数据信息、电子围栏信息等,动态数据包括区选、圈选、框选范围内的人数、精准靶向历史发布数据等。这些数据通过运营商提供的接口接入本系统,通过不同范围的选择方式,实时计算人口数,根据精准靶向预估发送模型,对数据进行加工,融合处理后得到预估发送结果,并通过反馈的信息,精准计算发布人群及数量、发布内容、预警类型和等级、发布时间。使用定时任务和消息队列推送发布任务实现预警消息精准、快速推送到对应人群。
2.2.3 发布内容及详情查看针对已经发布的精准靶向任务,通过任务管理可以实时监控查看推送进度、各运营商发布人数、推送总量及当前任务状态。
单个精准靶向任务通过详情入口,可以查看更详细的发布信息,如推送时间、推送进度、各运营商发布人数等信息,并通过GIS地图,清晰地展示发布区域。
该系统核心处理流程包括搭建注册中心、构建配置中心、服务注册与发现、微服务使用,协同采用IntelliJ IDEA作为开发工具,Maven作为构建工具,git作为代码管理工具。
通过dockerhub获取Consul镜像地址,在kubernetes中通过构建部署文件consul.yaml,实现注册服务部署。
在分布式微服务架构中,服务数量越来越多,每个服务实例都会有配置文件,如.yml文件、.properties文件、.json文件等。这些文件分布在系统的各个服务中,管理复杂,要承担反复修改编译代码、重启系统、重新打包等风险,为了方便所有服务的配置统一管理,实时更新,因此引入分布式配置中心。
(1)使用IntelliJ IDEA,创建新应用项目platform-config,把该项目作为配置中心的服务创建完成后。先在配置管理文件,如以下定义项目配置文件pom.xml,在其中配置必须的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-configserver</artifactId>
</dependency>
(2)实现配置服务启动类PlatformConfigApplication
例如,在代码PlatformConfigApplication.java文件中类声明上添加注解,即可实现服务的启动类,用于启动配置中心:
@EnableConfigServer
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
publicclassPlatformConfigApplicati on{
publicstaticvoidmain(String[]args){
SpringApplication.run(Platform ConfigApplication.class,args);
}
}
@EnableDiscoveryClient
@EnableConfigServer
@SpringBootApplication
(3)配置访问路径及相关参数,例如,定义bootstrap.yml配置文件,参数可如下进行:
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群组微服务为例,介绍微服务的创建和注册流程。
(1)创建新应用模块,定义为imasphonebook-service,并在pom.xml配置,配置情况如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starterconsul-discovery</artifactId>
</dependency>
(2)创建微服务启动类PhoneBook ServiceApplication
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
publicclassPhoneBookServiceAppli cation{
publicstaticvoidmain(String[]args){
SpringApplication.run(PhoneBook ServiceApplication.class,args);
}
}
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
(3)配置访问路径及相关参数
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
在注册中心中注册的微服务可以向整个系统提供该微服务所具备的功能,即实现服务消费。
(4)创建一个使用imas-phonebookservice服 务 的SpringBoot基 础 工 程imas-platform-service,在pom.xml中 引入相应的依赖。配置情况如下:
<dependency>
<groupId>com.vphonor.imas</groupId>
<artifactId>imas-phonebook-api</artifactId>
</dependency>
(5)创建应用的入口类,在入口类的实现文件中通过使用@EnableDiscoveryClient注解让该应用注册为Consul的客户端应用,以获得服务发现能力。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
publicclassPlatformServiceApplicati on{
publicstaticvoidmain(String[]args){
SpringApplication.run(Platform ServiceApplication.class,args);
}
}
(6)创建调用函数调用群组服务
publicResultgroupCreate(ApiReque strequest){
returnphoneBookClient.platform GroupCreate(request);
}
经过上述步骤,可以通过platformservice能开服务对群组服务发起远程调用。
分布式架构是微服务的主要特性,系统细分功能服务,各个细分后的模块进程是独立的,从而确保部署时能够独立操作[11]。当发生系统故障而影响系统稳定性时,工作人员可将故障影响控制在单个应用中,这样既避免了对其他服务造成影响,还极大地保证了软件运行的稳定性、安全性和可靠性[12]。
系统通过git、maven、docker、harbor、kubernetes实现系统自动化运维部署流程。其中,git用于存储系统代码、管理代码分支;maven作为依赖管理工具,用于项目构建、打包等;docker用于保存系统打包的镜像文件,docker技术具有开箱即用、快速部署、可移植性强、环境隔离的特点,可以很好地解决微服务架构部署面临的诸多问题;harbor作为镜像仓库,用于保存生成的镜像文件;kubernetes作为容器化平台,用于承载系统服务,并提供灵活的伸缩机制,实现动态扩容,保证系统稳定性和高可用性[13]。
基于Spring Cloud架构的微服务框架已经应用于湖南省应急预警信息精准靶向发布系统,系统融合移动、联通、电信运营商数据及接口,实现了对灾害的精准预警和对预警发布任务的实时动态监测,验证了微服务架构用于复杂的预警发布和监测的可行性与实用性,降低了系统各功能模块间的耦合度,更有利于应用系统的扩充和完善。相较于采用传统单体架构应用的开发过程,其降低了开发的难度,与外省同类系统相比提高了系统运行效率,也更便于发布渠道等扩展系统的对接。本系统今后的重点研究方向:随着接入更多的发布通道和更多的发布类型,通过开发新的微服务或者迭代现有的微服务,为湖南省应急预警信息精准靶向发布系统提供更优质、更稳定的服务,并通过更多的大数据分析技术手段使其不断完善,更好地应用于各类灾害预警,更好地服务于防灾减灾。