OSGI入门

来源:互联网 发布:单片机cy标志为 编辑:程序博客网 时间:2024/05/16 11:36

OSGI入门


1.简介
OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。OSGi容器已有多家开源实现,比如Apach Felix、Eclipse Equinox、以及Knopflerfish。OSGi™联盟成立于1999年3月,致力于为网络和本地设备建立开放的网络管理服务规范,并制定下一代互联网向住宅、汽车、移动电话、电脑、小型办公室等提供服务的标准。

OSGi服务平台规范是一个开放的一般性架构,主要为供应商如服务提供商、开发者、软件提供商、网关运营商和设备提供商等开发、部署和管理服务提供一种一致的协作环境。由于该规范对服务部署的的自适应性和可管理性,使得智能设备有了全新的用武之地。本规范的目标是机顶盒、服务网关、调制解调器、消费类电子设备、计算机、工业电脑、汽车、移动电话等众多产品,通过OSGi规范技术的实施将使服务提供商如:电信、电话公司等能提供更具有吸引力服务。


1.1 OSGI框架概述
OSGI:曾经是Open Services Gateway Initiative(开放服务网关协议)的首字母缩写。第三版后正式废弃了这个缩写,现在只是该技术的商标。
OSGI生态系统的全貌
 
1.2 模块和模块化
模块

定义了一个逻辑边界,这种模块本身精确的控制了哪些类是完全被封装起来的,而哪些类需要暴露出来作为外部使用
 
模块化
将一个大型系统分解为多个较小的互相协作的逻辑单元,通过强制设定模块之间的逻辑边界来改善系统的维护性和封装性。

 

1.3 OSGi的模块化与 JAVA在模块化上的局限性

1.3.1 底层代码可见性控制
Java提供了private,public,protected和package private(无修饰符)这四种访问控制级别,不过这仅仅提供了底层的数据封装特性。包这个概念确实是起到了分割代码的作用,但是如果包中的代码需要对包外可见,那么必须设置为public(或者protected,如果是使用了继承的话)。 这样的话就可能出现一个问题:
首先大家看看下面的例子,其中有三个java文件: 

  1. org.serc.helloworld.Hello.java定义了一个接口   
  2. package org.serc.helloworld;   
  3.   
  4. public interface Hello {   
  5. void sayHello();   
  6. }  

  7. org.serc.helloworld.impl.HelloImpl.java:实现了Hello接口  
  8. package org.serc.helloworld.impl;  
  9.   
  10. import org.serc.helloworld.Hello;  
  11. public class HelloImpl implements Hello{  
  12. final String helloString;  
  13.   
  14. public HelloImpl(String helloString){  
  15.     this.helloString=helloString;  
  16. }  
  17.   
  18. public void sayHello(){  
  19.     System.out.println(this.helloString);  
  20. }  
  21. }  
  22.   

  23. org.serc.helloworld.main.Main.java     
  24. package org.serc.helloworld.main;  
  25.   
  26. import org.serc.helloworld.Hello;  
  27. import org.serc.helloworld.HelloImpl;  
  28. public class Main{  
  29. final StringhelloString;  
  30.   
  31. public static void main(String[] args){  
  32.     Hello hello = new HelloImpl(“Hello,SERC!”);  
  33.    hello.sayHello();  
  34. }  
  35. }  
这三个文件分别在不同的包中。通常HelloImpl这个实现细节是不应该暴露给其他包的,但是从Main.java的main方法中我们可以明显的看出,为了创建Hello 的实例,我们不得不引入HelloImpl类,但是HelloImpl作为接口的实现细节,是不应该暴露给使用者的,这违反了封装的原则,显然不太好。
但是,如果我们不想让HelloImpl暴露出来的话,就需要做额外的工作来保证“既隐藏了实现细节,又能简单的创建一个实现了Hello接口的实例”。达到这一目的的方法不止一种(比如工厂模式),有些至今也是很常用的,但是这增加了与应用本身功能无关的多余工作,想想如果你每次想开发一个应用都要为了达到上述目的而做出多余工作,不得不说是有点繁琐的,所以这可以说是Java的一大局限。


