什么是OSGi的解决?什么是OSGi的解决?(What does OSGi solve?)

2019-05-14 05:18发布

我读过关于维基百科以及有关其他网站OSGi的 ,但我真的没有看到大局。 它说,它是一个基于组件的平台,你可以在运行时加载的模块。 也处处给予“实际例子”是Eclipse插件框架。

我的问题是:

  1. 什么是OSGi的的简单明了的定义是什么?

  2. 它解决什么共同的问题?

通过“常见问题”我的意思是问题,我们每天面对的,比如“可以使我们的工作更有效率/开心/简单的OSGi做什么?”

Answer 1:

有什么好处没有OSGi的组件系统为您提供?
好了,这是一个相当列表:

降低复杂性-与OSGi技术显影机构包:OSGi的组件。 捆绑的模块。 他们隐藏其他捆绑他们的内部,并通过明确定义的服务进行通信。 隐藏内部意味着更多的自由以后更改。 这不仅降低了错误的数量,这也使得束易于开发,因为正常大小的包实现通过良好定义的接口一块功能。 还有是描述其发展过程中做了什么,OSGi技术一个有趣的博客。

重用- OSGi的组件模型使得它很容易在应用程序中使用多种第三方组件。 越来越多的开源项目提供他们的JAR准备OSGi的制作。 然而,商业库也变得可用的现成软件包。

真实世界- OSGi框架是动态的。 它可以动态更新包和服务能来来去去。 开发人员使用更传统的Java认为这是一个非常有问题的功能而看不到的优点。 然而,事实证明,现实世界是高度动态的,并且具有动态服务,可以来来去去,使服务完美匹配许多现实世界的情景。 例如,服务可以建模网络中的设备。 如果检测到设备,该服务被注册。 如果设备消失,该服务被注销。 有匹配这种动态服务模型,真实世界的场景数量惊人。 因此,应用程序可以在自己的域重复利用的服务注册(注册,得到,有表现力的过滤语言列表,并等待服务的出现和消失)强大的原语。 这不仅节省了编写代码,还提供了全球知名度,调试工具和更多的功能比会实施了一个专门的解决方案。 在这样的动态环境中写代码听起来像是一场噩梦,但幸运的是,有,是采取最如果不是所有的痛苦了它支持类和框架。

易于部署-在OSGi技术不仅仅是组件的标准。 它还指定组件是如何安装和管理。 这个API已经被许多包提供了管理代理。 此管理代理可以是作为命令壳,TR-69管理协议驱动程序,OMA DM协议驱动程序,亚马逊的EC2云计算接口,或IBM Tivoli管理系统一样简单。 标准化的管理API使得它很容易在现有的和未来的系统OSGi技术集成。

动态更新 - OSGi的组件模型是一个动态模型。 包可以安装,启动,停止,更新,而无需关闭整个系统卸载。 许多Java开发人员不相信这能够可靠地完成,因此最初并不在生产中使用这个。 然而,在发展了一段时间使用之后,最开始认识到它的实际工作,并显著减少了部署时间。

自适应- OSGi的组件模型从底层设计为允许组分的混合和匹配。 这就要求组件的依赖需要指定它需要的组件住在其可选的依赖并不总是可用的环境。 OSGi服务注册表是一个动态的注册表,其中束可以注册,获取,并听取服务。 这种动态服务模型允许bundles找出哪些功能是可以在系统上,并适应他们可以提供的功能。 这使得代码更灵活和有弹性的变化。

透明度-包和服务在OSGi环境一等公民。 管理API提供访问束的内部状态,以及它是如何连接到其他包。 例如,大多数的框架提供了一个命令外壳,示出了该内部状态。 该应用程序的部分可以停下来调试一定问题,或诊断程序软件包可带入,而是在数以百万计的日志输出和长重启时间线的盯着,OSGi应用程序通常可以用活命令shell调试。

