基金项目:国家自然科学基金(51578514)资助.
(1.云南省地震局,云南 昆明 650224; 2.中国电信翼支付,上海 200000)
(1.Yunnan Earthquake Agency,Kunming 650224,Yunnan,China)(2.China Telecom Bestpay,Shanghai 200000,China)
备注
基金项目:国家自然科学基金(51578514)资助.
介绍了国内开发的软件由于缺乏自主框架技术导致的问题和危害,强调自主设计和开发软件框架的重要性。在结合国际上流行的通用软件框架设计思路的基础上,分析了世界先进的地震系统的软件框架结构,开发了一套自主设计的软件框架,实现了Message + MVC + CACHE + SSO + DAO设计模式。对框架进行了深层次的优化,运行性能优异。
This paper introduces the problems and harms caused by the lack of self-developed software framework for domestically developed softwares.In view of the growing gap between the domestic software framework level and the international level,independent design and development of software frameworks is a top priority.Based on the international popular general software framework design ideas,this paper analyzes the software framework of the world's advanced seismic system and develops a self-designed software framework.With the simple,practical and efficient development concept,the Message + MVC + CACHE + SSO + DAO design pattern is realized.The framework has been deeply optimized and has excellent running performance.
引言
软件框架是应用系统的核心骨架,其应用水平决定了应用系统开发的质量(周晓翠等,2016; 周伟良,2012; 袁帅,2017)。
国际上,开发者们正尝试将各种软件框架与不同新的编程思想相互融合,从而产出许多著名的编程思想及软件框架。很多著名的开源框架正在快速升级完善,有的框架已经连续开发了十多年,水平和层次步步提高,如Spring,Hibernate,EJB,SOAP,Open Stack,Struts等。而在国内,大部分软件开发人员不愿投入精力去自主研发软件框架,而是直接使用国外开发的开源框架,将其应用到系统的开发工作中,软件框架的自主研发水平与世界水平的距离逐渐拉大。国内技术论坛上存在部分框架程序的代码片段,但多数为娱乐性质,实用性不大。少数的软件科技公司拥有自己开发并可以应用的PHP框架,但是设计有短板。例如不同功能模块的HTTP上POST和GET的入口点只有同一个page、把程序不相关逻辑的模块捆绑一体、编程的可视化效果很差等。国内地震行业中软件框架存在两种情况:一是简单的地球物理算法小程序编程,无需运用软件工程技术、软件版本控制、设计模式理念以及考虑软件框架; 二是规模较大的地震应用系统,但这些系统仍然依托于国外流行的软件框架开发。
本文分析了缺乏自主框架技术造成的危害,并借鉴国外地震系统的设计思想及设计模式,自主研发了软件框架,并对自主研发框架的使用情况进行了总结。
1 现有软件研发存在的问题
在开发地震应用系统的过程中,国外开源的软件框架得到了丰富的应用,也取得了很多成果。但没有基本框架的自主研发,会产生一系列严重的问题:①存在隐性风险。国内有很多开发系统,例如单位保密系统、电子政务系统(OA)等(魏玉娇,2017; 高峻,2014; 杨璇,2009),就是采用国外开源的框架,如果该框架隐匿了难以发现的后门漏洞,就有信息泄漏的风险,一旦发生国际纠纷,国外框架构建者就可远程入侵或破坏(沈逸,2013; 赵衍,2011); ②受制于人,存在使用局限性。就要遵守相应限制规则,不仅软件框架的开发费用会增多,应用价值也会大大缩小。如果使用许可证带有政治因素(开源社区的软件框架会受到美国的出口管制等),还容易引起法律风险。③国外的软件框架的开发者若停止升级,会导致发现重大漏洞后无法挽救,将建立在该框架上的应用系统置于不安全非稳定状态,甚至突然崩溃。例如由于开发者在2010年停止升级WebWork2框架,致使使用该框架开发的各种应用系统面临无补丁可打的难题(何华,2006)。④世界上流行的软件框架并不是针对地震应用系统去开发设计的。框架没有专属功能,就需要多种框架融合并行,将造成软件框架庞大、功能重复、运行效率低等问题(杨万里,2016),并且需要开发人员长时间的学习磨合才能熟练掌握。例如Struts为MVC模式(唐琳,2014),但Spring带有自身的MVC(薛峰等,2012); Hibernate是数据库通用接口层的实现(克里斯蒂安,2016),但Spring也有自己的数据库接口层; Spring自身的数据库接口功能又弱于Hibernate; 而Spring的AOP和IOC功能强大,又是开发应用系统的利器(翟剑锟,2013)。将Struts,Spring,Hibernate组合在一起使用非常有益,但是也产生了大量的冗余(林志灿,2018; 张志锋,2013; 范新灿,2014)。⑤将不同类型的软件框架强行捆绑,无法深入各框架的内核衔接。这在性能、安全和稳定性方面均是隐患。例如,Struts2软件框架就出现了很多安全漏洞,而且多数都是高危、紧急的重大安全漏洞,详见表1。
表1 2017—2018年3月Struts2框架的安全漏洞列表
Tab.1 Security hole list of Strusts2 framewrok from 2017 to March 2018国外开源软件框架曾多次因安全漏洞问题在中国导致大规模的网络安全事件。如数量众多的服务操作系统被破坏或被植入特洛伊木马,大量重要的敏感数据外泄(吕志泉,贾子骁,2018)等。其中,大学、科研所、金融、保险等行业网站属于重灾区。“国家信息安全漏洞共享平台网站”的“绵羊墙”公开查询的资料显示:在没有出现大规模网络安全事件的平静期,仅2018年4月20日一天,国内就有不少运用系统或网站被入侵。可见应用系统的安全是一个严峻的问题,详见表2。
表2 2018年4月20日公布在“绵羊墙”的被黑客入侵的应用系统(公开来源)
Tab.2 The hacked application system released on Sheep Wall on April 20,2018(From public websites)地震应用系统在地震后要及时处理地震数据,承担着重大的社会责任,出现安全漏洞、不稳定、系统崩溃等问题会造成不可挽回的损失。使用国外的开源软件框架,会严重影响系统的稳定性(王怀,2018)。因此,开发具有自主研发的软件框架,是非常重要和迫切的任务。
2 国内外状况
笔者分析了国内一些地震应用系统使用软件框架的情况,见表3。将多种软件框架整合到一起,不但会使应用系统变得更加复杂,还对开发人员的专业能力有较高的要求。例如云南强震台网烈度速报系统使用的Struts + Spring + Hibernate的流行开源框架的组合(段洪杰等,2009),需要配置一个管理Session会话的Servlet程序OpenSessionInViewFilter,以便启动服务时加载,还要配置ContextLoaderListener监听等。
国际上地震行业的应用系统主要使用自主开发的软件框架,对第三方开源软件的依赖较少。美国地质调查局(USGS)开发的ShakeMap 是一个震动图生成软件,在世界上得到了广泛的运用。ShakeMap可绘制地震后仪器烈度的分布和严重程度,可以衡量受地震影响区域的范围,确定哪些区域可能受到最大破坏,这些信息对地震救援的快速评估损失有重要意义。新版的ShakeMap4.0使用python语言开发,使用自主设计的框架,减少了对开源框架的依赖,不再使用ShakeMap3.5以前版本使用的开源框架LWP,DBD(Perl语言)等。ShakeMap4.0的软件框架的结构和作用是:①数据准备、处理和渲染都在不同的计算单元中进行; ②处理序列在识别地震并决定产生震动图时,通过震动组合模块收集关于地震事件(起源和破裂参数,地震数据等)的可用信息,以及ShakeMap4.0的配置信息(其中包括关于事件的地震构造模型和关于GMPE选择
表3 地震应用系统开发中使用的国外软件框架
Tab.3 Foreign software frameworks used in the development of seismic application systems的相关选择的信息),并生成HDF5格式的shake-data.hdf文件; ③该文件被注入到消息传递系统中,生成各种周期的波谱和特定位置的地面震动信息,再通过网络服务请求任何必需的震动图图件数据,然后通过shake模块,由shake-result.hdf渲染绘制出震动图图件,通过消息传递系统或其他手段将其传送到网站; ④网站程序自动为该地震事件创建“页面”,震动图件在网站的缓存中缓冲,以提高网站响应速度和图片的显示速度。ShakeMap4.0框架增加了稳定性,减少了数据在模块之间交互的复杂程度,具体如图1所示。
亥姆霍兹中心波茨坦,GFZ德国地球科学研究中心开发的SeisComP应用系统,是全球运用最广泛的通过互联网进行地震数据采集和实时数据交换的地震应用系统,其数据传输网络协议SeedLink成为了事实上的世界标准。SeisComP被设计为高标准的全自动数据采集和(近)实时数据处理工具,包括质量控制、事件检测和位置以及事件警报的传播,并在此基础上实现了德国印度洋海啸预警系统。SeisComP3使用自己的软件框架,即SeisComP3软件框架,由C语言开发,其软件框架的结构和作用是:由一组独立的应用程序组成,每个应用程序执行一项离散任务,应用程序之间的通信通过基于TCP / IP的消息传递系统来实现。该消息系统基于工具包Spread(开源),可在本地和广域网上提供高性能消息服务。在Spread的顶部,通过scmaster负责处理非原生由Spread提供的其他SeisComP3需求。使用消息传递交换元数据(例如拣选)和配置信息,实现系统各个模块的协作,如图2所示。
图2 亥姆霍兹中心波茨坦,GFZ德国地球科学研究中心开发的SeisComP3软件框架
Fig.2 SeisComP3 software framework of Helmholtz Centre Potsdam,GFZ German Research Centre for GeosciencesSeisComP3可将关键功能作为独立模块实施,以保证与其他功能的独立性(例如选择器,量级计算,交互式分析); 轻松实现自定义模块,强化了硬件和软件的独立性; 具备在不同的自动实时系统之间进行数据交换的能力(分布式分发模块); 提高了地震发生时系统运行速度,并增加了系统的可靠性。
综上所述,国外的地震应用系统主要针对地震业务的应用特点自己设计框架,以消息控制器软件模块为主线,精练、高效。国内的地震应用系统主要依赖于国外的开源软件框架,缺乏自主研发。在软件框架自主研发方面,国外地震行业远远地走在了国内地震行业的前面。
3 设计和实现
国际上的计算机专家重视制定各种软件开发标准,成立了一些计算机开发的标准委员会。各种软件框架主要是实现其制定的最新软件标准,现实中,性能、易用性、兼容性等是放在第二位的。随着软件标准的快速更新,其软件框架也不断快速更新。由于软件标准的前后差异,造成软件框架功能庞杂、不稳定、有些脱离实际应用。因此要自主研发软件框架,除了要吸收国际上通用的软件框架和国际上地震行业软件框架的优点外,还要以实用为目标。笔者在计算机语言的选择上考虑了python,Java,PHP三种编程语言:①Python语法简洁清晰,具有丰富和强大的库,能够把用其他语言制作的各种模块轻松地联结在一起,但考虑到Python各个版本之间的兼容性太差,未来升级Python版本时可能需要对已经开发完成的软件框架进行修改,因此放弃Python。 ②Java曾经用于开发云南强震台网烈度速报系统,在开发过程中发现Java操作系统底层的能力太弱。③为了增加系统底层控制能力,不得不另外使用PHP语言开发系统底层。形成两种计算机语言的底层混合编程,增加了复杂性。笔者根据不同的应用场景,开发了2个自主设计框架的版本:一个是PHP版,专门用于需要对操作系统底层进行操作控制的应用系统的开发(在Linux系统下,可以方便使用C Shell、管道命令等); 另一个是Java版,用于不需要对操作系统底层进行操作控制,需要增强网络通信能力的应用系统的开发。
设计自主的软件框架时需考虑3点:一是尽量避免使用现有的流行国外软件框架作为基础框架,这样才能拥有框架的自主性; 二是使用消息做主线控制器模块,以便适应地震业务的特点; 三是软件框架要有通用性,除了应用于地震系统外,还要可以运用于不同行业的应用系统开发。所以笔者自主设计开发了:面向方面编程的安全策略模块Check,实现MVC(Action)设计模式的软件模块、Message消息主线控制器、Service业务逻辑层、DAO数据库访问模块、Cache缓冲模块。本软件框架以实用为出发点,简单、高效、优雅。PHP版命名为PSimple框架,而Java版命名为JSimple框架,两个版本的框架结构基本相同,软件框架的模块(包),见表4。
PSimple 和JSimple 框架的结构和作用是:在系统启动后调用init模块进行初始化。JSimple框架的初始化放在Servlet或构造函数中,PSimple框架的初始化放在构造方法中。初始化时开辟3个缓冲区,分别是内存缓冲、数据缓冲、网页缓冲,并启动消息传递控制器(地震消息)处于待命状态。各个MVC模块的Action都可以与地震消息通信,实现了各个Action的协同工作(地震发生后,监测地震信息服务器的2个Action分别取到地震参数和强震数据,通过地震消息将数据传到各个
表4 基于自主研发的软件框架PSimple,JSimple的主要框架模块
Tab.4 Framework modules of PSimple and JSimple based on independent developmentAction中,步调一致协同工作)。每个Action又将工作分解为MVC模式,数据放在模型(M)中,通过运算流程(C)控制,如果Action有视图(V)的话调用视图层。在Action下增加一层业务逻辑层,专门用于存放数据计算处理的程序代码。业务逻辑层之下再加一个数据库接口层(孟晨等2012),专门用于程序与数据库的联结以及数据入库、出库等。数据缓冲接到数据库接口中,用于提升数据库查询性能; 网页缓冲接入到MVC的视图(V)层,用于增加网页的打开速度; 内存缓冲可以在软件框架的任何地方调用,用于缓冲任何开发人员需要缓冲的数据。数据拦截模为一个自动化模块,在视图层数据转入转出Action层,Action层数据转入转出业务逻辑层,业务逻辑层数据转入转出数据库接口层时,成批处理数据赋值,大幅提高开发效率(比如模型数据,不需要一一赋值每个数据属性,只需要指定到模型即可)。另外,实现了SSO跨域的分布式单点登录,便于将多个应用系统的用户整合在一起(汪禺,2017)。该自主设计的软件框架的通用性、灵活性好,便于系统维护、升级和扩展,能运行于UNIX系列的多种操作系统上(图3)。
为了强化自主设计的软件框架的安全性能,笔者专门设计了安全策略。自动进行入侵检测,实现方法是获取Linux操作系统的进程信息,自动定时做快照和比对。发现有变化时给出警示,帮助用户及时发现和排除特洛伊木马(后门程序)。国外的软件框架需要兼容全球不同国家的文字编码,要在软件模块间传递特殊字符,容易形成unicode编码漏洞和数据库SQL注入漏洞。自主设计的软件框架使用数据字典的设计方式,简化了软件模块之间复杂的信息传递。外界程序交互界面(Web等)与软件模块之间只允许传递阿拉伯数字和26个英文字母信息(包括数据字典的ID),其它字符全部过滤掉,完全杜绝了unicode编码漏洞和数据库SQL注入漏洞。用自主软件框架开发出的应用系统,要求以独立的用户身份运行,进行权限安全隔离(否则给出警示),避免了权限提升漏洞,防止黑客获得ROOT权限等。
4 应用和优化
4.1 自主框架的应用早期的云南强震台网中心的烈度速报系统使用国外流行的开源软件框架开发,主要由3个自行研发的分布式系统共同组成,并且使用了ShakeMap3.5的部分软件模块进行渲染制图。通过分布式系统协同工作,实现了云南烈度速报发布的全自动化。由于没有掌握国外软件框架的设计技术,烈度速报系统在运行过程中存在国外软件框架的常见的问题和安全隐患,为系统的维护工作带来了麻烦。因此,笔者使用自主研发的软件框架PSimple和JSimple对烈度速报系统进行了升级。主要升级了3个自主研发的分布式系统(图4):一是PHP控制中心子系统(PSimple框架)。系统启动后驻留在内存中,(近)实时检查云南强震台网是不是收到新的强震数据,如果发现有新的强震数据,自动解码,将数据存入数据库; 二是地震自动响应子系统(JSimple框架)。系统启动后驻留在内存中,(近)时实检查是否有地震速报信息,如果有地震发生,通过系统自动组建虚拟强震台站网络,获取PHP控制中心子系统解码后的强震台站数据,计算出烈度数据后自动调用烈度图制图子系统的部分软件模块进行渲染制图; 三是HTML视觉发布网站系统(JSimple框架)。如果地震自动响应子系统产生震动图,则自动将震动图传到HTML视觉发布网站上,自动显示出来(图4)。从图4可以看出:PHP控制中心、地震自动响应和HTML视觉发布3个子系统虽然实现的是不同的功能,但都具有基本相同的软件框架结构,其中地震自动响应子系统驻留内存运行,没有与用户交互的可视化界面,所以MVC模型只使用了MC模式。
图4 基于自主研发的软件框架的烈度速报系统构架图
Fig.4 Architecture diagram of the intensity report system of software framework based on independent development用自主研发的软件框架升级后,减少了大量的冗余运算代码,构架系统简洁、运行稳定。且框架安全性较好,没有发现有黑客成功入侵的痕迹。同时,对汉化(震动图图件)等底层的开发工作有较好的帮助,有利于将软件复杂性隐藏在框架底层(例如在框架内部对汉字进行硬编码等),提高了源程序代码可读性、便于维护性能。烈度速报系统升级后应用效果良好,能够在地震发生后的20 min内自动产出地震仪器烈度图,及时将地震仪器烈度图提交给应急救灾相关部门。例如:2017年3月27日云南漾濞5.1级地震的地震仪器烈度图的震中烈度与云南省地震局现场调查发布的震中烈度一致(VI度)(图5),且局部场地效应明显,对应急救灾有较好的参考价值。
图5 2017年3月27日云南漾濞5.1级地震仪器烈度图
Fig.5 Instrumental intensity diagram for the Yunnan Yangbi M5.1 earthquake occurred on March 27,2017烈度速报系统是一个全自动系统,由实际地震的信息触发,自动产出震动图。为了适应地震演练等需要,工作人员与烈度速报信息交互的新情况,笔者用自主研发的软件框架开发了新的系统firstShake(JSimple框架),该系统实现了烈度速报系统的人机交互界面,可以通过系统界面对地震参数等数据进行设置,有利于将其它方式算出的有价值的地震模型参数加入到全自动烈度速报系统中。在2018年4月19日的大理洱源的地震演练中,通过自行研发的firstShake系统交互界面产出了加速度峰值预测图和地震烈度预测图。录入地震参数后的5 min内生成PS打印机格式的图形。在没有实际强震台站收到可用数据的情况下,使用了Wald(2017)和Worden等(2010)提出的通过地形坡度计算剪切波速分布,再计算得到近似场地放大效应(VS30)。所得到的加速度峰值预测图和地震烈度预测图的局部场地效应效果明显,应用效果好(图6,7)。
4.2 自主框架和环境的优化地震是突发事件,在没发生地震时地震应用系统的运算量较小,而当发生地震后地震应用系统的数据计算量可能呈指数增长,因此要防止地震应用系统在关键时刻停止工作或崩溃。笔者对用自主研发软件框架开发的地震应用系统进行了长达一年多的性能优化和测试,模拟对地震应用系统进行DDOS分布式攻击(王飞,2013)。方法是从数台服务器上,使用压力测试工具,远程对应用系统进行攻击。随着攻击强度的不断增强,不断强化软件框架性能、应用系统性能和优化运行环境,具体操作如下:一是对软件框架内部的优化。使用数据库联结池(JSimple框架),使用数据库长联结(PSimple框架)。增大缓冲内存,改进缓冲数据获取算法、存贮算法; 二是对Java虚拟机、Web服务的优化(王晓亮,2017),优化Xmx和Xms等内存(JSimple框架),把Apache服务改为Nginx(PSimple框架)(黄静,
图6 在2018年4月19日的大理洱源的地震演练时产出的加速度峰值预测图
Fig.6 Prediction of peak ground acceleration for earthquake drills in Eryuan,Dali on April 19,2018图7 在2018年4月19日的大理洱源的地震演练时产出的地震仪器烈度预测图
Fig.7 Prediction of seismic instrument intensity for earthquake drills in Eryuan,Dali,April 19,2018李炳,2016); 三是对Linux操作系统的底层参数进行优化,包括最大打开文件数,TCP/IP联结数等,最后关闭Linux的OOM,以避免Linux操作系统承受不住内存压力而杀掉地震应用系统的进程。经过这一系列的优化后,用JSimple框架和PSimple框架开发的地震应用系统性能优异。实测结果表明:同时可以承受3 500个以上的TCP/IP联结,响应快速,内存释放速度快,已经达到了目前国内专业网站系统的高流量的优异性能,如图8所示。
5 结论
本文分析了国内软件开发缺乏自主研发的问题与危害。在研究国际上通用著名框架和地震应用系统框架的基础上,吸收其优点开发了自主研发的软件框架。在框架的设计上始终坚持不过度设计,把复杂的事件做简单的原则,框架具有灵活性、高效性,简单易用性等,在地震应用系统的开发上取得了良好的效果。同时,对软件框架做了深入的优化、测试与研究,取得了优异的性能,达到了开发高性能、高容量的(地震)应用系统的目标。此外,该框架具有较好的通用性,可广泛应用于各种行业。该框架的CRUD开源模块按照PGL许可证协议,在全球性网站github.com提供免费下载。当然,一个成熟的软件框架,需要几十年的升级维护,才会越来越成熟,未来依然任重道远。
- 段洪杰,崔建文,周挚,等.2009.ShakeMap二次开发与软件集成研究[J].地震研究,32(4):420-425.
- 范新灿.2014.基于Struts、Hibernate、Spring架构的Web应用开发[M].北京:电子工业出版社.
- 高峻.2014.凤城市政府电子政务系统的设计与实现[D].成都:电子科技大学.
- 何华.2006.基于WebWork2框架的集团公司资产运行监管系统的设计与实现[D].上海:华东师范大学.
- 黄静,李炳.2016.基于Nginx的Web服务器性能优化研究[D].杭州:浙江理工大学信息学院.
- 克里斯蒂安.2016.Hibernate实战[M].北京:清华大学出版社.
- 林志灿.2018.Struts与Hibernate框架下在线考试系统的设计与实现[J].信息技术与信息化,(1):79-83.
- 吕志泉,贾子骁.2018.2017年12月网络安全监测数据发布[J].信息网络安全,(2):95-96.
- 孟晨,赵春亮,张建国.2012.泛型DAO模式在Java Web开发中的应用[J].计算机应用与软件,29(1):175-177.
- 沈逸.2013.美国国家网络安全战略的演进及实践[J].美国研究,(3):30-50.
- 唐琳.2014.Struts2企业开发实践教程[M].北京:清华大学出版社.
- 汪禺.2017.基于SSO单点登录的教育信息化平台的设计与开发[D].北京:中国地质大学.
- 王飞.2013.分布式拒绝服务攻击检测与响应技术研究[D].长沙:国防科学技术大学.
- 王怀.2018.安全漏洞检测技术在计算机软件中的应用研究[J].信息与电脑(理论版),(2):190-191.
- 王晓亮.2017.JAVA虚拟机内存使用优化研究与应用[J].价值工程,36(21):221-222.
- 魏玉娇.2017.基于J2EE的电子政务行政审批系统设计与实现[D].青岛:青岛大学.
- 薛峰,梁锋,徐书勋,等.2012.基于Spring MVC框架的Web研究与应用[J].合肥工业大学学报(自然科学版),35(3):337-340.
- 杨万里.2016.多软件框架融合下的软件分层方法研究及应用[D].西安:西安理工大学.
- 杨璇.2009.基于Struts框架下的电子政务研究与实现[D].济南:山东大学.
- 袁帅.2017.计算机软件工程管理现状及开发应用[J].电子技术与软件工程,(23):46.
- 翟剑锟.2013.Spring框架技术分析及应用研究[D].北京:中国科学院大学.
- 张志锋.2013.Web框架技术(Struts2+Hibernate3+Spring3)教程[M].北京:清华大学出版社.
- 赵衍.2011.国家信息安全战略中的互联网因素[D].上海:上海外国语大学.
- 周伟良.2012.软件开发过程质量与产品质量度量方法研究[D].合肥:合肥工业大学
- 周晓翠,王辉,董宗祥,等.2016.基于CMMI的软件开发模型应用研究[J].软件导刊,15(1):76-78.
- Wald D J.2017.Computing spatial correlation of ground motion intensities for ShakeMap Sarah Verros[J].Computers and Geosciences,99:145-154.
- Worden C B,Wald D J,Allen T I,et al.2010.A Revised Ground-Motion and Intensity Interpolation Scheme for ShakeMap[J].Bulletin of the Seismological Society of America,100(6):3083-3096.