简介
Virgo项目Web服务器是EclipseRT项目的一部分,是一个完全模块化的Java运行时。Virgo自身就是设计为在标准OSGi框架实现(Equinox)之上的一个OSGi bundle集合。Virgo可以运行企业级Java应用以及基于Spring(Spring - powered)的应用,具有很强的灵活性和可靠性,它提供了一个支持企业级Java应用开发、部署和服务的简单而强大的平台。
历史
2007年末作为“SpringSource Application Platform”启动,很快改名为“SpringSource dm Server”。
SpringSource dm Server的三个基本目标:
• 提供一个更好的OSGi平台
• 支持Java EE应用向OSGi的平滑过渡(简化迁移)
• 自身是模块化和可扩展的
2008年末dm Server1.0发布;
2009年末dm Server2.0发布,引入了独立的kernel;
2010年1月Springsource将dm Server贡献给Eclipse基金会,改名为Vrigo;
之后Virgo经历了2.1版本和3.0版本,其中3.0开始支持Jetty和snaps框架;
2012年3月,发布Virgo 3.5版本,引入了p2,以及从kernel中分离出了“Nano”。
特点
Virgo具有以下一些特点:
• Web管理控制台:还记得OSGi生命周期管理的API吗?基于这些API你可以自己实现一个控制台,Virgo给你提供了一个Web界面,你点点鼠标就可以部署和管理bundle了。当然,Virgo的控制台还提供了其他一些额外的信息,比如诊断性的dumps,这对于调试是非常有帮助的。
• Gogo shell :这是apche felix项目下的一个子项目,Virgo给集成过来了,也是用于部署和管理bundle的,这回不是Web界面了,而是通过SSH或者telnet。
• Plans - 这是Virgo在bundle基础上引入的一个概念,你可以看成是多个bundle的一个集合,这些bundle构成一个整体,因此也引入了作用域,和其他的bundle隔离开来了。
• 供应(Provisioning) - 自动从本地或者远程的仓库中提供系统所依赖的bundle、plan、pars和配置。这些都是Virgo中的制品模型,后面会有介绍。
• Web服务器 - 实现了OSGi Web Container规范,还记得OSGi企业规范吧,这是其中的一部分。支持原始的WAR格式,当然更支持WAB格式了。这样一个服务器对于将OSGi应用到Web开发中来实在是太有用了。如果你有基于OSGi HttpService来开发过Web应用的经历你就更有体会了。
• 用户空间(User region)- Virgo引入这一概念用来将用户安装的应用和Virgo的内核隔离开来。这使得开发者只需关注于应用本身的制品和依赖,不需要关注内核中的东西。
此外Virgo还集成Spring 3,提供了强大的日志功能、JMX管理功能以及Web应用的热部署功能。
下面这张图展示了Virgo的大部分特点。
为什么选择Virgo?
在遇到以下几种情况下你可以考虑选择Virgo。
• 首先是当你需要一个可以和OSGi环境无缝融合的应用服务器时;
• 其次是当你需要一个OSGi开发的集成工具集时,你会发现你自己配置起一个OSGi的开发环境,找到你所有需要bundle并把他们粘合起来是一件很费事的事情,现在Virgo全部给你做了,而且给你提供了Eclipse的插件,进一步简化了你的开发。
• 最后当你想基于OSGi来构建你应用的内核时,Virog的内核依然可以成为你的选择。
具体来说,因为Virgo除了为开发者提供了一个标准OSGi的运行环境之外,基于Virgo还可以复用传统的Java包和War包,集成Web容器,提供强大的诊断功能和高级的开发工具。 事实上,Virgo虽然推出不久,而且也还在演化之中,但已经有不少成功案例,比如Virgo的官方文档中介绍了GME集团构建的一个大型企业应用,其中就采用了Virgo,其中有48个service bundle,20个Web budnle,而且采用了Virgo的Snaps技术。Snaps是一种在Web层的模型化技术,后面我们会有详细的介绍。
Virgo的基本概念
下面介绍Virgo中的几个基本概念。
Provisioning repositories
包含制品和元数据,通过制品类型、命名和版本进行索引。库内容的变化不会引起制品的部署、刷新或者卸载。
External Repositories
扫描一个目录生成,可包含内嵌目录,生成后目录内容不影响库内容。 ext目录是External Repositories。
Watched Repositories
扫描一个目录生成,不包含内嵌目录。周期性扫描目录,扫描到变化会更新库。usr目录是Watched Repositories。
Remote Repositories
远程库,和Maven的repositories类似,周期性扫描index,基于index从远程加载bundle。
Repository Chain
远程库,和Maven的repositories类似,周期性扫描index,基于index从远程加载bundle。
制品类型
包含Bundle、Configuration、PAR、Plan和Library。PAR、Plan和Library称为Grouping bundles。
PAR
一个PAR中的bundle同时解析(意味着任何一个解析失败,整个PAR解析失败)。PAR中的bundle之间可以相互依赖。PAR中的bundle可以依赖外部的包或者服务,但是外部不能依赖PAR提供的包和服务。
Plan
一个XML文件,包含了制品(一般为bundle)列表,制品在Virgo的库中。
Library
一个bundle集合,用来引入(通过Import-Library)。
Kernel
提供了除Web方面的OSGi模块化的所有支持。
• OSGi bundles, PARs, plans和配置等制品的部署
• 本地仓库和远程服务仓库
• 作用域(还记得Plan吧?)
• 热部署Hot deployment
• 用户控件User region
• 自动供应(使用别的远程服务仓库)
• 系统的跟踪
• spring和spring DM的支持
Kernel的好处是便于内核和应用的升级,内核的Spring版本可以和应用的Spring版本不一样。
User region
管理用户应用的子系统。将Kernel和应用(包括VTS的应用,比如Admin Console)隔离开来。
Virgo的全貌
Virog的全貌可以用下面这张图来表示。
这张图中的内容在前面的一些介绍中已经有一些体现。注意Nano是从原来的Kernel中剥离出来的,提供了大部分的诊断(diagnostic)功能,p2支持,提供一个single region的框架。Kernel则提供部署流水线,多种制品类型的支持,region,scoping等一些概念的实现,见基本概念。Regions将来支持多region,应用之间也可以相互隔离。Virgo IDE工具以Eclipse插件的形式存在,支持bundle,PAR和Plan的开发和部署,同时还提供了Virgo Bundlor,一个Manifest生成工具。最上层的Snaps是在Web层实现了模块化的支持。具体的细节以后我们再展开详述。
复用的技术
Virgo复用了很多已有的技术、平台和工具。比如:
• Tomcat - Gemini Web的一部分,实现Java Servlet规范。
• Jetty - 实现了OSGi Web应用标准和Java Servlet规范。
• Gemini Web - 支持WAR和WAB的部署。
• Gemini Blueprint - 支持基于XML的服务和服务应用的申明。
• Gemini Management - 提供Bundle的JMX管理视图,Kernel和User Region各一个实例。
• Gogo Shell - 属于Apache Felix 项目,支持基于SSH和Telnet的shell访问。Virgo增加了一些特有的命令,如部署、检查和管理制品(artifact),以及诊断类加载问题等。
• Logback - 支持日志。
• Equinox OSGi Framework - OSGi框架的实现。Virgo基于Equinox一些特定的实现特征,提供了更好的解析诊断,配置类加载和资源查找。
• Equinox Service - 其中包括:Declarative Service,Configuration Admin Service, Event Admin Service。
• Equinox P2 - Eclipse用于安装和更新系统及插件的一个provisioning平台。
• Equinox Region Bundle - 支持区域的概念,对OSGi框架进行隔离划分,基于OSGi标准的hooks实现。
支持的规范
Virgo支持的规范包括:
• Java EE Web Profile
• Java Servlet Specification
• OSGi Blueprint Service
• OSGi Configuration Admin Service
• OSGi Core
• OSGi Declarative Services
• OSGi Event Admin Service
• OSGi Log Service
• OSGi Web Applications
暂时还不支持OSGi Subsystem Specification
控制台
默认没有打开,修改osgi.console.properties,设置enabled=true可以打开控制台。 SSH或者telnet 2502(user region)或者2402(kernel),默认密码admin/springsource;可在org.eclipse.virgo.kernel.users.properties 中配置。
bundle | 管理和显示bundle信息 |
clhas | 显示包含某个类或者资源的所有bundle |
clexport | 显示导出某个类或者包的所有bundle. |
clload | 示能够加载一个类的所有bundle |
config | 管理和显示配置的有关信息 |
packages | 显示导出包的信息 |
par | 管理和显示Par |
plan | 管理和显示plan |
service | 显示service信息 |
install | 安装制品 |
shutdown | 关闭Virgo内核 |
Virgo提供了两种日志类型,其中事件日志(Event logging)记录系统中的重要事件,而跟踪日志(Trace logging)记录系统中的所有内部事件和应用的输出。
供应仓库
Virgo提供了一个供应仓库。这类似于Maven的仓库。所不同的是,Maven仓库是在开发时可以从仓库中获取包,而Vrigo可以基于P2在运行时动态远程加载Bundle,很强大吧。当然Virgo也有本地的仓库。通常安装制品,拷贝到 $SERVER_HOME/repository/usr目录下即可。
下面是一个典型的仓库配置:
ext.type=external
ext.searchPattern=repository/ext/{artifact}
usr.type=watched
usr.watchDirectory=repository/usr
remote-repo.type=remote
remote-repo.uri=http://my-host:8080/org.eclipse.virgo.apps.repository/my-hosted-repo
remote-repo.indexRefreshInterval=30
watched-repo.type=watched
watched-repo.watchedDirectory=repository/watched
watched-repo.watchedInterval=5
chain=ext,usr,remote-repo,watched-repo
Virgo就先介绍到这里,事实上Virgo在OSGi的基础上进一步引入了一些控制系统复杂性的概念,这些概念的含义和具体的实现方法,后面我们再做介绍。