版本- OSGi技术解决了JAR地狱。 JAR到底是库中的作品与库B中的问题;版本= 2,但是库C只能为B工作;版本= 3。 在标准的Java,你的运气了。 在OSGi环境,所有的包都经过精心版本,只能够合作束在同一个班级的空间连接在一起。 这允许包A和C用自己的图书馆工作。 虽然不建议它来设计这个版本问题的系统,它可以在某些情况下,一个生命的救星。

简单- OSGi的API是出奇的简单。 核心API只有一个包且小于30的类/接口。 这个核心API足够写包,进行安装,启动,停止,更新和卸载它们,包括所有的监听器和安全类。 有迹象表明,提供这么少API这么多的功能非常少的API。

小- OSGi的版本4 Framework可以在大约300KB的JAR文件来实现。 这是由包括OSGi的加入到一个应用程序的功能量小的开销。 因此OSGi的运行在一个大范围的设备:从非常小的,小到大型机。 它仅要求一个最小的Java虚拟机运行,并增加了很少在它的上面。

快速 -一个的OSGi框架的主要责任是从束加载的类。 在传统的Java,JAR文件是完全可见的,并放置一个线性名单。 搜索类需要通过这个搜索(通常很长,150的情况并不少见)名单。 与此相反,OSGi的预电线束,并知道对于每个束到底是哪束提供的类。 这种缺乏搜索的是在启动时显著加快的因素。

懒惰-懒惰软件是好的,OSGi技术有很多机制,在真正需要的时候,他们只能做的事情。 例如,束可以开始急切地,但他们也可以配置在其他捆绑使用他们才开始。 服务可以注册,但只使用它们时创建的。 规格已经优化了几次,让这些种类的懒惰场景,可以节省巨大的成本运行。

安全- Java有一个在底部的非常强大的细粒度的安全模型,但它已经被证明很难在实践中进行配置。 其结果是,最安全的Java应用程序与一个二元选择运行:没有安全或非常有限的能力。 OSGi的安全模式充分利用了细粒度的安全模型,而是由具有捆开发商指定的审计轻松的形式要求的安全细节,而环境的运营商负责全面提高保持可用性(以及硬化原始模型)。 总体而言,OSGi的可能提供了仍是硬件保护的计算平台可用短最安全的应用环境之一。

非侵入式-应用程序(包)在OSGi环境中留给自己。 他们几乎可以使用虚拟机的任何设施,而不在OSGi限制他们。 在OSGi的最佳实践是编写普通Java对象,为此,对OSGi服务不需要特殊的接口,甚至是一个Java String对象可以作为OSGi服务法。 这种策略使得应用程序的代码更容易地移植到另一个环境。

到处奔走-嗯,这要看情况。 爪哇最初的目标是在任何地方运行。 很显然,这是不可能到处运行的所有代码,因为Java虚拟机的能力是不同的。 某个虚拟机在手机将有可能不支持相同的库运行一个银行应用程序的IBM大型机。 有两个问题照顾。 首先,在OSGi的API不应该使用并非适用于所有环境类。 其次,如果它包含的代码,是不是在执行环境中可用捆绑就不应该开始。 这两个问题已在OSGi规范得到照顾。

来源: www.osgi.org/Technology/WhyOSGi



Answer 2:

我发现从OSGi的以下优点:

  • 每个插件是一个版本神器,有它自己的类加载器。
  • 每个插件都取决于它同时包含特定的罐子以及其他特定版本的插件。
  • 因为版本控制和分离的类加载器,相同的伪影的不同版本可以在同一时间被加载。 如果您的应用程序的一个组件依赖于一个插件的一个版本,另一个依赖于另一个版本,它们都可以在同一时间被加载。

有了这个,你可以构建应用程序为一组按需加载插件版本文物。 每个插件是一个独立的组件。 正如Maven的帮助你组织你的构建,因此是可重复的,并通过它是由创建一组工件的特定版本的定义,OSGi的帮助你在运行时做到这一点。



