zhaobin

增强信息技术;感悟商业管理;探索商业与技术融合;丰富自我修养;享受时尚生活;记录心路历程;使Blog作为自我改变之记录与监督的平台。
posts - 25, comments - 59, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

 

OpenCore:基于OSGi开发纯插件体系结构的WEB应用程序

转载,原文地址:http://erylee.javaeye.com/blog/50624

关键字:
企业应用   OSGi

随着OSGi/Equinox逐渐成为Java EE服务端的基础软件架构,OSGi上部署WEB应用程序的解决方案日渐成熟。这里介绍三种目前我们所知的解决方案,前两种是Equinox组织提出的方案,后一种是OpenCore平台采取的解决方案。

解决方案一: 部署OSGi/Equinox在Servlet容器中
具体实现: 把OSGi/equinox打包在WAR中,当Servlet容器加载WAR时,启动OSGi框架。
WEB-INF的目录结构大致如下(大致如此):
  1. * /WEB-INF  
  2.       o /web.xml (with one servlet entry assigning all incoming requests to the BridgeServlet)  
  3.       o /lib/servletbridge.jar (the classes associated with the equinox.servletbridge)  
  4.       o /eclipse (the eclipse platform directory)  
  5.             + launch.ini (contains framework properties that will allow override of any eclipse specific System Properties)  
  6.             + /configuration (contains config.ini which lists the bundles you want to have available)  
  7.             + /features  
  8.             + /plugins  

部署结构如下图(转载):

个人感觉这个解决方案使用价值不大。

解决方案二: Web服务器与Servlet容器嵌入在OSGi/Equinox
具体实现: 把Jetty当作一个插件嵌入到OSGi/Equinox中,并基于Jetty实现OSGi标准中的HTTP服务,其他插件可以通过该服务注册Servlet和静态页面。
OSGi标准中的HTTP服务接口如下:
  1. package org.osgi.service.http;  
  2. import javax.servlet.Servlet;  
  3. import javax.servlet.ServletException;  
  4. import java.util.Dictionary;  
  5. public interface HttpService {  
  6. public void registerServlet(String alias, Servlet servlet,  
  7.             Dictionary initparams, HttpContext context)  
  8. throws ServletException, NamespaceException;  
  9. public void registerResources(String alias, String name,  
  10.             HttpContext context) throws NamespaceException;  
  11. public void unregister(String alias);  
  12. public HttpContext createDefaultHttpContext();  
  13. }  

部署结构图(转载):

因为OSGi是最早为嵌入式系统设计,所以OSGi标准中的HTTP服务只提供了有限的Servlet与静态资源的发布功能,没有一个完整的WEB容器概念,这种模式更适合通过WEB方式暴露(Export)服务,不太适合开发展现层的WEB应用。
通过Equinox提供的扩展/扩展点功能可以简化这种方式WEB应用的开发,就是通过plugin.xml来配置Servlet和静态页面的注册。

解决方案三: 设计适合OSGi环境的Servlet容器,构建纯插件体系结构的WEB层
具体实现:"插件"与我们通常所说软件"模块"的一个区别是:插件能自我描述,加载运行在插件容器中。那么,我们可以分层扩展一个插件的自我描述,用类似Decorator的模式为插件增加“特征”描述。 所以,我们在OpenCore中定义了三种特征的插件,如下图:

这三种插件类型间关系类似Decorator模式,从内到外增加"特征"描述:
  1. OSGi标准插件,自描述文件"META-INF/MANIFEST.MF"
  2. OpenCore插件,增加自描述文件"META-INF/opencore.xml",实现符合OSGi环境的依赖注册(IoC)与动态扩展点
  3. OpenCore Web插件,增加自描述文件"WEB-INF/web.xml"(符合Servlet规范),WEB特性的插件,可以部署在Servlet容器内

这样我们可以把一个应用的WEB层像业务层一样,分割为多个插件,部署在OSGi/Equinox的框架中.
部署结构图:


我们觉得这种方式以合适的力度将WEB层分割为插件部署在OSGi框架上,充分的发挥了OSGi体系结构的强大之处,也提高了WEB层开发部署的灵活性。目前,业界好像也有很多项目是采用这中方式部署。这种部署方式的缺点是,不得不修改Jetty容器的实现,以使其适应OSGi的环境,我们希望Jetty以后能支持这个功能:)
Google Code上发布了一个基于OpenCore的示例项目linktalk,一个基于GWT、Equinox、OpenCore的Ajax聊天室。
项目地址: http://code.google.com/p/linktalk/
源码下载: svn checkout https://linktalk.googlecode.com/svn/trunk/project
程序下载: svn checkout https://linktalk.googlecode.com/svn/trunk/release
相关资源:
http://www.eclipse.org/equinox/server/http_quickstart.php



赵斌原创,保留一切权利,转载请保留引用:www.blogjava.net/zhaobin,注明转载除外,谢谢!】

只有注册用户登录后才能发表评论。


网站导航: