基金项目:中国地震局2024年度地震信息青年重点任务:基于微服务架构的地震信息触发器设计与实现(CEAITNS202401)联合资助。
作者简介:孙选超(1993-),男,工程师,主要从事地震信息网络运维和现场应急。
通信作者:朱宏(1989-),男,高级工程师,主要从事信息网络安全。E-mail:tjnusun@163.com
Tianjin Earthquake Agency , Tianjin 300201, China
Microservice; Earthquake information trigger; Big data; Earthquake information services; System performance
DOI: 10.13512/j.hndz.2025.04.15
地震科学作为一门基于观测的大数据科学,经过几十年的发展,已经积累了大量的地震观测、大地测量、地球物理、地球化学、地震工程和地震地质等观测数据。随着高精度、高密度、宽频带和大动态的全国地震监测预警网和地球物理观测基础设施建设,地震监测预报预警、探查区划评估、震后灾害快速评估等地震信息服务领域具有广阔的前景。随着天津市防震减灾服务平台建设工程(信息化建设部分)应用系统开发项目的顺利实施,天津市防震减灾大数据服务平台已经建设完成,平台的主要功能是通过制定数据标准、数据目录等规范标准,收集各部门地震数据,制定共享标准,形成有效、高效、高质量的数据交换共享,为地震信息服务领域的发展提供数据平台支撑。
本文研究微服务架构在地震信息服务领域的应用,设计基于微服务架构的地震信息触发器,以现有EQIM的底层数据库为基础,采用云原生技术和微服务架构实现地震速报信息的实时触发,为天津市防震减灾大数据服务平台提供数据源,为后续不同领域不同任务的研究提供数据触发支持。
全国地震速报信息共享服务系统(EQIM)是为配合《中国地震局中震发测[2004]30号文件》的执行而设计开发的软件,其最初目标是以互联网技术和设施为载体,实现省级测震台网与国家测震台网之间的地震速报信息的快速通报、汇集和共享服务,通过对这些数据信息的进一步分析处理,得到更加精确合理的结果,为防震减灾提供服务[1]。EQIM软件系统由EQIM服务器系统和EQIM客户端软件包组成。其中EQIM服务器系统包括数据库、数据传输服务程序和Web网站组成;EQIM客户端软件包由 EQIMProcess接收处理软件, EQIMSender速报信息发送软件, EQIM_SMS短信发送软件组成[2]。EQIM系统数据库采用Mysql4.0版本,客户端软件包使用Java语言开发,在长时间使用过程出现了软件适用性维护不足、不支持国产化替代、开发语言版本和数据库版本低导致诸多插件不兼容等一系列问题。
云原生是一种基于云计算的软件开发和部署方法论,其核心理念包括容器化、微服务架构、自动化管理、分布式结构、持续交付等几个方面。它强调将应用程序和服务设计为云环境下的原生应用,以容器、微服务、DevOps等技术为基础建立的一套云技术产品体系,相比传统的单体应用在安全性、容错性、可扩展性和运维等各方面都有巨大的领先优势。
微服务作为云原生的核心要素之一,所体现的是一种架构模式,其本质是把整体业务拆分成诸多有特定明确功能的服务,通过诸多分散的小服务之间的协调配合,去解决更大、更复杂的问题。如图1所示,微服务架构的设计思路不再是开发一个大的单体应用,而是将其分解为小的互相连接的微服务应用,每个微服务专注于单一具体的业务功能实现,服务之间通过REST API、事件流和消息代理组合彼此通信,每个服务都具有自己独立的生命周期和服务边界,可以独立部署、独立维护、独立扩展。与传统的面向服务的架构相比,微服务架构降低了系统的耦合性,提高了系统容错性、伸缩性和可扩展性,更易于迭代开发和业务扩展[3]。
图1 微服务架构模式Fig.1 Pattern of microservice architecture
近年来,微服务架构在防震减灾领域已经有了较广泛的应用。王坦、师宏波等[4]研究基于微服务架构的地震站网全流程一体化监控平台设计与实现,该平台采用Hadoop分布式处理方案,应用Spring Cloud框架搭建,进行Docker容器封装,以标准RESTful API作为服务接口的微服务架构,实现对地震台站运行的实时监测、高效运维和一体化管理。韩万江、陈淑文等[5]研究基于微服务架构的分布式灾情管理系统,该系统在分布式环境下利用Spring Cloud框架,通过业务划分,设计独立模块的微服务,同时加入熔断器、消息队列等组件,缓存处理数据。李兆隆、吕佳丽等[6]基于云南地震应急指挥技术软件系统现状与使用中发现的问题,设计了云环境下的云南地震应急指挥技术软件系统,经新旧系统对比分析结果表明,采用了微服务架构的新软件系统,在运算速度、资源使用效率、服务形式、运维难度等多方面均优于现用软件系统。
在地震速报信息方面,苏柱金、黄文辉[7]研究基于JOPENS系统的地震速报信息聚合与发布系统,该系统实时接收JOPENS系统产出的各种类型的地震速报信息,根据过滤策略进行分析处理,按照不同用户组的发布策略,分别以短信、电子邮件、传真和微博的方式自动对外发布。刘平仁、秦新春等[8]基于新疆地震信息互联网门户网站,使用网站脚本、EQIM地震信息共享平台数据库和软件编程技术,通过扫描和采集由新疆维吾尔自治区地震局测震台网中心测算的最新地震速报数据,实现在网站上自动发布新疆行政地区的震情速报信息。徐胜、王振威等[9]把EQIM速报信息共享服务系统、地震信息自动发布平台、发布子平台等实现一体化集成,实时获取各类地震速报结果、自动规范生成多种类型的地震信息,实现地震速报信息的规范、实时、多手段智能发布。张伟、刘爱华等[10]针对地震应急快速响应、高效处置的现实需求,设计开发了基于EQIM的地震应急指挥技术系统自动触发软件。该软件实现了与EQIM数据库的无缝对接,可自动监控最新地震事件。当达到地震应急响应条件时,系统自动触发启动地震灾害快速评估系统、视频会议系统、指挥调度系统、中央控制系统等关键应急业务系统[11-12]。
以上研究采用的都是单体应用,只能满足单一服务需求,对于系统集成的性能、可用性、可修改性和安全性等维度问题讨论的较少。随着地震业务逐渐有研究型向社会服务型演进,常规业务系统会面临上述维度的挑战。比如,在数据源获取的过程中,可能面临敏感信息的泄露、数据的窃取、恶意修改、重放攻击等网络安全问题;在提供数据推送服务时,可能会遇到终端业务用户接入过载,负载过高影响系统性能问题;或存在因病毒、爬虫的频繁恶意连接,造成系统崩溃问题。另一方面随着大数据和人工智能的发展,地震事件数据推送的下游需求需要定制化,现有系统是否可以做到用最小的修改代价来满足需求等问题。针对解决上述问题的考量,结合微服务架构的优势,设计并实现基于微服务架构的地震信息触发器系统,旨在提供稳定、可靠且可满足定制化需求的地震事件触发器。
基于微服务的地震信息触发器整体选用异步消息传递微服务风格,核心是Kafka消息队列。将数据采集、接入鉴权、统一身份认证、地震事件消息写入、WebSocket服务、Socket服务、过滤器、大数据地震信息写入等功能独立开发为单个微服务,通过RESTful API接口规范,将功能接口封装,微服务间通过RPC通信机制实现微服务间的协作。系统组合可以将单个服务独立部署,也可以两两采用边车模式组合,围绕Kafka消息队列,采用生产者消费者模式构建系统整体架构,以提高系统整体的灵活性和扩展性。系统整体架构如图2所示。
系统整体采用Kratos开源微服务框架,使用Go语言开发。服务网关选择Traefik+Ingress,为系统暴露对外服务的服务接口和提供负载均衡功能;通过ForwardAuth中间件,配合“大蚂蚁”第三方用户认证模块,完成外部访问请求的登录与鉴权;使用Consul为各微服务提供服务注册与发现功能;使用Jaeger链路追踪工具,监控各微服务间数据交互的健康状况,发生故障时,方便查出原因;使用MySQL数据库存储数据,使用Redis提供数据缓存。部署环境整体搭建在Kubernetes(K8S)+Docker建立的容器化集群上,由Ceph集群提供容器的数据持久化。同时,使用Harbor搭建了私有仓库,为服务部署提供镜像仓库。
由于EQIM系统适应维护更新工作相对欠缺,所使用的数据库MySQL依旧停留在4.0版本,导致高版本的组件连接较为困难,经测试,选用与EQIM相同开发环境的Java语言进行数据采集服务的开发。同时为了不影响原EQIM正常业务系统,减少轮询读取给数据库带来的压力,数据库数据采集选用二进制日志(binlog)同步方案。binlog是MySQL中比较重要的日志,记录了所有更新数据库的语句(如DDL和DML语句),并以二进制的形式保存在磁盘中。
在数据采集服务中开发守护进程,通过Debezium-connector-mysql组件连接数据库,通过实现Debezium提供的ChangeEventListener接口中的poll方法,来处理接收到的binlog事件,监听数据变化。数据更新被捕获后经规则过滤,获取有效地震触发事件,然后携带令牌将地震事件发送至接入鉴权服务。
图2 基于微服务架构的地震信息触发器系统架构图Fig.2 System architecture of earthquake information trigger based on microservice architecture
在数据源采集后接入服务的过程中,除需要考虑访问控制问题,还需要考虑数据不会被修改的数据完整性问题,敏感数据不会泄露的数据机密性问题和数据发送方发送行为的不可抵赖性问题。这些问题的解决可有效应对重放攻击、数据篡改和数据信息泄露等网络安全事件的发生,确保数据源事件的准确性和可靠性。
天津局目前使用的“大蚂蚁即时通讯系统”拥有完整的本单位用户信息,且可提供接口API调用,可实现相关功能的二次开发。有效利用即时通讯系统的用户数据,开发统一的用户认证接口功能,触发器系统的用户认证过程可通过该接口实现。因此,系统设计使用国密SM3和SM4算法结合上述身份认证API接口设计数据接入鉴权算法解决上述问题。
系统的鉴权过程分为3个步骤,分别为数据源申请注册、审批和验证。各个步骤的算法流程如图3~图5所示。
图3 数据源申请注册算法流程Fig.3 The algorithm flow for applying for registration of data sources
图4 审批算法流程Fig.4 The algorithm flow of approval
图5 客户端与服务端验证流程Fig.5 The algorithm flows for client and server verification respectively
关于存储的历史地震速报数据,系统需要提供用户查询功能或历史数据参与大数据计算功能。从EQIM系统的数据库中取出的地震速报数据,精度较高,相对信息比较敏感,数据共享需要降低精度进行脱敏处理,但是又有些场景需要高精度数据,比如地震监测科研人员或是大数据的内部计算,这就要求既需要有高精度数据,又需要有低精度数据。因此本系统设计数据脱敏算法来应对数据共享过程中的数据敏感性问题,数据脱敏工作主要包含了数据加密、信息隐藏、多版本保存机制等内容。为确保数据的安全性,系统采用异步消息传递架构风格,如图6所示。
图6 异步消息传递微服务架构模型Fig.6 Microservice architecture model for asynchronous message passing
微服务A作为消息数据的生成者,将接收到并且通验证的有效地震速报数据写入Kafka消息队列,微服务B作为消费者从Kafka消息队列中读取产生的消息,数据按照先入先出的原则,由kafka中的offset标定从队列的什么位置开始读取,每个消费者对象都有一个私有的offset标记所读取的位置,数据消费者之间读取互不影响。
本文实现了微服务架构在地震信息服务领域的初步应用,充分发挥云原生和微服务技术在系统架构设计方面的优势,开发了一套高可用、易扩展、安全性高、且自主可控的地震信息触发器系统。在系统开发过程中解决了数据采集、数据接入鉴权、用户身份认证和数据敏感性等几个关键问题。基于微服务架构的地震信息触发器的实现为相关业务系统提供了地震信息触发中间件,为后续不同领域不同任务的研究提供了大数据支持,促进了防震减灾领域的人工智能发展。