1

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

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

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

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

谢谢

4

2 回答 2

2

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

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

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

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

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

于 2013-03-30T10:44:26.340 回答
2

I agree that isolation is important. The OSGi Framework was only ever designed to host a single "application". If you deploy multiple applications to the same framework without isolation, you will get interference between the two, such as undesired sharing of packages and services.

For example, you could thoroughly test one application and find that it works. Then you thoroughly test a second application and find that it also works. Finally you deploy both of them into an OSGi framework and find that neither works! This is not good...

The subsystems spec does provide isolation but it is complex and the implementations immature. I would suggest simply instantiating multiple OSGi frameworks. This can be done easily within a single JVM, there are no static or singletons in OSGi that would prevent it. The basic code required to instantiate an OSGi framework is around 5-10 lines.

UPDATE: For detailed information on how to instantiate a new OSGi Framework, see my blog post "How to Embed OSGi"

于 2013-03-30T16:23:24.620 回答