段洪杰,楊黎薇,段 然,劉瓊仙,崔建文
(1.云南省地震局,云南 昆明 650224;2.中國電信翼支付,上海 200000)
軟件框架是應用系統的核心骨架,其應用水平決定了應用系統開發的質量(周曉翠等,2016;周偉良,2012;袁帥,2017)。
國際上,開發者們正嘗試將各種軟件框架與不同新的編程思想相互融合,從而產出許多著名的編程思想及軟件框架。很多著名的開源框架正在快速升級完善,有的框架已經連續開發了十多年,水平和層次步步提高,如Spring,Hibernate,EJB,SOAP,Open Stack,Struts等。而在國內,大部分軟件開發人員不愿投入精力去自主研發軟件框架,而是直接使用國外開發的開源框架,將其應用到系統的開發工作中,軟件框架的自主研發水平與世界水平的距離逐漸拉大。國內技術論壇上存在部分框架程序的代碼片段,但多數為娛樂性質,實用性不大。少數的軟件科技公司擁有自己開發并可以應用的PHP框架,但是設計有短板。例如不同功能模塊的HTTP上POST和GET的入口點只有同一個page、把程序不相關邏輯的模塊捆綁一體、編程的可視化效果很差等。國內地震行業中軟件框架存在兩種情況:一是簡單的地球物理算法小程序編程,無需運用軟件工程技術、軟件版本控制、設計模式理念以及考慮軟件框架;二是規模較大的地震應用系統,但這些系統仍然依托于國外流行的軟件框架開發。
本文分析了缺乏自主框架技術造成的危害,并借鑒國外地震系統的設計思想及設計模式,自主研發了軟件框架,并對自主研發框架的使用情況進行了總結。
在開發地震應用系統的過程中,國外開源的軟件框架得到了豐富的應用,也取得了很多成果。但沒有基本框架的自主研發,會產生一系列嚴重的問題:①存在隱性風險。國內有很多開發系統,例如單位保密系統、電子政務系統(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
注:表中數據來源于:https://cwiki.apache.org/confluence/display/WW/Security+Bulletins(Apache Struts網站).
國外開源軟件框架曾多次因安全漏洞問題在中國導致大規模的網絡安全事件。如數量眾多的服務操作系統被破壞或被植入特洛伊木馬,大量重要的敏感數據外泄(呂志泉,賈子驍,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)
注:表中數據來源于:http://www.cnvd.org.cn/sheepWall/list(國家信息安全漏洞共享平臺網站).
地震應用系統在地震后要及時處理地震數據,承擔著重大的社會責任,出現安全漏洞、不穩定、系統崩潰等問題會造成不可挽回的損失。使用國外的開源軟件框架,會嚴重影響系統的穩定性(王懷,2018)。因此,開發具有自主研發的軟件框架,是非常重要和迫切的任務。
筆者分析了國內一些地震應用系統使用軟件框架的情況,見表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選擇的相關選擇的信息),并生成HDF5格式的shake-data.hdf文件;③該文件被注入到消息傳遞系統中,生成各種周期的波譜和特定位置的地面震動信息,再通過網絡服務請求任何必需的震動圖圖件數據,然后通過shake模塊,由shake-result.hdf渲染繪制出震動圖圖件,通過消息傳遞系統或其他手段將其傳送到網站;④網站程序自動為該地震事件創建“頁面”,震動圖件在網站的緩存中緩沖,以提高網站響應速度和圖片的顯示速度。ShakeMap4.0框架增加了穩定性,減少了數據在模塊之間交互的復雜程度,具體如圖1所示。

表3 地震應用系統開發中使用的國外軟件框架Tab.3 Foreign software frameworks used in the development of seismic application systems

圖1 美國聯邦地質調查局(USGS)ShakeMap4.0軟件框架Fig.1 Software framework of USGS ShakeMap 4.0
亥姆霍茲中心波茨坦,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 Geosciences
SeisComP3可將關鍵功能作為獨立模塊實施,以保證與其他功能的獨立性(例如選擇器,量級計算,交互式分析);輕松實現自定義模塊,強化了硬件和軟件的獨立性;具備在不同的自動實時系統之間進行數據交換的能力(分布式分發模塊);提高了地震發生時系統運行速度,并增加了系統的可靠性。
綜上所述,國外的地震應用系統主要針對地震業務的應用特點自己設計框架,以消息控制器軟件模塊為主線,精練、高效。國內的地震應用系統主要依賴于國外的開源軟件框架,缺乏自主研發。在軟件框架自主研發方面,國外地震行業遠遠地走在了國內地震行業的前面。
國際上的計算機專家重視制定各種軟件開發標準,成立了一些計算機開發的標準委員會。各種軟件框架主要是實現其制定的最新軟件標準,現實中,性能、易用性、兼容性等是放在第二位的。隨著軟件標準的快速更新,其軟件框架也不斷快速更新。由于軟件標準的前后差異,造成軟件框架功能龐雜、不穩定、有些脫離實際應用。因此要自主研發軟件框架,除了要吸收國際上通用的軟件框架和國際上地震行業軟件框架的優點外,還要以實用為目標。筆者在計算機語言的選擇上考慮了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分別取到地震參數和強震數據,通過地震消息將數據傳到各個Action中,步調一致協同工作)。每個Action又將工作分解為MVC模式,數據放在模型(M)中,通過運算流程(C)控制,如果Action有視圖(V)的話調用視圖層。在Action下增加一層業務邏輯層,專門用于存放數據計算處理的程序代碼。業務邏輯層之下再加一個數據庫接口層(孟晨等2012),專門用于程序與數據庫的聯結以及數據入庫、出庫等。數據緩沖接到數據庫接口中,用于提升數據庫查詢性能;網頁緩沖接入到MVC的視圖(V)層,用于增加網頁的打開速度;內存緩沖可以在軟件框架的任何地方調用,用于緩沖任何開發人員需要緩沖的數據。數據攔截模為一個自動化模塊,在視圖層數據轉入轉出Action層,Action層數據轉入轉出業務邏輯層,業務邏輯層數據轉入轉出數據庫接口層時,成批處理數據賦值,大幅提高開發效率(比如模型數據,不需要一一賦值每個數據屬性,只需要指定到模型即可)。另外,實現了SSO跨域的分布式單點登錄,便于將多個應用系統的用戶整合在一起(汪禺,2017)。該自主設計的軟件框架的通用性、靈活性好,便于系統維護、升級和擴展,能運行于UNIX系列的多種操作系統上(圖3)。

