Virgo 简介

 由  罗俊杰 发布

简介

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的大部分特点。

http://assets.osgi.com.cn/article/7289227/Virgo.png

为什么选择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的基础上进一步引入了一些控制系统复杂性的概念,这些概念的含义和具体的实现方法,后面我们再做介绍。


LastSmart 2014-07-23 23:53

在使用过程中感觉virgo对spring等第三方jar包的依赖性很大,且目前virgo的版本还是不太稳定,偶尔会启动失败的情况出现

顶(0) 踩(0) 回复

王传银 2014-05-12 22:28

为什么我用virgo创建的bundle (非web)的时候,import package或者import bundle都不能解决** package can not resolved问题。网上说通过proect reference的方式,除了这样还有其他方法吗。我因为那种方式总感觉不和插件机制的味道。求大神指导

顶(0) 踩(0) 回复

王传银 2014-05-12 22:28

为什么我用virgo创建的bundle (非web)的时候,import package或者import bundle都不能解决** package can not resolved问题。网上说通过proect reference的方式,除了这样还有其他方法吗。我因为那种方式总感觉不和插件机制的味道。求大神指导

顶(0) 踩(0) 回复

snoopy7713 2014-05-12 13:56

virgo vs karaf 对比一下,那个好呀?virgo感觉死掉了1年也不发个版本

顶(0) 踩(0) 回复

罗俊杰 2014-05-07 13:46

确定Web bundle正常启动的话,可能时路径问题。讨论群加184592447

顶(0) 踩(0) 回复

header230 2014-05-07 10:36

最近在学习virgo这块。<br>sts(我安装的是4.3.2) ,virgo安装的是:http://download.eclipse.org/virgo/snapshot/tooling<br>virgo-tomcat用的时候3.5<br><br>我只新建了一个web bundle工程,加了一个jsp文件,在virgo-tomcat中,bundle能够正常安装启动,但是我访问这个jsp的时候,无法访问,报的是404.可我在virgo-tomcat中<br>virgo-tomcat-server-3.5.0.RELEASE\work\org.eclipse.virgo.kernel.deployer_3.5.0.RELEASE\staging 中是有我的工程的。<br>是个有类似的问题,或者是否有virgo的讨论群可以介绍一个。感谢!!!!

顶(0) 踩(0) 回复

王传银 2014-02-18 14:55

回复taourist: <br>我在home/work/deployer看的编译后的war

顶(0) 踩(0) 回复

taourist 2014-02-17 17:31

回复王传银: virgo控制台应用在pickup目录下吧

顶(0) 踩(0) 回复

王传银 2014-02-14 12:52

我想知道我的应用发布到virgo tomcat server的哪个目录下了

顶(0) 踩(0) 回复

王传银 2014-02-13 13:00

各位朋友,我那异常应该是virgo插件和virgo tomat server版本不一致照成的

顶(0) 踩(0) 回复

王传银 2014-02-13 09:03

我用的eclipse Eclipse Java EE IDE for Web Developers. Version: Kepler Service Release 1 应该是4.3,我集成了virgo3.6.2 启动时报 Caused by: org.eclipse.virgo.kernel.deployer.model.DuplicateFileNameException: The artifact bundle 'org.eclipse.virgo.management.console' version '3.6.2.RELEASE' in scope 'null' at URI 'file:/E:/JavaResources/osgi/virgo-tomcat-server-3.6.2.RELEASE/pickup/org.eclipse.virgo.management.console_3.6.2.RELEASE.jar' cannot be stored in the runtime artifact model as it clashes with the artifact bundle 'org.eclipse.virgo.management.console' version '3.6.2.RELEASE' in scope 'null' which is already present.

顶(0) 踩(0) 回复

朱劲松 2013-11-20 23:20

感谢 OSGI 中文社区网,这可是OSGI在国内推动的主力啊...

顶(0) 踩(0) 回复

chuan 2013-11-20 10:19

请问:Virgo概括来说,是不是类似Tomcat一样的应用服务器,只不过Virgo内的App是bundle?

顶(0) 踩(0) 回复

woozyangel 2013-08-23 15:18

嗯,virgo介绍的一篇好文啊!

顶(0) 踩(0) 回复

KIRA 2013-08-22 15:34

网站很新, 做得不错

顶(0) 踩(0) 回复

罗俊杰 2013-08-20 18:57

回复snoopy7713: 非常欢迎:)

顶(0) 踩(0) 回复

snoopy7713 2013-08-20 15:03

Virgo的配置没有写,等我写一份提交上去

顶(2) 踩(0) 回复

YiFei 2013-01-29 14:58

嗯 看了这个,感觉对virgo了解不少!

顶(9) 踩(8) 回复
查看评论