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

问题描述 投票:0回答:2

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

从长远来看,我计划拥有不同版本的 API 堆栈(使用 OSGi 版本控制机制),可以通过 REST 前端以

/api/v2/path/to/resource
或类似格式进行访问。

我的第一个想法是为新版本部署整个堆栈,例如。安装我所有的包。新的 REST-bundle 将在蓝图中将

/api/<version-number>
添加到 jaxrs-server 中,一切都应该正常工作,但我担心的是,从长远来看,将会部署大量的包。我感觉我将失去已安装捆绑包等的整体概览。

有什么方法可以以某种方式分离我的堆栈吗? 我不想为每个版本安装新容器。我已经查看了一些 Karaf 的实例,但是我是否能够以与捆绑包安装在同一实例中相同的方式“附加”到 jaxrs-servers?例如。访问同一主机、端口等上的 REST 前端。

谢谢

architecture osgi
2个回答
2
投票

我同意隔离很重要。 OSGi 框架仅被设计用于托管单个“应用程序”。如果您将多个应用程序部署到同一个框架而不进行隔离,那么两者之间将会产生干扰,例如不必要的包和服务共享。

例如,您可以彻底测试一个应用程序并发现它可以工作。然后,您彻底测试了第二个应用程序,发现它也可以工作。最后,您将它们都部署到 OSGi 框架中,却发现两者都不起作用!这不太好吧……

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

更新:有关如何实例化新 OSGi 框架的详细信息,请参阅我的博客文章 “如何嵌入 OSGi”


2
投票

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

诚然,OSGi 版本控制非常强大,但如果您计划部署同一包的许多不同版本,您最好让所有接线正确无误,否则您将遇到非常难以调试的问题。另外,您可能会通过部署新版本来搞乱旧版本,这(我猜)正是您想要防止的。 在 Karaf 中,实例之间的分离对您来说可能有点太重了,因为您无法轻松地在实例之间共享捆绑包。

解决这个问题的 OSGi 标准称为子系统,这确实允许您做您想做的事情,即拥有不同范围的子应用程序,这些子应用程序将共享大部分代码,例如 http 服务器。

这个标准相当新,我认为还没有成熟的实现,但我建议看看

Eclipse Virgo

。处女座不支持子系统(还?),但处女座有一个“计划”的概念,我认为这将满足您的目的。

© www.soinside.com 2019 - 2024. All rights reserved.