3

OSGi 采用面向服务的体系结构:捆绑注册服务对象,其他捆绑使用。服务发布和绑定由框架管理。这将服务提供者与服务用户完全分离(除了需要就服务接口达成一致)。

有没有办法限制(通过配置)哪些服务对哪些捆绑可见?

例如,如果我有一个 HttpService,那么所有想要这样做的包都可以将 servlet 安装到其中。我想让选择性捆绑包看不到 HttpService 。

额外积分:除了过滤服务注册之外,还可以修改注册属性。因此,即使捆绑包注册了 Servlet alias=/admin,我也可以将其更改为alias=/somethingelse供 Pax Web Extender Whiteboard 使用。

4

6 回答 6

2

即将发布的 OSGi 规范 R4.2 定义了一个名为 Find Hook 的组件,该组件允许:
“检查返回的服务引用集并可选择缩小返回的服务集”

请参阅
http://www.osgi.org/download/r4-v4.2-core-draft-20090310.pdf第 12.5 节

请注意,R4.2 还不是最终版本,但我仍然相信主要的 OSGi 实现(Felix 和 Equinox)已经在其主干中包含了此附加功能的代码

于 2009-07-07T19:42:38.480 回答
2

有没有办法限制(通过配置)哪些服务对哪些捆绑可见?

如您所知,可以过滤服务属性,尽管这可能无法提供您所要求的那种控制:服务对框架中部署的其他包仍然可见。

在 SpringSource 的 dm 服务器(一个开源、模块化、基于 OSGi 的 Java 应用程序服务器)中,应用程序可以在部署时进行Scoped 。这允许您部署多个应用程序(在单独的范围内),这些应用程序可能包括不一致版本的依赖包,同时仍然允许共享公共包(通过将它们部署在范围之外 - 在所谓的全局范围内)。

如果一个范围内的应用程序/捆绑包注册了一个 OSGi 服务,则它仅对同一范围内的捆绑包可用。(服务也是“范围”的。)

这并不神奇:服务器封装了 OSGi 服务接口并使用“幕后”的服务属性来执行即时所需的过滤。

我认为这会给你你正在寻找的那种分离。

有关 dm Server 的信息(不要与 Spring DM 混淆),请访问SpringSource.org dmServer 页面

史蒂夫鲍威尔
SpringSource;dm 服务器开发

于 2009-05-15T16:27:59.500 回答
1

我没有尝试过,但似乎它可以帮助你......

在 OSGi R4 组件规范中描述了“配置管理服务”,从 5 分钟的检查来看,它似乎能够动态地改变服务。

最终,我认为这将取决于您根据一些商定的配置值来控制对服务的访问

于 2009-05-15T13:25:38.393 回答
1

有没有办法限制(通过配置)哪些服务对哪些捆绑可见?

使用服务属性无法做到这一点。您可以定义自己的服务属性,指定哪些包应该使用您正在导出的服务,但是没有办法阻止其他包也使用它。

额外积分:除了过滤服务注册之外,还可以>修改注册属性。因此,即使捆绑包使用 >alias=/admin 注册了一个 Servlet,我也可以将其更改为 alias=/somethingelse 以供 Pax Web >Extender Whiteboard 使用。

嗯......这是一个艰难的。您可以定义自己的 Servlet 接口“MyServlet”并使用该接口导出您的 Servlet。然后,另一个包可以使用这些 MyServlet 并将它们重新导出为具有修改的服务属性的 Servlet。

除此之外……不知道。

于 2009-05-15T13:14:07.330 回答
0

For extra credits: In addition to just filtering service registrations, the ability to modify registration properties. So that even if a bundle registers a Servlet with alias=/admin, I can change that to alias=/somethingelse for consumption by Pax Web Extender Whiteboard.

using iPOJO you can change properties of the exposed services pretty simple. It has bunch of other features, which could be interessting to someone using OSGi a lot.

于 2009-07-07T15:05:34.283 回答
0

如果您想限制服务的可见性,最好的办法是启用 OSGi 安全性。它旨在限制哪些服务、包和其他东西对哪些捆绑包可见。例如,您可以只为您签名的捆绑包提供特定服务(或使用各种其他标准)。

另一个选项,已经提到过,它使用 4.2 服务挂钩,它允许一种“自己动手”的安全机制。

第二个问题,更改属性(例如注册服务的端点),您可以通过注册服务时返回的 ServiceRegistration 来执行此操作。可以通过成为 ManagedService 来触发更改,并使用 ConfigurationAdmin 自行配置。

于 2010-05-11T22:45:20.317 回答