【问题标题】:Deploying different versions of OSGI-application stack in the same container在同一个容器中部署不同版本的 OSGI 应用程序堆栈
【发布时间】:2013-03-30 09:17:30
【问题描述】:

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

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

我的第一个想法就是为新版本部署整个堆栈,例如。安装我所有的捆绑包。新的 REST-bundle 将在蓝图中将 /api/<version-number> 添加到 jaxrs-server 并且一切都应该工作,但我担心从长远来看将会部署大量的 bundle。我感觉我将失去对已安装捆绑包等的总体概览。

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

谢谢

【问题讨论】:

    标签: architecture osgi


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!您是否有任何链接到示例如何实例化 OSGi?是否可以通过 Felix Web Console 之类的工具进行管理?
    • @Marcus:我已经用一些示例代码添加了一个指向我的答案的链接。至于用 Felix Web 控制台管理这个……不,目前还不可能,因为 Web 控制台只知道一个 OSGi 框架。
    【解决方案2】:

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

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

    在 Karaf 中,实例之间的分离对您来说可能有点太重了,因为您不能轻松地在实例之间共享捆绑包。

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

    这个标准很新,我认为没有成熟的实现,但我建议看看Eclipse Virgo。 Virgo 不支持子系统(还没有?),但 Virgo 有一个“计划”的概念,我认为它会为您服务。

    【讨论】:

    • 子系统看起来很有前途,期待到时候尝试一下 :) 那么您今天推荐的是真正运行单独的容器实例,还是有其他方法可以隔离我的堆栈?
    • 子系统的 RI 是 Apache Aries 的一部分。但是没有可用的二进制下载(截至 2013 年 3 月 31 日),看来您必须从源代码构建 Aries。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2014-01-08
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2013-05-15
    相关资源
    最近更新 更多