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

and*_* k 7 osgi eclipse-virgo

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

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

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

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

我们正在构建一个网络应用程序,我们预计很快就会有数百个客户(公司),每个用户数量达到数百名(员工),否则为什么会这么麻烦;).我们希望使其模块化,因此OSGi.在未来,客户自己可能会开发和插入组件到他们的应用程序,因此我们需要客户隔离.我们也可能希望不同的客户获得不同的功能集.

当不同的客户端共享相同的捆绑包时,为应用程序的不同客户端提供不同的服务实现的"正确"方法是什么?

我们可以使用app-server方法(我们已经查看过Virgo)并将每个客户的每个包加载到他们自己的"app"中.然而,它不喜欢拥抱OSGi.我们没有托管多个应用程序,99%的服务将共享相同的impl.为所有客户.我们还希望将应用程序作为一个进行管理(配置,监视等).

每个服务都可以为每个客户注册(正确配置)一次,以及一些"客户令牌"属性.它有点乱,需要使用扩展模式或ManagedServiceFactory来处理?在为客户A注册服务之前,还需要获取每个依赖项的A版本.

每个请求都将知道"当前"客户,并且可以绑定到该线程.每次搜索服务时都必须提供客户令牌,这有点乱.这使得很难使用蓝图等组件框架.为了解决这个问题,我们可以使用服务挂钩来代理每个注册的服务类型,并让代理根据当前客户(线程)调度到正确的实例.

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

PS.感谢您一直在这里阅读!;)

Mar*_*ans 5

解决方案有几个方面:

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

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

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

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

  1. 一旦请求进入(例如在您的HTTP servlet中),就会以某种方式确定客户ID.
  2. 在服务依赖项链中明确传递该ID.
  3. 仅使用类似于在单个包的边界内使用线程本地的解决方案,例如,如果您在捆绑包中使用需要此第三方库来跟踪客户的第三方库.