Service 为什么我更喜欢OSGi服务而不是导出的包?

Service 为什么我更喜欢OSGi服务而不是导出的包?,service,osgi,late-binding,Service,Osgi,Late Binding,我正试图了解OSGi服务。我一直在问自己的主要问题是:使用服务而不是使用捆绑包及其导出包有什么好处 据我所知,似乎后期绑定的概念与此有关。Bundle依赖项在Bundle开始时连接在一起,所以我想它们是相当固定的。但在服务方面,情况似乎几乎是一样的。捆绑包启动并注册服务或绑定到服务。当然,服务可以随时来来去去,你必须跟踪这些机会。但核心理念对我来说似乎没有什么不同 另一个方面似乎是服务更加灵活。对于一个特定的接口,可能有许多实现。另一方面,对于特定的导出包,也可能有许多不同的实现 在另一篇文章中

我正试图了解OSGi服务。我一直在问自己的主要问题是:使用服务而不是使用捆绑包及其导出包有什么好处

据我所知,似乎后期绑定的概念与此有关。Bundle依赖项在Bundle开始时连接在一起,所以我想它们是相当固定的。但在服务方面,情况似乎几乎是一样的。捆绑包启动并注册服务或绑定到服务。当然,服务可以随时来来去去,你必须跟踪这些机会。但核心理念对我来说似乎没有什么不同

另一个方面似乎是服务更加灵活。对于一个特定的接口,可能有许多实现。另一方面,对于特定的导出包,也可能有许多不同的实现

在另一篇文章中,我读到使用导出包的缺点是它们使应用程序比服务更脆弱。作者写道,如果从依赖关系图中删除一个bundle,其他依赖关系将不再满足,因此可能会对整个图造成多米诺效应。但是,如果一个服务离线,难道不会发生同样的情况吗?在我看来,服务依赖性并不比捆绑依赖性好多少

到目前为止,我还没有找到一篇博客文章、书籍或演示文稿能够清楚地描述为什么服务比通过导出和导入包来公开功能更好

总结我的问题:

使用OSGi服务使其优于导出和导入包的主要好处是什么


附加 我试图收集关于这个问题的更多信息,并对包裹和服务的简单出口/进口进行比较。也许这会帮助我们找到一个令人满意的答案

  • 开始/停止/更新

    捆绑包(包)和服务都可以启动和停止。除此之外,它们还可以进行某种更新。服务还与捆绑包生命周期本身相关。但在本例中,我的意思是如果您可以启动和停止服务或捆绑包(以便导出的包“消失”)

  • 跟踪变化

    ServiceTracker和BundleTracker使跟踪捆绑包和服务可用性的变化并作出反应成为可能

  • 与其他捆绑包或服务的特定依赖关系

    如果要使用导出的包,则必须导入它

    Import-Package: net.jens.helloworld
    
    如果net.jens.helloworld提供服务,我还需要导入包以获得接口

    因此,在这两种情况下,它们都是某种“紧密耦合”到或多或少特定的包

  • 能够有多个实现

    可以通过多个包导出特定包。可能存在由捆绑包a和捆绑包B导出的包net.jens.twitterclient。这同样适用于服务。捆绑包A和B可以发布接口net.jens.twitterclient.TwitterService

  • 在此总结一个简短的比较(导出的包/服务):

  • 是/是
  • 是/是
  • 是/是
  • 是/是
  • 所以没有区别

    此外,服务似乎增加了更多的复杂性,并引入了另一层依赖关系(见下文)

    因此,如果导出的包和服务之间没有真正的区别,那么使用服务的好处是什么

    我的解释是:

    服务的使用似乎更加复杂。但服务本身似乎更轻量级。如果您启动/停止整个捆绑包,或者只是启动和停止特定服务,那么(在性能和资源方面)应该有所不同

    从建筑的观点来看,我也认为捆绑可以被看作是应用的基础。基础不应该在开始和停止捆绑时经常发生变化。该功能由该包的服务在“bundle层”之上的某种动态层中提供。这个“服务层”可能会经常更改。例如,如果数据库处于脱机状态,则查询数据库的服务将取消注册



    你怎么看?我是否已经开始了解服务的全部要点,还是我的想法仍然错误?与导出包相比,我是否缺少了使服务更具吸引力的东西?

    我认为这篇优秀的文章可以回答您的许多问题:

    当您开始使用OSGi时,使用导出包方法总是更容易,它当然更像java。但是,当您的应用程序开始增长,并且您需要一点动态性时,服务就是最好的选择

    导出包仅在启动时执行解析,而服务是一个持续的解析(您可能想要或不想要)。从支持的角度来看,拥有服务可能非常可怕(它是确定性的吗?我如何复制问题?),但它也非常强大

    解释了为什么他认为服务是一种范式转换,就像OO在它的时代一样。见和


    在我所有的OSGi经验中,我还没有机会实现复杂的服务(即多个层),当然注释似乎是一条可行之路。您还可以使用来减轻处理服务跟踪器的痛苦。(还有许多其他选项,如和)

    我建议购买这本书。它很好地解释了服务,并完成了使用OSGi服务的非平凡应用程序的构建

    我的公司通常使用服务构建100多个捆绑应用程序。我们从使用服务中获得的主要好处是:

    1) 生产者/消费者实现的松散耦合

    2) 热插拔服务提供商

    3) 清洁剂应用