OSGi是什么

OSGi是Open Services Gateway initiative的缩写,叫做开放服务网关协议。我们说到OSGi时,根据上下文不同,通常可能指OSGi联盟、OSGi标准或者OSGi框架。OSGi最早是为了建立一套将可管理的服务(Managed Service,即插件)通过网络交付到设备中的开放标准,现在已经逐渐扩展到了企业应用领域,在JAVA企业级开发中扮演越来越重要的角色。

OSGi联盟现在将OSGi定义为一种技术:

OSGi技术是指一系列用于定义Java动态化组件系统的标准。这些标准通过为大型分布式系统以及嵌入式系统提供一种模块化架构减少了软件的复杂度。

OSGi标准

标准分为两个部分,OSGi Core和OSGi Enterpise。

OSGi Core顾名思义,就是OSGi的核心标准,正是这个标准定义了一种动态化模块化的应用架构,其中主要定义了OSGi框架。

OSGi框架提供了一个通用安全可管理的Java框架,能够支持可扩展可下载的应用(即bundles)的部署。

OSGi框架是OSGi技术最基础也是最核心的部分,分为以下几层,如下图所示:

oss系统架构 osgi架构_Java


安全层基于Java2的安全机制增加了一些限制,并且弥补了Java标准的一些不足。

模块层定义了一个模块化Java模型,对Java部署模式的一些缺点进行了改进,并对bundle(bundle为OSGi中的组件模型,可以简单认为是增加了元数据的Jar包) 之间包的共享有严格的规定。模块层独立于生命周期层和服务层,使用时可以不需要生命周期层和服务层。

生命周期层为bundle 提供了生命周期管理API,为bundle提供了一个运行时模型,定义了一个bundle 如何启动、停止、安装和卸载。另外,生命周期层也提供全面的事件API,允许bundle去控制和操作服务平台。

服务层 为bundle开发者提供了一个动态、简明且并且统一的编程模型,通过解耦服务标准(即Java接口)和它的实现,能够简化服务bundle的开发和部署。这个模型允许bundle 开发者只使用他们自己的接口规范来绑定服务。这样接口的实现可以根据实际情况延迟到运行时来选择。框架通过使用服务层,为系统提供了一种扩展机制,成为hooks。

OSGi中统一的编程模型可以帮助bundle开发者应对很多情况下的扩展的问题,这一点非常重要,因为框架需要运行在各种硬件设备上,设备的不同硬件特性可能影响服务实现的许多方面。统一的接口使得软件组件能够匹配和组合,同时保证稳定的运行。

OSGi框架中bundle 可以在运行时通过服务注册中心选择一个可用的实现,bundle 可以注册新服务、接收关于服务状态的通知或者查找服务以适配当前的设备。这使得一个bundle在部署后仍然具有可扩展性,新的bundle可被安装,已存在的bundle可修改和更新,而无需重新启动系统。

OSGi Enterprise由OSGi联盟的EEG(Enterprise Expert Group ) 制定,主要通过裁剪或者扩展OSGi框架(即OSGi Core)来定义技术需求与标准,以满足企业环境下IT软件基础设施的用况。OSGi Enterprise主要包括组件模型、分布式服务、Web应用于HTTP Servlet、事件模型、管理与配置服务、名称与目录服务、数据访问、事务支持以及其它一些支持服务。

OSGi的特点

从开发的角度来说,OSGi具有以下特点:
● 复杂性的降低:基于OSGi的组件模型bundle能够隐藏内部实现,bundle基于服务进行交互。
● 复用:很多第三方的组件可以以bundle的形式进行复用。
● 简单:核心的API总过包括不超过30个类和接口。
● 小巧:OSGi R4(第四版OSGI标准)框架的实现仅需要300KB的JAR file就足够。在系统中引入OSGi几乎没有什么开销。
● 非侵入式:服务可以以POJO(Plain Ordinary Java Objec简单java对象)的形式实现,不需要关注特定的接口。

从部署和运行的角度来说:
● 切合真实运行环境:OSGi框架是动态的,bundle能够进行即时的更新,服务可以根据需要动态增加或者删除。比如一个服务可以是一个网络中的设备,如果一个设备被监测到,则服务可以动态注册;如果设备被移除,则服务能够动态注销。在这样的运行环境中编程将需要耗费大量的开销来处理动态性,但是OSGi帮助开发者处理了绝大多数动态性方面的工作。
● 易于部署:OSGi定义了组件是如何安装和管理的,标准化的管理API使得OSGi能够和现有和将来的各种系统有机的集成。
● 动态更新:这是OSGi被最经常提起的一个特性,即所谓的“热插拔”特性,bundle能够动态的安装、启动、停止、更新和卸载,而整个系统无需重启。
● 适配性:这主要得益于OSGi提供的服务机制、组件可以动态的注册、获取和监听服务,使得系统能够在OSGi环境调整自己的功能。
● 透明:提供了管理API来访问内部状态,因此通常无需去查看日志,能够通过命令行进行调试。
● 版本化:bundle可以版本化,多版本能够共存而不会影响系统功能,解决了JAR hell(jar冲突)的问题。(这在开发时也提供了很大的帮助)
● 快速:这得益于OSGi的类加载机制,和JAR包的线性加载不同,bundle委托式的类加载机制,使得类的加载无需进行搜索,这又能有效的加快系统的启动速度。
● 懒加载:OSGi技术采用了很多懒加载机制。比如服务可以被注册,但是直到被使用时才创建。
此外OSGi还有一些其他的优势,比如:
● 安全:OSGi提供了一个安全层,基于Java的安全模型增加了可用性。
● 大公司的支持:OSGi联盟的成员里包含了很多业界有名的IT公司,比如Oracle, IBM, Samsung等。

OSGi的实现与扩展

OSGi框架最著名的三个实现包括Apache Felix, Equinox和Knopflerfish,这三个实现也是R4的认证实现。伴随OSGi框架的实现,通常会有相关的扩展,以进一步提供OSGi开发的工具或平台。