论坛首页 Java企业应用论坛

OSGi原理与最佳实践 学习笔记 一

浏览 108064 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-30  

OSGi简介

OSGi是什么

下面来看看“维基百科”给出的解释:

OSGiOpen Service Gateway Initiative)有双重含义。一方面它指OSGi Alliance组织;另一方面指该组织制定的一个基于Java语言的服务(业务)规范——OSGi服务平台(Service Platform)。

OSGi Alliance是一个由Sun MicrosystemsIBM爱立信等于19993月成立的开放的标准化组织 最初名为Connected Alliance。该组织及其标准原本主要目的在于使服务提供商通过住宅网关,为各种家庭智能设备提供各种服务。目前该平台逐渐成为一个为室内、交通工具、移动电话和其他环境下的所有类型的网络设备的应用程序和服务进行传递和远程管理的开放式服务平台。

该规范和核心部分是一个框架 ,其中定义了应用程序的生命周期模式和服务注册。基于这个框架定义了大量的OSGi服务:日志配置管理、偏好,HTTP(运行servlet)、XML分析、设备访问、软件包管理、许可管理、星级、用户管理、IO连接、连线管理、Jini UPnP

这个框架实现了一个优雅、完整和动态的组件模型。应用程序(称为bundle)无需重新引导可以被远程安装、启动、升级和卸载(其中Java包/类的管理被详细定义)。API中还定义了运行远程下载管理政策的生命周期管理服务注册允许bundles去检测新服务和取消的服务,然后相应配合。

OSGi原先关注于服务网关,其实可用于多个方面。现在OSGi规范已经用于从移动电话到开源的Eclipse(其中包括了与IBMOSGi框架SMF兼容的开源版本)。 OSGi服务平台的应用包括:服务网关 汽车移动电话 工业自动化建筑物自动化 PDA 网格计算娱乐(如iPronto)、和 IDE

OSGi规范是由成员通过公开的程序开发,对公众免费而且没有许可证限制。但是OSGi Alliance兼容性程序只对成员开放,目前有12个兼容的实现

2003Eclipse选择OSGi作为其插件的底层运行时架构。Equinox project对该理念进行了实验,20046月在Eclipse3 R3中发布。ProSyst是面向OSGi开发者的Eclipse插件。

200310月, 诺基亚摩托罗拉ProSyst 和其他OSGi成员组建了Mobile Expert Group (MEG)为下一代智能手机规范业务平台,做为对 MIDP CDC的补充。

 

OSGi的主要职责就是为了让开发者能够建动态化、模块化的Java系统。

 

OSGi的组成

通常,OSGi 框架从概念上可以分为三层:模块层、生命周期层和服务层。各层的主要功能如下:

<!--[if !supportLists]-->Ø  <!--[endif]-->Module Layer —— 模块层主要涉及包及共享的代码;

<!--[if !supportLists]-->Ø  <!--[endif]-->Lifecycle Layer —— 生命周期层主要涉及 Bundle 的运行时生命周期管理;

<!--[if !supportLists]-->Ø  <!--[endif]-->Service Layer —— 服务层主要涉及模块之间的交互和通信。

 

<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="http://static.oschina.net/uploads/img/201111/18175002_MIP6.jpg" style='width:359.25pt;height:280.5pt'> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image001.jpg" o:href="http://static.oschina.net/uploads/img/201111/18175002_MIP6.jpg" /> </v:shape><![endif]--><!--[if !vml]-->http://static.oschina.net/uploads/img/201111/18175002_MIP6.jpg<!--[endif]-->

OSGi 层次结构

模块层

Bundle OSGi 中的基本组件,其表现形式仍然为 Java 概念中传统的 Jar 包,同时通过 META-INF 目录下的 MANIFEST.MF 文件对其予以进一步的定义。通常一个 MANIFEST.MF 文件的内容如下所示:

