隨著OSGi/Equinox逐漸成為Java EE服務(wù)端的基礎(chǔ)軟件架構(gòu),OSGi上部署WEB應(yīng)用程序的解決方案日漸成熟。這里介紹三種目前我們所知的解決方案,前兩種是Equinox組織提出的方案,后一種是OpenCore平臺(tái)采取的解決方案。
WEB-INF的目錄結(jié)構(gòu)大致如下(大致如此):
部署結(jié)構(gòu)如下圖( 轉(zhuǎn)載 ):
個(gè)人感覺(jué)這個(gè)解決方案使用價(jià)值不大。
OSGi標(biāo)準(zhǔn)中的HTTP服務(wù)接口如下:
部署結(jié)構(gòu)圖( 轉(zhuǎn)載 ):
因?yàn)镺SGi是最早為嵌入式系統(tǒng)設(shè)計(jì),所以O(shè)SGi標(biāo)準(zhǔn)中的HTTP服務(wù)只提供了有限的Servlet與靜態(tài)資源的發(fā)布功能,沒(méi)有一個(gè)完整的WEB容器概念,這種模式更適合通過(guò)WEB方式暴露(Export)服務(wù),不太適合開發(fā)展現(xiàn)層的WEB應(yīng)用。
通過(guò)Equinox提供的擴(kuò)展/擴(kuò)展點(diǎn)功能可以簡(jiǎn)化這種方式WEB應(yīng)用的開發(fā),就是通過(guò)plugin.xml來(lái)配置Servlet和靜態(tài)頁(yè)面的注冊(cè)。
這三種插件類型間關(guān)系類似Decorator模式,從內(nèi)到外增加"特征"描述:
這樣我們可以把一個(gè)應(yīng)用的WEB層像業(yè)務(wù)層一樣,分割為多個(gè)插件,部署在OSGi/Equinox的框架中.
部署結(jié)構(gòu)圖:
我 們覺(jué)得這種方式以合適的力度將WEB層分割為插件部署在OSGi框架上,充分的發(fā)揮了OSGi體系結(jié)構(gòu)的強(qiáng)大之處,也提高了WEB層開發(fā)部署的靈活性。目 前,業(yè)界好像也有很多項(xiàng)目是采用這中方式部署。這種部署方式的缺點(diǎn)是,不得不修改Jetty容器的實(shí)現(xiàn),以使其適應(yīng)OSGi的環(huán)境,我們希望Jetty以 后能支持這個(gè)功能:)
Google Code上發(fā)布了一個(gè)基于OpenCore的示例項(xiàng)目linktalk,一個(gè)基于GWT、Equinox、OpenCore的Ajax聊天室。
項(xiàng)目地址: http://code.google.com/p/lintkalk
源碼下載: svn checkout https://linktalk.googlecode.com/svn/trunk/project
程序下載: svn checkout https://linktalk.googlecode.com/svn/trunk/release
解決方案一: 部署OSGi/Equinox在Servlet容器中
具體實(shí)現(xiàn): 把OSGi/equinox打包在WAR中,當(dāng)Servlet容器加載WAR時(shí),啟動(dòng)OSGi框架。WEB-INF的目錄結(jié)構(gòu)大致如下(大致如此):
- *?/WEB-INF??
- ??????o?/web.xml?(with?one?servlet?entry?assigning?all?incoming?requests?to?the?BridgeServlet)??
- ??????o?/lib/servletbridge.jar?(the?classes?associated?with?the?equinox.servletbridge)??
- ??????o?/eclipse?(the?eclipse?platform?directory)??
- ????????????+?launch.ini?(contains?framework?properties?that?will?allow?override?of?any?eclipse?specific?System?Properties)??
- ????????????+?/configuration?(contains?config.ini?which?lists?the?bundles?you?want?to?have?available)??
- ????????????+?/features??
- ????????????+?/plugins??
部署結(jié)構(gòu)如下圖( 轉(zhuǎn)載 ):
個(gè)人感覺(jué)這個(gè)解決方案使用價(jià)值不大。
解決方案二: Web服務(wù)器與Servlet容器嵌入在OSGi/Equinox
具體實(shí)現(xiàn): 把Jetty當(dāng)作一個(gè)插件嵌入到OSGi/Equinox中,并基于Jetty實(shí)現(xiàn)OSGi標(biāo)準(zhǔn)中的HTTP服務(wù),其他插件可以通過(guò)該服務(wù)注冊(cè)Servlet和靜態(tài)頁(yè)面。OSGi標(biāo)準(zhǔn)中的HTTP服務(wù)接口如下:
- package ?org.osgi.service.http;??
- ??
- import ?javax.servlet.Servlet;??
- import ?javax.servlet.ServletException;??
- import ?java.util.Dictionary;??
- ??
- public ? interface ?HttpService?{??
- ???? public ? void ?registerServlet(String?alias,?Servlet?servlet,??
- ????????????Dictionary?initparams,?HttpContext?context)??
- ???????????? throws ?ServletException,?NamespaceException;??
- ??
- ???? public ? void ?registerResources(String?alias,?String?name,??
- ????????????HttpContext?context)? throws ?NamespaceException;??
- ??
- ???? public ? void ?unregister(String?alias);??
- ??
- ???? public ?HttpContext?createDefaultHttpContext();??
- }??
部署結(jié)構(gòu)圖( 轉(zhuǎn)載 ):
因?yàn)镺SGi是最早為嵌入式系統(tǒng)設(shè)計(jì),所以O(shè)SGi標(biāo)準(zhǔn)中的HTTP服務(wù)只提供了有限的Servlet與靜態(tài)資源的發(fā)布功能,沒(méi)有一個(gè)完整的WEB容器概念,這種模式更適合通過(guò)WEB方式暴露(Export)服務(wù),不太適合開發(fā)展現(xiàn)層的WEB應(yīng)用。
通過(guò)Equinox提供的擴(kuò)展/擴(kuò)展點(diǎn)功能可以簡(jiǎn)化這種方式WEB應(yīng)用的開發(fā),就是通過(guò)plugin.xml來(lái)配置Servlet和靜態(tài)頁(yè)面的注冊(cè)。
解決方案三: 設(shè)計(jì)適合OSGi環(huán)境的Servlet容器,構(gòu)建純插件體系結(jié)構(gòu)的WEB層
具體實(shí)現(xiàn):"插件"與我們通常所說(shuō)軟件"模塊"的一個(gè)區(qū)別是:插件能自我描述,加載運(yùn)行在插件容器中。那么,我們可以分層擴(kuò)展一個(gè)插件的自我描述,用類似Decorator的模式為插件增加“特征”描述。 所以,我們?cè)贠penCore中定義了三種特征的插件,如下圖:這三種插件類型間關(guān)系類似Decorator模式,從內(nèi)到外增加"特征"描述:
- OSGi標(biāo)準(zhǔn)插件,自描述文件"META-INF/MANIFEST.MF"
- OpenCore插件,增加自描述文件"META-INF/opencore.xml",實(shí)現(xiàn)符合OSGi環(huán)境的依賴注冊(cè)(IoC)與動(dòng)態(tài)擴(kuò)展點(diǎn)
- OpenCore Web插件,增加自描述文件"WEB-INF/web.xml"(符合Servlet規(guī)范),WEB特性的插件,可以部署在Servlet容器內(nèi)
這樣我們可以把一個(gè)應(yīng)用的WEB層像業(yè)務(wù)層一樣,分割為多個(gè)插件,部署在OSGi/Equinox的框架中.
部署結(jié)構(gòu)圖:
我 們覺(jué)得這種方式以合適的力度將WEB層分割為插件部署在OSGi框架上,充分的發(fā)揮了OSGi體系結(jié)構(gòu)的強(qiáng)大之處,也提高了WEB層開發(fā)部署的靈活性。目 前,業(yè)界好像也有很多項(xiàng)目是采用這中方式部署。這種部署方式的缺點(diǎn)是,不得不修改Jetty容器的實(shí)現(xiàn),以使其適應(yīng)OSGi的環(huán)境,我們希望Jetty以 后能支持這個(gè)功能:)
Google Code上發(fā)布了一個(gè)基于OpenCore的示例項(xiàng)目linktalk,一個(gè)基于GWT、Equinox、OpenCore的Ajax聊天室。
項(xiàng)目地址: http://code.google.com/p/lintkalk
源碼下載: svn checkout https://linktalk.googlecode.com/svn/trunk/project
程序下載: svn checkout https://linktalk.googlecode.com/svn/trunk/release
相關(guān)資源:
http://www.eclipse.org/equinox/server/http_quickstart.php
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

