魏東平,李奉娟,苑志朋
(中國(guó)石油大學(xué)(華東)計(jì)算機(jī)與通信工程學(xué)院,青島 266580)
基于OSGI分層動(dòng)態(tài)的軟件設(shè)計(jì)與開(kāi)發(fā)①
魏東平,李奉娟,苑志朋
(中國(guó)石油大學(xué)(華東)計(jì)算機(jī)與通信工程學(xué)院,青島 266580)
在傳統(tǒng)的java框架下開(kāi)發(fā)的應(yīng)用軟件系統(tǒng)缺乏模塊化、動(dòng)態(tài)化的管理能力.在深入研究OSGI框架的基礎(chǔ)上,本文在井下作業(yè)管理系統(tǒng)的開(kāi)發(fā)過(guò)程中,采用OSGI規(guī)范與分層解耦思想結(jié)合的方法,設(shè)計(jì)了系統(tǒng)的總體架構(gòu),并解決了系統(tǒng)動(dòng)態(tài)管理與服務(wù)層的問(wèn)題.本文在井下作業(yè)管理系統(tǒng)的開(kāi)發(fā)中,詳細(xì)闡述了OSGI在系統(tǒng)中的應(yīng)用,包括OSGI擴(kuò)展點(diǎn)機(jī)制以及AOP思想等,提高了系統(tǒng)擴(kuò)展能力與解決了數(shù)據(jù)同步更新的問(wèn)題.軟件測(cè)試結(jié)果表明,該模型提高系統(tǒng)的性能,降低了系統(tǒng)各模塊之間的耦合性,實(shí)現(xiàn)了模塊的動(dòng)態(tài)管理,增加了各組件的重用性與可擴(kuò)展性,也提高了系統(tǒng)的穩(wěn)定性.
OSGI;模塊化;動(dòng)態(tài)管理;井下作業(yè)管理系統(tǒng)
隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,軟件開(kāi)發(fā)技術(shù)實(shí)現(xiàn)了由面向過(guò)程向面向?qū)ο蟮霓D(zhuǎn)變,形成了企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)模式.特別是在 Java EE 開(kāi)發(fā)領(lǐng)域,MVC(Model View Controller)開(kāi)發(fā)模式、SSH框架以及EJB(Enterprise JavaBean)等都已經(jīng)比較成熟.但是,基于這些技術(shù)開(kāi)發(fā)的應(yīng)用程序,各個(gè)模塊之間是緊耦合的,沒(méi)有考慮支持粗粒度的模塊化編程[1,2].
OSGI(Open Service Gateway Initiative)是專門針對(duì)Java模塊化制定的一個(gè)標(biāo)準(zhǔn).OSGI帶來(lái)了規(guī)范化的模塊劃分、低耦合的模塊間關(guān)系、統(tǒng)一的模塊開(kāi)發(fā)方式、可動(dòng)態(tài)插拔的模塊管理環(huán)境等.本文研究了OSGI框架的特點(diǎn),結(jié)合分層解耦的思想,以井下作業(yè)管理系統(tǒng)的開(kāi)發(fā)為例,詳細(xì)闡述了OSGI在軟件開(kāi)發(fā)中的應(yīng)用,實(shí)現(xiàn)了井下作業(yè)管理系統(tǒng)的模塊化動(dòng)態(tài)管理.
OSGI框架是一種分層架構(gòu),如圖1所示,主要有模塊層、生命周期層、服務(wù)層等.模塊層定義了OSGI模塊的概念,稱為 Bundle.Bundle 既實(shí)現(xiàn)了邏輯模塊化也實(shí)現(xiàn)了物理模塊化.生命周期層定義了OSGI是如何實(shí)現(xiàn)動(dòng)態(tài)安裝和管理Bundle.服務(wù)層使各個(gè)bundle之間以松耦合的方式進(jìn)行交互.
圖1 OSGI結(jié)構(gòu)圖
AOP(Aspect Oriented Programming,面向切面編程)的實(shí)現(xiàn)建立在OOP基礎(chǔ)上,AOP是通過(guò)關(guān)注點(diǎn)分離的原則將獨(dú)立的邏輯片段模塊化,通過(guò)切面織入的方法將關(guān)注點(diǎn)應(yīng)用于程序的多個(gè)地方.AOP主要應(yīng)用在權(quán)限、緩存、內(nèi)容傳遞、錯(cuò)誤處理、延時(shí)加載、性能優(yōu)化、持久化、同步、事務(wù)等問(wèn)題的解決中.
井下作業(yè)管理是油田企業(yè)生產(chǎn)管理的重要組成部分,是油田原油生產(chǎn)平穩(wěn)運(yùn)行和產(chǎn)量任務(wù)完成的重要保障.隨著信息技術(shù)的不斷發(fā)展,油田企業(yè)為優(yōu)化井下作業(yè)管理流程,需要對(duì)原來(lái)的井下作業(yè)管理系統(tǒng)進(jìn)行改版升級(jí),我們對(duì)各個(gè)單位進(jìn)行了深入的調(diào)研,將他們的需求進(jìn)行了整合,確定了井下作業(yè)管理系統(tǒng)的主要功能模塊.各主要模塊及功能可概括為:
(1)計(jì)劃管理:實(shí)現(xiàn)生產(chǎn)井年計(jì)劃的錄入、修改、刪除以及計(jì)劃的實(shí)施情況進(jìn)行查詢,例如設(shè)計(jì)進(jìn)度與施工進(jìn)度放入查詢.
(2)設(shè)計(jì)管理:主要是根據(jù)計(jì)劃編寫(xiě)施工設(shè)計(jì),設(shè)計(jì)模塊又分為地質(zhì)設(shè)計(jì)、工程設(shè)計(jì)、工藝設(shè)計(jì).該模塊實(shí)現(xiàn)設(shè)計(jì)word文檔的生成、在線編輯、在線審核、查看.
(3)施工管理:實(shí)現(xiàn)施工動(dòng)態(tài)、作業(yè)監(jiān)督的實(shí)時(shí)動(dòng)態(tài)管理,記錄每天的施工情況并編寫(xiě)施工總結(jié).
(4)用戶信息管理:主要實(shí)現(xiàn)用戶注冊(cè)、信息修改、上傳簽名圖片,對(duì)于系統(tǒng)管理員可以對(duì)用戶進(jìn)行業(yè)務(wù)權(quán)限和數(shù)據(jù)權(quán)限管理.
本文在系統(tǒng)總體架構(gòu)設(shè)計(jì)過(guò)程中,遵循OSGI規(guī)范,并結(jié)合J2EE系統(tǒng)開(kāi)發(fā)的分層解耦設(shè)計(jì)思想.系統(tǒng)總體分層結(jié)構(gòu)如圖2所示.數(shù)據(jù)庫(kù)與持久層是軟件體系結(jié)構(gòu)的基礎(chǔ).為降低各個(gè)功能插件之間的耦合度,將各個(gè)功能插件通用的組件封裝在通用組件層,應(yīng)用OSGI的面向服務(wù)組件模型[3]的設(shè)計(jì)思想將業(yè)務(wù)組件發(fā)布為OSGI服務(wù),在業(yè)務(wù)邏輯層調(diào)用這些服務(wù).表現(xiàn)層與業(yè)務(wù)邏輯層實(shí)現(xiàn)具體的業(yè)務(wù)流程.根據(jù)關(guān)注點(diǎn)分離的思想將表現(xiàn)層與業(yè)務(wù)邏輯層劃分為多個(gè)功能插件(Bundle)實(shí)現(xiàn)了模塊劃分,每個(gè)功能插件之間的交互盡量使用服務(wù)的形式,降低了各個(gè)功能插件之間的耦合度.生命周期層是對(duì)體系結(jié)構(gòu)中的功能插件的生命周期進(jìn)行管理.可以安全地在體系結(jié)構(gòu)中安裝和卸載Bundle,而不需要重啟應(yīng)用程序.
圖2 系統(tǒng)架構(gòu)圖
井下作業(yè)管理系統(tǒng)總體架構(gòu)的設(shè)計(jì)充分體現(xiàn)了OSGI框架的三個(gè)分層,而不是單純的運(yùn)用模塊層,但也存在一些需要解決的問(wèn)題.
生命周期層實(shí)現(xiàn)了應(yīng)用程序的動(dòng)態(tài)管理,相比傳統(tǒng)的 J2EE 框架,是很大的突破.但是,在軟件總體架構(gòu)設(shè)計(jì)中我們發(fā)現(xiàn),當(dāng)一個(gè)Bundle被其他Bundle依賴時(shí),在更新這個(gè)Bundle后,依賴這個(gè)Bundle的Bundle被加載時(shí)可能被更新為舊版本的Bundle,由此會(huì)發(fā)被更新Bundle與其他Bundle的不一致,不能真正做到動(dòng)態(tài)更新.為解決這一問(wèn)題,在動(dòng)態(tài)更新 Bundle 時(shí),我們采取了更新-刷新控制機(jī)制[4],具體步驟如下:
①更新Bundle.此時(shí)新版本被放到了正確位置,但舊版本的Bundle依然存在,依賴它的Bundle依然從舊版本加載類,維持有依賴關(guān)系的Bundle的穩(wěn)定性.
②從更新的Bundle開(kāi)始,重新計(jì)算受影響并存在依賴關(guān)系的Bundle的結(jié)構(gòu)圖,任何用了更新Bundle的導(dǎo)出包的Bundle都會(huì)被放到結(jié)構(gòu)圖中.當(dāng)結(jié)構(gòu)圖外部不存在用了結(jié)構(gòu)圖內(nèi)Bundle的Bundle時(shí),該結(jié)構(gòu)圖才被認(rèn)定為完全繪制完成.
③結(jié)構(gòu)圖中處于Active狀態(tài)的Bundle被停止并切換至Resolved狀態(tài),處于Resolved狀態(tài)的Bundle都會(huì)被切換至Installed狀態(tài),處于Uninstalled狀態(tài)的Bundle會(huì)被從結(jié)構(gòu)圖移除.
④對(duì)于結(jié)構(gòu)圖中余下的Bundle,框架會(huì)重啟之前處于Active狀態(tài)的Bundle,并對(duì)這些Bundle以及其所依賴的Bundle進(jìn)行解析.
⑤框架觸發(fā)Refreshed類型的事件,對(duì)整個(gè)框架進(jìn)行更新操作.
服務(wù)是實(shí)現(xiàn)Bundle間交互的途徑.使用服務(wù)能夠降低Bundle之間的耦合,更加有利于軟件的重用.后前比較常用的發(fā)布與使用服務(wù)的方式有聲明式服務(wù)和Blueprint.在軟件總體架構(gòu)設(shè)計(jì)過(guò)程中,我們對(duì)這兩種方式的內(nèi)部原理進(jìn)行了研究.聲明式服務(wù)采用的是級(jí)聯(lián)的方式,也就是激活或停用組件基于依賴是否能夠滿足,不能很好地應(yīng)對(duì)在Bundle更新期間服務(wù)取消和發(fā)布對(duì)框架的影響.而在 Spring DM (Spring Dynamic Modules)基礎(chǔ)上定義的 Blueprint容器規(guī)范,即Blueprint是一個(gè) OSGI的 IOC(Inversion of Control)[5]規(guī)范,采用了代理的方式,將代理注入到組件中,而不是注入到真正的服務(wù)對(duì)象中.利用代理提供服務(wù)動(dòng)態(tài)性阻塞的機(jī)制,當(dāng)服務(wù)從服務(wù)注冊(cè)中心移除時(shí),阻塞機(jī)制會(huì)阻塞調(diào)用線程并阻塞等待一段時(shí)間,若超時(shí)到期并沒(méi)有找到新的服務(wù)替代,代理就會(huì)拋出異常,所以在Bundle更新期間,這種方式可以減少服務(wù)取消發(fā)布對(duì)框架的影響.基于以上研究,在模型的服務(wù)層采用了Blueprint的方式發(fā)布用服務(wù).
井下作業(yè)管理系統(tǒng)主要由計(jì)劃管理、設(shè)計(jì)管理、施工管理等模塊組成,從圖3的抽象實(shí)體類之間的關(guān)系可以看出,計(jì)劃模塊要反映設(shè)計(jì)狀態(tài)以及施工進(jìn)度的更新,所以設(shè)計(jì)、施工的數(shù)據(jù)更新要與計(jì)劃的數(shù)據(jù)更新同步.傳統(tǒng)的方法是在數(shù)據(jù)庫(kù)建立視圖,但因關(guān)聯(lián)的表及屬性眾多,對(duì)視圖的管理非常復(fù)雜.我們?cè)谙到y(tǒng)開(kāi)發(fā)中借助AOP思想解決了這一難題,下面以設(shè)計(jì)管理的實(shí)現(xiàn)為例做簡(jiǎn)單說(shuō)明.
圖3 系統(tǒng)功能模塊關(guān)系圖
作業(yè)設(shè)計(jì)是井下作業(yè)過(guò)程中的重要部分.在井下作業(yè)管理系統(tǒng)中,設(shè)計(jì)管理模塊主要包括設(shè)計(jì)數(shù)據(jù)的錄入、設(shè)計(jì)的word文檔的生成及審核過(guò)程三個(gè)流程.由于井下作業(yè)管理系統(tǒng)涉及多個(gè)單位以及多種井型,所以在設(shè)計(jì)模塊會(huì)有多種設(shè)計(jì)類型,不同設(shè)計(jì)類型在數(shù)據(jù)的錄入、設(shè)計(jì)的word文檔的生成及審核過(guò)程中會(huì)有不同,需要設(shè)計(jì)模塊具有很好的擴(kuò)展性,而且要與計(jì)劃模塊在數(shù)據(jù)更新上具有同步性.
在設(shè)計(jì)模塊,我們采用了OSGI擴(kuò)展點(diǎn)機(jī)制[6,7]和AOP思想實(shí)現(xiàn)[8],如圖4所示.
圖4 設(shè)計(jì)模塊擴(kuò)展與AOP同步更新示意圖
以生成word組件為例.PoiWordInterface作為擴(kuò)展點(diǎn)的接口類,并定義擴(kuò)展契約,其他的擴(kuò)展插件按照擴(kuò)展點(diǎn)約定的契約實(shí)現(xiàn)不同擴(kuò)展,同時(shí)擴(kuò)展點(diǎn)注冊(cè)表會(huì)對(duì)所有的擴(kuò)展進(jìn)行管理,并且會(huì)負(fù)責(zé)監(jiān)聽(tīng)擴(kuò)展插件的生命周期,加強(qiáng)擴(kuò)展點(diǎn)擴(kuò)展的穩(wěn)定性,在PoiWordInterface所在插件調(diào)用不同的擴(kuò)展實(shí)現(xiàn),實(shí)現(xiàn)不同類型的設(shè)計(jì).每當(dāng)生成了設(shè)計(jì)文檔,就說(shuō)明設(shè)計(jì)狀態(tài)變?yōu)樵O(shè)計(jì)中,設(shè)計(jì)的狀態(tài)要與計(jì)劃顯示的數(shù)據(jù)同步.AOP是實(shí)現(xiàn)橫切關(guān)注點(diǎn)的工具,通過(guò)定義切入點(diǎn)和通知實(shí)現(xiàn),將PoiWordImp組件中的生成word文件方法定義為切入點(diǎn),將從服務(wù)層調(diào)用的修改計(jì)劃實(shí)體類屬性值的服務(wù)定義為后置通知,在生成word文檔同時(shí)修改計(jì)劃模塊數(shù)據(jù),實(shí)現(xiàn)了設(shè)計(jì)模塊與計(jì)劃模塊數(shù)據(jù)更新的同步進(jìn)行.
圖4還描述了設(shè)計(jì)數(shù)據(jù)錄入與審核流程的擴(kuò)展實(shí)現(xiàn)及同步更新.
OSGI擴(kuò)展點(diǎn)機(jī)制和AOP思想的結(jié)合既實(shí)現(xiàn)了邏輯片段的模塊化也降低了插件之間的耦合性,某一擴(kuò)展插件的啟動(dòng)與卸載不會(huì)影響到其他擴(kuò)展插件的運(yùn)行,提高了系統(tǒng)穩(wěn)定性.
我們?cè)诰伦鳂I(yè)管理系統(tǒng)的開(kāi)發(fā)中,采用了OSGI框架與分層解耦思想結(jié)合的方法,取代了基于SSM框架的架構(gòu).后前,該系統(tǒng)已在油田企業(yè)推廣使用.系統(tǒng)的開(kāi)發(fā)采用 Java 語(yǔ)言,開(kāi)發(fā)工具是 Eclipse 3.7+JDK1.6,系統(tǒng)框架使用 OSGI Eclipse Equinox.
我們分別對(duì)采用2種方法開(kāi)發(fā)的井下作業(yè)系統(tǒng)進(jìn)行了測(cè)試,對(duì)比了系統(tǒng)的啟動(dòng)時(shí)間、系統(tǒng)中生成word文檔的響應(yīng)時(shí)間,如圖5、圖6所示.可以看出,基于本文的方法開(kāi)發(fā)的井下作業(yè)管理系統(tǒng)在啟動(dòng)時(shí)間及響應(yīng)時(shí)間上都有很大提高.這是因?yàn)?OSGI采用的不是Java傳統(tǒng)的樹(shù)狀類加載架構(gòu),而是網(wǎng)狀的類加載架構(gòu),基于這種模型,插件既可以加載自己的類也可以直接委派其他類加載器加載本插件中用到的其他插件中的類,這是一個(gè)并行運(yùn)行的過(guò)程.
圖5 啟動(dòng)時(shí)間比較
圖6 響應(yīng)時(shí)間比較
OSGI是一個(gè)模塊化的框架,模塊化可以使系統(tǒng)的代碼在一定范圍內(nèi)實(shí)現(xiàn)自治.而且OSGI的面向服務(wù)組件模型要求程序員規(guī)范化代碼的書(shū)寫(xiě),去掉程序中的一些冗余代碼,提高組件的復(fù)用能力,使系統(tǒng)達(dá)到了瘦身的效果,減少了代碼量.對(duì)兩個(gè)系統(tǒng)工程設(shè)計(jì)模塊的代碼量對(duì)代碼量進(jìn)行比較,結(jié)果如圖7所示,在功能基本相同的情況下,在OSGI規(guī)范下可以有效減少代碼量,提高開(kāi)發(fā)效率.
圖7 代碼量比較
另外,對(duì)于要求7*24小時(shí)不間斷運(yùn)行的井下作業(yè)管理系統(tǒng)來(lái)說(shuō),提高系統(tǒng)穩(wěn)定性十分重要.在OSGI模型下,系統(tǒng)的每個(gè)插件都具有生命周期,各個(gè)模塊的啟動(dòng)、停止、動(dòng)態(tài)更新都可以實(shí)現(xiàn)管理,因而可以做到動(dòng)態(tài)地增加或禁止某項(xiàng)功能、更新某個(gè)模塊,可以在不中斷運(yùn)行的情況下自動(dòng)更新升級(jí),這無(wú)疑提高了系統(tǒng)穩(wěn)定性.
OSGI是一個(gè)松耦合、面向服務(wù)的應(yīng)用程序開(kāi)發(fā)框架.我們?cè)贠SGI框架基礎(chǔ)上,結(jié)合分層解耦思想,對(duì)井下作業(yè)管理系統(tǒng)進(jìn)行總體設(shè)計(jì)與開(kāi)發(fā).不僅降低了各個(gè)模塊之間的耦合度,還改善了系統(tǒng)的開(kāi)發(fā)效率,提升了系統(tǒng)性能.由于不需要重新部署整個(gè)系統(tǒng),從而極大地改善了系統(tǒng)維護(hù)和部署的難度.
1 Knoernschild K.Java 應(yīng)用架構(gòu)設(shè)計(jì):模塊化模式與 OSGI.張衛(wèi)濱,譯.北京:機(jī)械工業(yè)出版社,2013.
2 Mohammed M,Elish M,Qusef A.Empirical insight into the context of design patterns:Modularity analysis.Proc.of 7th International Conference on Computer Science and Information Technology (CSTT).Amman,Jordan.2016.
3 Li WB,Zhang YB,Jin J.Research of the service design approach based on SCA_OSGi.Proc.of IITA International Conference on Services Science,Management and Engineering.Zhangjiajie,China.2009.392–395.
4 Hall RS,Pauls K,McCulloch S,等.OSGI實(shí)戰(zhàn).郭慶,李楠,李守超,等譯.北京:人民郵電出版社,2013.
5 楊揚(yáng),侯紅,郝克剛.基于容器的IOC控制反轉(zhuǎn)模式的研究.計(jì)算機(jī)應(yīng)用與軟件,2009,26(4):17–19.
6 陳江浩,余衛(wèi)東,雷曉陽(yáng),等.基于 OSGI的跨平臺(tái)測(cè)井軟件設(shè)計(jì)及應(yīng)用.測(cè)井技術(shù),2014,38(5):587–591.
7 朱珠.OSGI框架下REST架構(gòu)風(fēng)格的數(shù)據(jù)中心環(huán)境監(jiān)測(cè)系統(tǒng)的分析與設(shè)計(jì)[碩士學(xué)位論文].北京:北京交通大學(xué),2010.
8 Alexandersson R,?hman P,Ivarsson M.Aspect oriented software implemented node level fault tolerance.Proc.of the 9th IASTED International Conference on Software Engineering and Applications.Phoenix AZ,USA.2007.57–74.
Hierarchical Dynamic Software Model Based on OSGI
WEI Dong-Ping,LI Feng-Juan,YUAN Zhi-Peng
(College of Computer and Communication Engineering,China University of Petroleum,Qingdao 266580,China)
The application software under the traditional java framework lacks the ability of modularization and dynamic management.Based on the in-depth study of OSGI framework,this paper proposes a method of combining the OSGI and the hierarchical decoupling.It uses the method to design the overall architecture of downhole operation management system,and also solves the problem of dynamic management and service layer.It describes the application of OSGI extension point mechanism and AOP in detail,then improves the system expansion ability and solves the problem of data synchronization update.The test results show that the model can improve the performance of the system,reduces the coupling between the modules,increases the reusability of components and scalability,and improves the stability of the system.
OSGI;modularity;dynamic management;downhole operation management system
魏東平,李奉娟,苑志朋.基于OSGI分層動(dòng)態(tài)的軟件設(shè)計(jì)與開(kāi)發(fā).計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(9):98–102.http://www.c-s-a.org.cn/1003-3254/5934.html
2016-12-24;采用時(shí)間:2017-01-12