首先,下面写的这东西其实跟OSGi有点关系,但是关系不大,就是说一下OSGi与web结合相关的一点感受,不具体谈实现。
在项目开始之前,我们也进行了一些调研,特意在烈日炎炎中下山进城里与经验者进行了交流,在需求的基础上,通过一些资料,敲定基于OSGi进行项目的展开,这样可以充分利用OSGi的特点,使各个模块能够实现组件化。而在与web结合这块,通过简短的调研,觉得还是把web与OSGi结合起来,用OSGi来管理web容器,这样所有的东西在OSGi的管理下,无论从组织结构上和开发上都非常顺手。到此,Perfect。
事实。OSGi与web的结合并不像盛传的那么好,最初的想把web作为一个bundle由OSGi来进行管理,一起就都美好了。事实并非如此。在每一个提到OSGi管理web的事例里,作者(不如说大部分是转载者)举例web服务器被OSGi管理的服服帖帖都拿jetty来说事儿。Tomcat,应用服务器WebLogic,WebSphere只字不提。最初的最初,没太在意,而且老G介绍OSGi时候说过,OSGi就是你把任何东西打成jar包,做成bundle然后往里放就行了。我问,“web服务器能放进去吗?”“能啊,jetty啊!”诚然,作为资深Eclipse插件开发者,他对这些确实信手拈来,不过当时我们并没有把需求放到更详细的角度考虑,一拍脑子,jetty,哦了,就是他。现在的考虑是,如果说tomcat是轻量级,那么jetty就是微量级了。更何况,之前确实没拿他做过什么东西。因为tomcat,WebLogic通吃很多东西了,在一般应用上很少考虑这种微量级的web服务器。万一,哪天我们有需求jetty达不到(可以说不是万一是肯定),那么这种将web放在OSGi环境下管理的设计就完蛋了,生命立即终止。所以,web放在OSGi管理,达妹╮(╯_╰)╭。解决办法,期待tomcat哪天能扔到OSGi里吧。
不把web放OSGi,那只好把OSGi放web里了,Equinox的bridge,Equinox 框架以及项目的 bundle 做成一个 War 文件部署到 Servlet 容器中,这个 servlet负责对你的OSGi容器进行初始化。每当接收到一个客户请求,它将查看是否存在一个OSGi插件可以处理该请求;如果存在,它将控制转发至该插件。虽说这样传统的常用web服务器就可以用上了,我们以前一直搞的东西又回来了,总觉得这种感觉有点别扭。
OSGi与web的结合,就两种方式,web插OSGi里,OSGi插web里,不恰当的比喻来一个,如果是春哥和小沈阳,肯定能分出谁搞谁来。现在OSGi和web就像春哥和曾哥,都很纯,目前看谁搞谁都不是很搞的很舒服。不过我相信至少OSGi的热度,会有大量的技术人员来参与解决这些问题,注定了不会存在两个爷们的不稳定局面。让我们翘首期待吧。