Manifest-Version: 1.0

 Bundle-ManifestVersion: 2

 Bundle-Name: Util

 Bundle-SymbolicName : com.ibm.director.la.util

 Bundle-Version : 1.0.0.qualifier

 Bundle-Activator : com.ibm.director.la.util.Activator

 Bundle-Vendor : IBM

 Bundle-RequiredExecutionEnvironment : JavaSE-1.6

 Import-Package : org.osgi.framework;version="1.3.0"

 Bundle-ActivationPolicy : lazy

 Export-Package : com.ibm.director.la.util;uses:="org.osgi.framework"

 Bundle-ClassPath : libs/jfreechart-1.0.13-swt.jar,

 libs/jfreechart-1.0.13.jar,

 libs/jfreechart-1.0.13-experimental.jar

MANIFEST.MF 文件示例

也就是说,MANIFEST.MF文件存储的实际上是 Bundle的元数据,元数据的内容能够精确的定义 Bundle的各种特征,同时能够更好的对 Bundle进行标识同时帮组用户的对 Bundle进行理解。例如,通过配置 Import-Package可以指明当前 Bundle 需要哪些其他的包,而通过配置Export-Package则可以表示当前 Bundle 的哪些package对外部可见。不难理解,通过这种方式可以有效的对 Bundle 内部和外部进行隔离。其他更多配置请参考相关资料。

 

Bundle可以被动态地安装、启动、停止和卸载。

Bundle是服务(Service)和组件(Component)的载体。

OSGi中,每个Bundle都有自己独立于其他BundleClassLoader,正因为这样,各个Bundle内部的类是隔离的。

 

Bundle之间的交互方式:

1.通过PackageExport(对外暴露自己的一个或多个package)Import(导入别人的一个或多个package)来进行。

2.通过Service的方式进行。一个Bundle作为Service提供方,对外提供Servcie .使用者可以查找到提供的Service. 并使用这个ServÎce. 而提供/使用Service又存在两种方式:一种是经典的做法,通过BundlcContext ( Bundle 的上下文)来提供和获取.一种是使用Declarative Service来实现.

生命周期层

Bundle的生命周期被OSGi框架所管理,具有如下几个状态:INSTALLED RESOLVED UNINSTALLED STARTING ACTIVESTOPPING.状态之间的转换关系如下图:

<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:413.25pt;height:287.25pt'> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image002.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

Bundle状态转换关系图

服务层

一个OSGi Service就是注册到OSGi框架中的一个Java对象。这注册的时候可以设置这个Service的属性。而在获取Service的进候可以根据属性进行过虑(Filter)Bundle可以通过Bundle的上下文去注册Service或去查询Service

<!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:364.5pt;height:141pt'> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image004.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

服务模型示例图

Service-Oriented Component Model (SOCM)

首先来看Component 的慨念.ComponentService 从定义上看差不多,任何-个普通的J ava对象都可以通过配置文件中的定义而变为一个Component.Component对外提供了服务并且可以使用其他Component提供的服务,Component 的生命周期被OSGi 框架所管理.我们可以看到,Component是提供和使用服务的另外一种方式,并且具有生命周期.

SOCM 在字面上的意思就是面向服务的组件模型.在这个模型中.Component是服务的载体,提供对外使用的服务并可能使用外部的服务,而Component存在于Bundle 之中,系统由多个Bundle 组成.

<!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:412.5pt;height:230.25pt'> <v:imagedata src="file:///C:\Users\itway\AppData\Local\Temp\msohtmlclip1\01\clip_image006.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->

SOCM示意图

Declarative Service (DS)

Declarative Service (DS)OSGi Core Framework 的一个标准服务。DS让我们在Bundle中定义Component,通过配置的方式发布服务、获取服务,以帮助我们实现前面提到的SOCM。有了DS,我们就可以按照Component+Service的方式进委系统的设计与开发。

 

 

为了更好地浏览,请下载附件

   发表时间:2012-10-26  
为什么OSGI这么优秀,但使用的人却这么少(PS:从网上的中文资料来判断的)?
0 请登录后投票
   发表时间:2012-12-11  
是否优秀还是从解决问题的复杂度来衡量吧。由其是软件系统还要考虑易维护、实现复杂度等因素
0 请登录后投票
   发表时间:2013-05-28  
现在有关osgi的应用已经越来越多了,目前我们的团队就在使用osgi,个人感觉osgi真的特别强大,和之前的java开发兼容性也很高,现在我们已经完全的转变为基于osgi的java开发了,如果想学习osgi的话,推荐下http://osgi.com.cn/,这上面有很多基础知识哦
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics