在同一容器中部署不同版本的OSGI应用程序堆栈

时间:2013-03-30 09:17:31

标签: architecture osgi

我正在构建一个具有REST前端的API,整个堆栈包含近10个不同的包,并且正在慢慢增长。到目前为止,这很有效。

从长远来看,我计划使用不同版本的API堆栈(使用OSGi多功能机制),可以通过REST前端以/api/v2/path/to/resource或类似的方式访问。

我的第一个想法就是为新版本部署整个堆栈,例如。安装我的所有捆绑包。新的REST包将在蓝图中向jaxrs-server添加/api/<version-number>,一切都应该有效,但我担心的是从长远来看会有很多捆绑包。我觉得我将失去已安装捆绑包的整体概况等等。

有没有办法以某种方式分隔我的筹码? 我不想为每个版本安装新容器。我看了一下Karaf的实例,但是我能够像在同一个实例中安装捆绑包那样“追加”到jaxrs-servers吗?例如。访问同一主机,端口等上的REST前端。

由于

2 个答案:

答案 0 :(得分:2)

我肯定会在版本之间进行一些隔离。

当然,OSGi版本控制功能非常强大,但是如果您计划部署相同捆绑包的许多不同版本,那么最好将所有接线完全正确或者您将遇到很难调试问题。此外,您可能会通过部署更新的版本来破坏旧版本,这是(我猜)您想要阻止的版本。

在Karaf中,实例之间的分离对您来说可能有点过于沉重,因为您无法在实例之间轻松共享捆绑包。

解决此问题的OSGi标准称为子系统,这确实允许您执行您想要的操作,即具有不同范围的子应用程序,这些应用程序将共享其大部分代码,例如http服务器。

这个标准很新,我不认为有一个成熟的实现,但我建议看看Eclipse Virgo。处女座不支持子系统(但是?)但是Virgo有一个“计划”的概念,我认为这个概念将用于你的目的。

答案 1 :(得分:2)

我同意隔离很重要。 OSGi框架仅用于托管单个“应用程序”。如果将多个应用程序部署到同一框架而不隔离,则会在两者之间产生干扰,例如不希望的软件包和服务共享。

例如,您可以彻底测试一个应用程序并发现它有效。然后你彻底测试第二个应用程序,发现它也有效。最后,将它们都部署到OSGi框架中,发现它们都不起作用!这不好......

子系统规范确实提供了隔离,但它很复杂且实现不成熟。我建议简单地实例化多个OSGi框架。这可以在单个JVM中轻松完成,OSGi中没有可防止它的静态或单例。实例化OSGi框架所需的基本代码大约为5-10行。

更新:有关如何实例化新OSGi框架的详细信息,请参阅我的博文"How to Embed OSGi"