目前,關(guān)注OSGi的人變得越來越多,OSGi本身也早已從那個專注于嵌入式平臺的“小”角色轉(zhuǎn)變過來了,慢慢向企業(yè)級應(yīng)用市場滲透。
從某種角度說,Eclipse可以說是OSGi在企業(yè)應(yīng)用領(lǐng)域的試金石,2003年Eclipse3.0做了一次架構(gòu)上的調(diào)整,繼續(xù)延用插件的架構(gòu)思想,但是從3.0版之后,是基于OSGi的實(shí)現(xiàn)。也就是這一次的調(diào)整,推動了Eclipse的迅猛發(fā)展。
這是在桌面應(yīng)用的成功示例,而OSGi的目標(biāo)遠(yuǎn)不止于此,以其優(yōu)秀的類加載機(jī)制,可以說,只需對其進(jìn)行擴(kuò)展,那么就可以目標(biāo)瞄準(zhǔn)任何一個領(lǐng)域。談到企業(yè)應(yīng)用,無可避免的要涉及Web應(yīng)用,相信大多數(shù)人都在從事該領(lǐng)域的開發(fā)。OSGi R4版已明確提出了對Web的支持方式——當(dāng)然,這種方式還是很有限的,這一點(diǎn)將在后面的文章中詳細(xì)說明。
鑒于此,很多開源框架都已經(jīng)或正準(zhǔn)備發(fā)布支持OSGi的版本,比如Spring DM、Struts1.8.1、CXF等等,基本上日常所用的開源框架都發(fā)布了基于OSGi版本。另外,有不少應(yīng)用服務(wù)器也已經(jīng)基于OSGi進(jìn)行實(shí)現(xiàn),比如WAS從6.1版就已經(jīng)是基于OSGi的實(shí)現(xiàn),而Spring也在2009年推出了Spring DM Server,可見OSGi的吸引力還是很大的。
那么這一切將會為以后的開發(fā)帶來什么影響呢?本文試圖從OSGi和構(gòu)件化開發(fā)的角度認(rèn)識一下該問題。
OSGi的類加載機(jī)制非常優(yōu)秀,為每個運(yùn)行于其中的bundle創(chuàng)建了獨(dú)立的類加載器環(huán)境,而運(yùn)行于同一個OSGi框架內(nèi)部的bundle之間不像Web服務(wù)器中的Web應(yīng)用那樣絕緣,它們之間是可以進(jìn)行包依賴的,當(dāng)然OSGi也提供了服務(wù)注冊等相關(guān)機(jī)制,確保bundle之間的相互協(xié)作能力。而且OSGi支持bundle動態(tài)部署。所以,系統(tǒng)無需停機(jī)重啟,就可以實(shí)現(xiàn)其內(nèi)部的動態(tài)更新。
構(gòu)件化開發(fā)的概念已經(jīng)提了很多年了,似乎一直缺乏一種有效的機(jī)制對其進(jìn)行支持。構(gòu)件化開發(fā)為系統(tǒng)開發(fā)帶來了很多好處,整個系統(tǒng)的開發(fā)可以按照模塊的方式進(jìn)行劃分,從而按模塊進(jìn)行開發(fā);系統(tǒng)由各模塊之間拼裝而成,通過代碼一級的依賴或者服務(wù)依賴的方式;對于某個模塊進(jìn)行更新,只要保持接口不變,則可以實(shí)現(xiàn)對外界無影響。
由于缺乏有效的底層支持,構(gòu)件化開發(fā)方式一直沒有推行起來。由其對于Web應(yīng)用而言,想要實(shí)現(xiàn)構(gòu)件化開發(fā),似乎更是無從談起。
OSGi的出現(xiàn),讓這一事情有所轉(zhuǎn)機(jī)。傳統(tǒng)的Web應(yīng)用開發(fā)過程中,可能大多數(shù)人的做法就是將一個大的Web應(yīng)用按功能模塊進(jìn)行劃分,通過包切分來實(shí)現(xiàn)模塊化開發(fā),但是各模塊之間并沒有從物理上隔離,只是以一種組織方式上的約束,使其從表面看上去是分離的。對于這種方式,動態(tài)更新某個模塊也就無從談起了。
而如果將OSGi引入Web應(yīng)用,每個模塊都對應(yīng)于一個bundle,那么模塊與模塊之間則從物理上進(jìn)行了隔離,能有效的將模塊內(nèi)部實(shí)現(xiàn)對外隱藏。模塊之間的交互,可以通過接口的導(dǎo)出與引用來實(shí)現(xiàn),對于未經(jīng)導(dǎo)出的部分,對于其他模塊是不可見的。另外,由于OSGi支持bundle的熱部署,那就意味著,在當(dāng)前Web應(yīng)用未停機(jī)的情況下,可以對某個或某些模塊(對應(yīng)OSGi中的bundle)進(jìn)行動態(tài)更新,而不影響整個應(yīng)用的正常運(yùn)行。
這種從物理上的有效隔離的方式,為重用帶來了新的方式。以前代碼一級的重用,一般都通過Jar包的形式進(jìn)行,而這種方式存在上述的一些缺點(diǎn),即封裝性不夠。而通過基于OSGi的bundle的形式,則可以有效隱藏內(nèi)部實(shí)現(xiàn),從包一級進(jìn)行隱藏(這一點(diǎn)個人覺得可以作為Java封裝性的一種擴(kuò)展,以前的封裝只能做到類一級,不知道未來是否會被Java規(guī)范吸收)。
就這一點(diǎn)而言,OSGi對構(gòu)件化開發(fā)進(jìn)行了很好的支持,當(dāng)然OSGi并不為此而生。
以上所說的構(gòu)件依賴都是基于API一級的,那么當(dāng)然,我們也可以將Web Service等類型服務(wù)封裝至構(gòu)件當(dāng)中,再結(jié)合ESB,是不是對SOA的一種更好實(shí)現(xiàn)呢!ESB的關(guān)注點(diǎn)在于服務(wù),這是一種細(xì)粒度的,它并不考慮服務(wù)的封裝、重用等方面——這些方面都由設(shè)計(jì)人員去把握。而結(jié)合OSGi,當(dāng)然還需要其他設(shè)施的支持,比如CXF已經(jīng)發(fā)布了基于OSGi的實(shí)現(xiàn),可以將服務(wù)封裝至一個bundle,以bundle為單元,向外界提供服務(wù),這種服務(wù)即變成了一種粗粒度的——構(gòu)件的特點(diǎn)之一。
綜上所述,我相信,OSGi的發(fā)展,將會為構(gòu)件化的開發(fā)方式帶來福音。
引出話題:OSGi和SCA在很多方面有著異曲同工這妙,并且SCA的實(shí)現(xiàn)框架——Tuscany也對OSGi做了支持。這兩者有互補(bǔ)特性,有時間將對這兩者做一個對比研究。
posted on 2010-03-28 11:49
Dreava 閱讀(744)
評論(0) 編輯 收藏 所屬分類:
OSGi