1.3.2 classpath的局限
我们在classpath中加入jar包的时候,只是简单的给出文件路径,而这个jar包的版本和一致性,它所依赖的jar包是什么,我们都无法在classpath中明确的设置或是从classpath中看出这些属性。 

并且classpath中的jar包是按序加载的,c:\servlet2.2\servlet.jar;c:\servlet2.3\servlet.jar,那么在实际应用的过程中,Java让你使用的是servlet2.2,而不是servlet2.3。这种情况下我们还能看出来使用的是哪个版本,如果在大型系统中大家分开开发的时候各用各的servlet包,并且版本号不一样,那么在最后将开发结果合并的时候,到时候用的是哪个版本的servlet包就很难搞清楚了,也就说不可控性是比较强的。 即使classpath能注意到版本的问题,也没法精确指出依赖。试着回想你在设置classpath的过程中出现过情况:在你以为classpath已经设置完毕以后,你尝试启动程序,结果虚拟机抛出异常告诉你缺包,然后你再加上你觉得缺少的那些包,然后再启动程序,如此反复直到虚拟机不运行到缺包异常为止。

1.3.3 OSGi对这些局限性的改善
对于上一小节提到的Java的局限,在OSGi中都得到了很好的解决。
包的可见性:OSGi通过引入包的可见性机制,能够完全控制一个包中的代码对哪些模块可见,而不仅仅局限于无差别的可见性,从而完善了Java的代码访问控制机制。
包的版本: OSGi通过为包增加版本信息,可以精确控制代码的依赖,保证代码的版本一致性,弥补了classpath的缺点。


1.4 OSGI提供了什么


模块关注代码的打包和共享
生命周期层提供运行时管理以及对OSGI框架的访问接口

服务层关注模块之间的交互和通信


1.5 三层架构

1.5.1模块层


 
模块层定义了OSGI中的模块Bundle。
Bundle是一个具有额外元数据的jar包。
Bundle定义了其所包含的包的可见性,可以认为是在public/private/protected的基础上的一个扩展。
Bundle需要定义其所依赖的包。


图形API bundle的元数据:
Bundle-ManifestVersion:2
Bundle-SymbolicName:org.foo.shape
Bundle-Version:2.0.0
Bundle-Name:Paint API
Important-Package:javax.swing
Export-Package:org.foo.shape;version=”2.0.0”


图形实现 bundle的元数据:
Bundle-ManifestVersion:2
Bundle-SymbolicName:org.foo.shape.impl
Bundle-Version:2.0.0
Bundle-Name:Simple Shape Implementations
Important-Package:javax.swing, org.foo.shape;version=”2.0.0”
Export-Package:org.foo.shape.impl;version=”2.0.0”


绘图程序主API bundle的元数据:
Bundle-ManifestVersion:2
Bundle-SymbolicName:org.foo.paint
Bundle-Version:2.0.0
Bundle-Name:Simple Paint Program
Important-Package:javax.swing, org.foo.shape; org.foo.shape.impl
Export-Package:org.foo.shape;version=”2.0.0”



绘图程序的bundle结构
 
1.5.2生命周期层
如果你在建一座房子
模块层为你提供了房屋结构和家具设备
生命周期层则提供了电力,以支持房屋内部正常运转


生命周期层的两个目的:
模块生命周期的操作(install,update,start,stop....)使得外部可以动态的管理和演化系统


生命周期层定义了运行时上下文的接口,因此bundle本身可以和OSGI框架进行交互,从而实现内部自我管理
OSGI bundle生命周期
 
将生命周期引入绘图程序
 
1.5.3服务层
 
服务层是JVM中的SOA
服务和bundle一样,也是动态的
服务层促进你使用基于接口编程的方法

OSGI服务是Java nterface,服务的调用就是Java对象的方法调用


1.6 OSGI的最大优势
本质上,OSGI提供了更加严格的模块化特效,更严格的一致性检查
OSGI带来的两个最大的优势:
基于接口编程,完全隐藏实现
动态性(对外扩展开放,即使是运行时)

原创粉丝点击