Answer 3:

我没有太在意的OSGi的模块(至少目前)的hotplugability。 它更强制的模块化。 由于没有在任何时候类路径上百万的“公共”类可以从循环依赖保护得好:你要认真考虑一下你的公共接口 - 不只是在Java语言结构“公共”的条款,但在你的库方面/模块:什么(究竟)是组件,那你想提供给其他人? 什么(究竟)是(其他模块)的接口,你真的需要实现的功能?

这是很好的,是热插拔,用它,但我宁愿重新启动我的应用程序通常比测试hotplugability的所有组合...



Answer 4:

  • 您可以类比来说,改变你的车的电机,而不将其关闭。
  • 您可以自定义客户复杂的系统。 见的Eclipse的力量。
  • 您可以重复整个组件。 不仅仅是物体更好。
  • 您可以使用一个稳定的平台,开发基于组件的应用程序。 这样的好处是巨大的。
  • 你可以建立与黑盒子概念组成部分。 其他组件不需要知道隐藏的接口,他们看到的只是发布的接口。
  • 您可以在同一系统中几个分量相等使用,但在不同的版本中,毫不妥协的应用。 OSGi的解决罐地狱问题。
  • 使用OSGi您开拓思维建筑师系统的CBD

有很多的好处(我只是提醒现在这些),供大家谁使用Java。



Answer 5:

编辑的清晰度。 OSGi的页面给了一个更好的简单的答案比我

一个简单的回答:OSGi服务平台为配合网络服务的标准化,面向组件的计算环境。 这种架构显著降低建设,维护和部署应用程序的整体复杂性。 OSGi服务平台提供的功能以动态地改变该组合物的各种网络的设备上,而不需要重新启动。

在一个单一的应用程序结构,说了Eclipse IDE,它不是一个大问题,当你安装一个新的插件重新启动。 完全使用OSGi实现,你应该能够在运行时添加的插件,获得新的功能,但没有重新启动Eclipse的。

同样,也不是什么大不了的每一天,小应用程序使用。

但是,当你开始看多的计算机,分布式应用程序框架,这就是它开始变得有趣了。 当你必须有关键系统的100%的正常运行时间,该能力的组件热插拨或添加新的功能,在运行时是非常有用的。 当然,也有现在这样做的大部分功能,但OSGi是试图捆绑一切与常用接口一个不错的框架。

是否OSGi的解决共同的问题,我不知道这一点。 我的意思是,是可以的,但是开销可能不值得为简单的问题。 但它的东西,当你开始对付更大,网络化,应用的考虑。



Answer 6:

几件事情,我发疯OSGi的:

1)implentations及其背景装载机有很多怪癖他们,可能有些异步(我们使用菲利克斯汇合内)。 相比于[主要]是相当多通过一切同步运行的纯弹簧(无DM)。

2)类是不是一个热负荷之后相等。 说,比如你有冬眠Tangosol的缓存层。 它充满了Fork.class,OSGi的范围之外。 您hotload一个新的罐子,叉并没有改变。 类[叉]!=类[叉]。 它还序列化过程中出现,对于相同的根本原因。

3)聚类。

您可以解决这些事情,但它是一个重要的重大的痛苦,使你的架构看起来有缺陷的。

而对于那些在广告的热插拔.. OSGi的#1客户端? 日食。 什么是Eclipse中加载捆绑后做什么?

它重新启动。



Answer 7:

我还没有成为OSGi的一个“粉丝” ......

我一直在努力与财富100强公司的企业应用程序。 最近,我们使用的产品已经“升级”到OSGi实现。

当地开始部署CBA ... 14年2月18日8:47:23:727 EST] 00000347 CheckForOasis

最后部署和“以下束将处于静默状态,然后重新启动” [14年2月18日9:38:33:108 EST] 00000143 AriesApplicat我CWSAI0054I:作为用于应用的更新操作的一部分

