OSGI(Open ServiceGateway Initiative)是一个非赢利性组织,旨在建立一个开放的服务规范,为通过网络向设备提供服务建立开放的标准,是面向Java的动态模型系统。OSGI服务平台提供在多个网络设备上无需重启,动态改变构造的功能。为了最小耦合度和促使这些耦合度管理,OSGI提供一种面向服务的架构,能够使组件动态的发现对方。OSGI联盟已经开发很多公共功能标准组件接口,如HTTP服务器、配置、日志、安全、用户管理、XML等。
OSGI规范的核心组件是OSGI框架,为应用程序(组件,bundle)提供一个标准环境。整个框架可划分为如下层次:
L0:运行环境;
L1:模块;
L2:生命周期管理;
L3:服务注册;
安全系统渗透到所有层次。
L0层执行环境是Java环境的规范。Java2配置和子规范,如J2SE,CDC,CLDC,MIDP等,都是有效的执行环境。OSGi平台标准化一个执行环境,它是基于基础轮廓,该执行环境对OSGi组件是有用的。
L1模块层定义类的装载策略。OSGi框架是一个强大的、具有严格定义的、类装载模型。它基于Java之上,却增加了模块化。在Java中,正常情况下,有一个包含所有类及资源的类路径。OSGi模块层为一个模块增加私有类同时有可控模块间链接。模块层同安全架构完全集成,可选择部署到部署到封闭系统,防御系统,或者由厂商决定的完全由用户管理的系统。
L2生命周期层增加了能够被动态安装、开启、关闭、更新和卸载的bundles。这些bundles依赖具有类装载功能的模块层,但增加在运行时管理这些模块的API。生命周期层引入正常情况下不属于一个应用程序的动态性。扩展依赖机制用于确保环境的操作正确。生命周期操作在安全架构保护之下,使其不受病毒的攻击。
L3层增加了服务注册。服务注册提供一个面向bundles的、考虑到动态性的协作模型。bundles能通过传统的类共享进行协作,但是类共享同动态安装和卸载不兼容。服务注册提供一个在bundles间分享对象的完整模型,定义大量事件来处理服务的注册和删除。这些服务仅仅是能代表任何事物的Java对象。该服务安全模块使用了一个很聪明的方式来保障bundles之间通信安全。
安全机制是建立在Java和Java2安全模型基础之上。
OSGi平台通过使用私有类(在Java中不能用标准方式使用的机制)扩展了该模型。Java2安全模型提供了一个完整模块检查代码。对于资源的可访问性,OSGi增加了完全动态的权限管理,简化操作者工作。
OSGi联盟已经定义很多协议服务,这些服务将外部协议映射为OSGi服务。HTTP服务(HttpService)该HTTP服务是servlet运行器。bundles提供servlets,这些服务端小程序基于HTTP协议成为可用的。OSGi服务平台的动态更新功能使HTTP服务成为一个非常具有吸引力的Web服务器,它能伴随着新的servlet被更新,如果需要可以远程更新而无需重启。
UPnP服务(UPnPService)通用即插即用是一个正在形成中的消费电子标准。OSGi中的UPnP服务在一个UPnP网络上将设备映射到服务注册中。同样,它也可以将OSGi服务映射到UPnP网络。
DMT管理(DMTAdmin)开放移动联盟基于设备管理树为移动设备管理提供了一个完整规定。DMT管理服务定义该树如何被访问和/或者在OSGi服务平台中被扩充。
标准服务
在该框架之上,OSGi联盟定义很多服务。这些服务通过一个Java接口指定。bundles能够实现这个接口,并在注册服务层注册该服务。服务的客户端在注册库中找到它,或者当它出现或者消失时做出响应。
框架服务
OSGi框架提供一个权限管理服务,一个包管理服务和一个开始级别服务。这些服务是一个可选部分,指示框架的操作。框架服务如下:
权限管理(PermissionAdmin)目前或者将来的bundles的权限通过这种服务进行维护。一旦设置了它们,权限服务立即激活。
包管理(PackageAdmin)bundles同类和资源分享包。bundles的更新可能需要系统重新计算这些依赖。这个包管理服务提供关于系统的实际包分享状态和能够刷新已经共享的包。也就是,取消依赖和重新计算依赖。
启动级别(StartLevel)启动级别是一个bundles集合,它们应该同时运行或者应该在其它已经启动以前被初始化。启动级别服务设置当前的启动级别,为每个bundle排一个启动级别和审核当前的设置。
URL处理者(URLHandler)Java环境为URL处理者支持一个提供者模型。然而,这是一个单件,不可能在一个象OSGi可能有很多提供者的协作环境上使用它。此服务规范使任何组件提供额外的URL处理者。
系统服务
系统服务提供水平功能,它在每个系统是必须的。日志服务,配置管理服务,设备访问服务,用户管理服务,IO连接器服务和参数服务都是系统服务的一个方面。
日志服务(LogService)日志信息,警告,调试或者错误信息通过日志服务来处理的。它接受日志实体并分派这些实体到订阅了这个信息的其他bundles。
配置管理服务(ConfigurationAdminService)该服务提供一个设置和获取配置信息的灵活、动态模型。
设备访问服务(DeviceAccessService)设备访问是OSGi为一个新的设备匹配一个驱动,并自动下载一个实现该驱动的bundles的机制。这个可用作即插即用方案。
用户管理服务(UserAdminService)该服务使用一个用于授权和验证目的的用户信息数据库。
IO连接器服务(IOConnectorService)该IO连接器服务实现了CDC/CLDCjavax.microedition.io包,并作为一个服务。该服务允许bundles提供新的可交换协议模式。
参数服务(PreferencesService)该服务提供了参数层级数据区的可访问性,同Windows注册表或者Java参数类相似。
组件运行时服务(ComponentRuntime)服务的动态特性--它们能够在任何时间来去自由--使编写软件变得更难。组建运行时规范通过提供一个基于依赖声明的XML文件来简化处理这些动态方面。
部署管理服务(DeploymentAdmin)OSGi的主要部署格式是bundle,它是一个JAR/ZIP文件。部署管理提供第二种可选格式:部署包。部署包能够将bundles和相应资源联接成可被安装和卸载的单个交付。完整的资源处理器模型允许用户代码扩充资源类型。
事件管理服务(EventAdmin)很多OSGi事件有特定的类型化的接口,使其很难接收和过滤事件。事件服务提供一个泛化的基于主题的事件机制。这个规范包括为所有已存框架和服务事件的映射。
应用程序管理服务(ApplicationAdmin)OSGibundle模型不同于依赖于启动和关闭形式的典型的桌面或者移动电话应用程序模型。该应用程序管理服务提供了传统应用程序模型和它所要求的管理设施。