【问题标题】:How can I filter OSGi service visibility?如何过滤 OSGi 服务可见性?
【发布时间】:2010-10-26 09:06:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java configuration osgi whiteboard


    【解决方案1】:

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

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

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

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

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

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

    有关 dm 服务器的信息(不要与 Spring DM 混淆)请访问SpringSource.org dmServer page。

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

    【讨论】:

    • 这个应用程序范围的功能(PAR 文件?)看起来非常有用。 PAR机制可以在dm Server之外使用吗?标准 OSGi 的作品中是否有类似的东西?在 Java Posse 播客上有关于“嵌套框架”的讨论,似乎朝着这个方向发展。
    【解决方案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)已经在其主干中包含了此附加功能的代码

    【讨论】:

      【解决方案3】:

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

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

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

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

      除此之外……不知道。

      【讨论】:

      • 是的,如果我可以更改提供服务的捆绑包或使用它的捆绑包,我就可以控制发生的事情。但我想在不触及这些捆绑包的情况下做到这一点。 OSGi 已经透明地管理了所有服务绑定(对消费者和生产者),我希望在流程中加入一些挂钩。
      • 嗯......据我所知,目前使用普通 OSGi 是不可能的。正如 Steve Powel 指出的那样,您将有更多使用 Spring dm 服务器的可能性。
      【解决方案4】:

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

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

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

      【讨论】:

      • 是的,托管服务和服务组件运行时确实允许大量运行时配置。但是,服务提供者需要使用 SCR,它不能与“普通”(非声明性)服务一起使用。
      【解决方案5】:

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

      使用iPOJO,您可以非常简单地更改公开服务的属性。它还有很多其他功能,对于经常使用 OSGi 的人来说可能会很有趣。

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-31
          • 1970-01-01
          • 2010-09-23
          • 2014-12-02
          • 2013-06-14
          • 1970-01-01
          • 1970-01-01
          • 2012-05-11
          相关资源
          最近更新 更多