51分钟......每一次代码修改......以前的版本(非OSGi的)将部署在较旧的开发机器不到5分钟。

用16演出公羊和40自由演出磁盘和英特尔i5-3437U 1.9GHz的CPU的计算机上

该次升级的“利”销售作为改善(生产)的部署 - 我们做了一年约4倍,也许2-4的小补丁部署一年的活动。 每天增加45分钟到15人(QA和开发人员),我无法想象被合理的。 在大型企业应用,如果应用程序是核心应用程序,然后改变它,这是正确的(小的变化具有潜在的深远影响 - 都必须在企业进行沟通,并计划与消费者),一个巨大的活动 - 错误的架构OSGi的。 如果您的应用程序不是一个企业应用程序 - 即每个消费者都可以有自己定制的模块可能击中自己的数据筒仓在自己的竖井式的数据库和承载多种应用的服务器上运行,那么也许看看OSGi的。 至少,这是我的经验,迄今。



Answer 8:

如果基于Java的应用程序需要增加或移除模块(延伸应用的基本功能),而无需关闭JVM,OSGI可以采用。 通常,如果关闭JVM的成本更多,只更新或增强功能。

例子

  1. Eclipse的 :提供平台的插件安装,卸载,更新和相互依靠。
  2. AEM:WCM应用程序,其中功能改变将业务驱动的,这是不能承受的停机时间进行维修。

:Spring框架停止支持OSGI春捆,考虑到它的基于交易的应用程序或在这些行的某些点作为不必要的复杂性。 我个人不认为OSGI,除非它是绝对必要的,在一些大像建立一个平台。



Answer 9:

OSGi的使你的代码抛出NoClassDefFoundErrorClassNotFoundException没有明显的原因(最有可能是因为你忘了导出OSGi的配置文件包); 因为它的类加载器它可以让你的类com.example.Foo无法被转换为com.example.Foo ,因为它实际上是由两个不同的类加载器加载两个不同的类。 它可以安装一个Eclipse插件后,让您的Eclipse启动进入一个OSGi控制台。

对我来说,唯一的OSGi增加了复杂性(因为它增加了一个心理模型,我神交),添加,因为异常的烦恼; 我从来没有真正需要它的动态性“报价”。 这是侵入性,因为它需要对所有模块OSGi包配置; 这绝对不是简单的(在一个更大的项目)。

因为我的不愉快的经历,我倾向于远离那个怪物了,非常感谢你。 我宁愿从罐子依赖地狱受苦,因为这是这样的方式更容易比类加载器地狱OSGi的介绍可以理解的。



Answer 10:

在OSGi提供以下好处:

■基于Java的便携式和安全执行环境

■服务管理系统,它可以用来注册和共享跨越捆绑服务并消除来自服务消费者的服务提供商

■一个动态模块系统,其可以被用于动态地安装和卸载的Java模块,OSGi的捆绑调用

■一个轻量级的,可扩展的解决方案



Answer 11:

它也被用来使中间件和应用程序的可移植性附加在移动侧。 移动端可用于的Windows Mobile,塞班,安卓例如。 只要与设备功能集成时,可以得到分散。



Answer 12:

最起码,OSGi的让你想想模块化,代码重用,版本和一般项目的管道。



Answer 13:

别人已经列出了详细的好处,我在此解释一下实际usecases我要么看到或使用OSGi的。

  1. 在我们的应用程序之一,我们有基于事件的流量和流量是基于OSGi平台的插件定义,因此明天如果一些客户希望不同的/额外的流动然后他就必须部署一个多插件,从我们的控制台配置它,他是做。
  2. 它是用于部署不同的存储连接器,例如,假设我们已经有了需要Oracle数据库连接器和明天MongoDB的连接,然后写一个新的连接器并将其部署和配置,通过控制台的细节,并再次就完成了。 connnectors的部署OSGi的插件框架来处理。


文章来源: What does OSGi solve?