表4 基于自主研發的軟件框架PSimple,JSimple的主要框架模塊Tab.4 Framework modules of PSimple and JSimple based on independent development

圖3 自主研發的PSimple和JSimple軟件框架Fig.3 Self-developed PSimple and JSimple software framework
為了強化自主設計的軟件框架的安全性能,筆者專門設計了安全策略。自動進行入侵檢測,實現方法是獲取Linux操作系統的進程信息,自動定時做快照和比對。發現有變化時給出警示,幫助用戶及時發現和排除特洛伊木馬(后門程序)。國外的軟件框架需要兼容全球不同國家的文字編碼,要在軟件模塊間傳遞特殊字符,容易形成unicode編碼漏洞和數據庫SQL注入漏洞。自主設計的軟件框架使用數據字典的設計方式,簡化了軟件模塊之間復雜的信息傳遞。外界程序交互界面(Web等)與軟件模塊之間只允許傳遞阿拉伯數字和26個英文字母信息(包括數據字典的ID),其它字符全部過濾掉,完全杜絕了unicode編碼漏洞和數據庫SQL注入漏洞。用自主軟件框架開發出的應用系統,要求以獨立的用戶身份運行,進行權限安全隔離(否則給出警示),避免了權限提升漏洞,防止黑客獲得ROOT權限等。
早期的云南強震臺網中心的烈度速報系統使用國外流行的開源軟件框架開發,主要由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)。
地震是突發事件,在沒發生地震時地震應用系統的運算量較小,而當發生地震后地震應用系統的數據計算量可能呈指數增長,因此要防止地震應用系統在關鍵時刻停止工作或崩潰。筆者對用自主研發軟件框架開發的地震應用系統進行了長達一年多的性能優化和測試,模擬對地震應用系統進行DDOS分布式攻擊(王飛,2013)。方法是從數臺服務器上,使用壓力測試工具,遠程對應用系統進行攻擊。隨著攻擊強度的不斷增強,不斷強化軟件框架性能、應用系統性能和優化運行環境,具體操作如下:一是對軟件框架內部的優化。使用數據庫聯結池(JSimple框架),使用數據庫長聯結(PSimple框架)。增大緩沖內存,改進緩沖數據獲取算法、存貯算法;二是對Java虛擬機、Web服務的優化(王曉亮,2017),優化Xmx和Xms等內存(JSimple框架),把Apache服務改為Nginx(PSimple框架)(黃靜,李炳,2016);三是對Linux操作系統的底層參數進行優化,包括最大打開文件數,TCP/IP聯結數等,最后關閉Linux的OOM,以避免Linux操作系統承受不住內存壓力而殺掉地震應用系統的進程。經過這一系列的優化后,用JSimple框架和PSimple框架開發的地震應用系統性能優異。實測結果表明:同時可以承受3 500個以上的TCP/IP聯結,響應快速,內存釋放速度快,已經達到了目前國內專業網站系統的高流量的優異性能,如圖8所示。

圖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

圖8 基于自主研發的軟件框架的性能優化Fig.8 Performance optimization based on self-developed software framework
本文分析了國內軟件開發缺乏自主研發的問題與危害。在研究國際上通用著名框架和地震應用系統框架的基礎上,吸收其優點開發了自主研發的軟件框架。在框架的設計上始終堅持不過度設計,把復雜的事件做簡單的原則,框架具有靈活性、高效性,簡單易用性等,在地震應用系統的開發上取得了良好的效果。同時,對軟件框架做了深入的優化、測試與研究,取得了優異的性能,達到了開發高性能、高容量的(地震)應用系統的目標。此外,該框架具有較好的通用性,可廣泛應用于各種行業。該框架的CRUD開源模塊按照PGL許可證協議,在全球性網站github.com提供免費下載。當然,一個成熟的軟件框架,需要幾十年的升級維護,才會越來越成熟,未來依然任重道遠。