gpt4 book ai didi

osgi - 如何为每个客户端配置 OSGi 服务

转载 作者:行者123 更新时间:2023-12-04 12:00:11 28 4
gpt4 key购买 nike

我们正在开发一个网络应用程序(我们称之为图像库),我们已经确定了以下需求:

  • 该应用程序迎合由一组用户组成的客户。
  • 可以动态创建新客户并由客户管理其用户
  • 客户有不同的功能集,可以动态更改
  • 客户可以开发自己的功能并进行部署。
  • 应用是同构的,有当前版本,但客户的版本提升仍然可以单独处理。
  • 应用程序应该作为一个整体进行管理,客户共享应该易于扩展的资源。

  • 问题:我们应该在标准的 OSGi 框架上构建它,还是使用新兴的应用程序框架之一(Virgo、Aries 或即将推出的 OSGi 标准)更好?

    更多背景和一些初步想法:

    我们正在构建一个网络应用程序,我们设想它很快就会拥有数百个客户(公司),每个客户(员工)有数百个用户,否则为什么要麻烦;)。我们想让它模块化,因此 OSGi。将来客户自己可能会开发和插入组件到他们的应用程序中,所以我们需要客户隔离。我们还可能希望不同的客户获得不同的功能集。

    当不同的客户端共享相同的包时,向应用程序的不同客户端提供不同服务实现的“正确”方式是什么?

    我们可以使用应用程序服务器方法(我们已经查看了 Virgo)并将每个客户的每个捆绑包一次加载到他们自己的“应用程序”中。然而,它并不像拥抱 OSGi。我们没有托管大量应用程序,99% 的服务将共享相同的 impl。为所有客户。此外,我们希望将应用程序作为一个整体进行管理(配置、监控等)。

    可以为每个客户注册(正确配置)每个服务以及一些“客户 token ”属性。这有点困惑,必须使用扩展器模式或 ManagedServiceFactory 来处理?此外,在为客户 A 注册服务之前,需要获取其每个依赖项的 A 版本。

    每个请求都知道“当前”客户,并且可以绑定(bind)到线程。每次搜索服务时都必须提供客户 token 有点麻烦。这使得使用像蓝图这样的组件框架变得很困难。为了解决这个问题,我们可以使用服务 Hook 来代理每个注册的服务类型,并让代理根据当前客户(线程)分派(dispatch)到正确的实例。

    通过实现上面的解决方法(hack?)开始我们的整个 OSGi 体验真的感觉像是我们走错了路。那么我们应该怎么做呢?回到处女座?尝试类似于上面概述的内容?完全不同的东西?!

    附言。感谢您一直阅读这里! ;)

    最佳答案

    解决方案有几个方面:

    首先,您需要找到一种方法来配置您拥有的不同客户。在 ConfigurationAdmin 之上构建解决方案在这里很有意义,因为这样您就可以尽可能地利用现有的 OSGi 标准。您可能想要在上面构建一些东西的原因是 ConfigurationAdmin 允许您配置每个单独的服务,但您可能希望在上面添加一个层,以便您可以更方便地一次性配置整个应用程序(捆绑包的组合)。然后可以将这样的配置转换为服务的单独配置。

    向具有客户特定实现的服务添加属性非常有意义。您可以使用 ManagedServiceFactory 对其进行设置,并且该属性使您可以轻松地使用过滤器为正确的客户查找服务。您甚至可以定义一个备用方案,您可以在其中查找特定于客户的服务或通用服务(因为并非所有服务都可能是特定于客户的)。由于您需要将此类过滤器显式添加到您的依赖项中,我建议您采用现有的依赖项管理解决方案并将其扩展为您的特定用例,以便依赖项自动添加正确的客户特定过滤器,而无需您手动指定。我意识到我可能需要在这里更详细地介绍,只是让我知道......

    接下来的问题是,如何在您的应用程序中跟踪客户“上下文”。传统上这里只有几个选项,线程本地上下文是最常用的一个。但是,将线程绑定(bind)到客户确实会限制您的实现选项,因为通常这可能意味着您必须禁止开发人员自己创建线程,并且很难将某些任务卸载到工作线程池中。如果您决定使用远程服务,情况会变得更糟,因为这意味着您将完全失去上下文。

    因此,为了将客户身份从一个组件传递到另一个组件,我个人更喜欢以下解决方案:

  • 一旦请求进入(例如在您的 HTTP servlet 中),就会以某种方式确定客户 ID。
  • 将该 ID 显式传递到服务依赖链中。
  • 仅使用解决方案,例如在单个捆绑包的边界内使用线程局部变量,例如,如果您在捆绑包中使用第三方库,需要它来跟踪客户。
  • 关于osgi - 如何为每个客户端配置 OSGi 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4927657/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com