`

OSGi基本概念初探

 
阅读更多

1、OSGi是什么

OSGi是一种松散耦合的组件管理和服务运行平台规范。简单的说,用户只需要修改通用的Java类库打包档案JAR文件中META-INF下的元数据文件MANIFEST.MF,添加必要的标签信息,放置到OSGi框架的Bundle Repository中,用户的类库就成了OSGi环境的一部分。

成为OSGi环境的组件为其他标准的OSGi组件提供代码功能是最直接的一种。用户也可以将提供组件中的某种功能的接口和实现实例发布到OSGi服务注册表中,供其他组件直接查找使用。同样,用户可以查找OSGi环境中其他组件提供的接口服务,调用该服务完成必要的处理。

OSGi组件提供的服务具有两个层面的含义:系统层面,即一个组件为其他组件提供服务,这些服务体现为Java接口的实现;业务层面,即一个组件为外部系统或用户提供某种业务服务实现。

2、OSGi提供的功能

OSGi能够提供什么功能呢?我们将OSGi运行平台与常用的Web应用服务服务器做一个比较,来看OSGi提供的功能。首先,以tomcat为例,在tomcat容器中可以运行多个Web应用,假设存在两个Web应用A和Web应用B,一般说来,Web应用A和B具有各自的运行空间,两者之间不存在任何关联,A和B具有自己独立的生命周期,如部署、启动、停止和卸载等。

那么,是如何做到这一点的呢?很明显,这是通过JVM的类加载机制决定的。当tomcat运行并启动Web应用A和B时,tomcat为Web应用A和B各自构建了一个类空间,也可以看作是一个类域(Class Domain),Web应用A的类域包括JRE中的类,tomcat启动类路径上的类和Web应用A中WEB-INF目录下classes目录下的类和lib中的jar包;同样,Web应用B也有自己独立的类域,其范围除了JRE中的类,tomcat启动类路径上的类之外就是自己内部WEB-INF目录下classes目录下的类和lib中的jar包。如下图所示:

现在提出一个问题,如果Web应用A需要使用Web应用B提供的Java类,怎么办?实现方式有多种,一种是将B提供的类打包,放置到应用A的WEB-INF/classes或WEB-INF/lib中;也可以将B提供的类放置到tomcat的类路径上,甚至是JRE的扩展目录下,但这样做在实际使用中或多或少存在一些问题。能不能在运行时Web应用A可以直接使用Web应用B提供的类呢?在运行时Web应用B能不能提供一个接口的实现,即类实例,由Web应用A使用呢?能不能提供一个应用C为应用A和应用B提供服务呢?显然,这些对于Web容器是不行的。

带着上述问题我们回到OSGi运行平台。可以将OSGi看作是Web容器的泛化,是更高级别的抽象。运行在OSGi环境中的类似于Web容器中的Web应用的组件即Bundle,不再仅仅局限于一个业务应用的概念,它的粒度更加精细,即可以看作是一个Jar包,为其他Bundle提供帮助类;也可以是一个HTTP服务组件,为其他Bundle提供http服务;还可以是一个Web容器,为其他Bundle提供Web应用服务。

那么,能不能解决上述提到的问题呢?我们假设在OSGi运行平台中包含了3个Bundle:A、B和C。

  • 对于问题一:Bundle A需要使用Bundle B中的某些实现类,如何实现?

可以将Bundle B中的这些类通过Bundle B的元数据描述信息公开(Export)出去,使得这些类对OSGi平台中的所有Bundle可见,这些类资源仍然位于Bundle B中。Bundle A在其元数据描述信息中将Bundle B公开的类引入(Import)进来。在运行时,Bundle A就可以使用Bundle B提供的这些类,而不是需要将这些类拷贝到Bundle A中或其他位置。

  • 对于问题二:Bundle A可不可以直接使用Bundle B在运行时构建了类实例?

Bundle B在运行时可以将Bundle A需要的类实例注册到OSGi运行平台的服务注册表中,类实例实现的接口可以通过上述问题一的方式使得Bundle A可见,那么,在运行时,Bundle A就可以通过该接口到OSGi平台服务注册表中查找Bundle B中提供的接口实现类实例,并调用该接口上的方法。

  • 现在来看问题三:Bundle C能不能为Bundle A和Bundle B共享呢?

可以将上述问题二的解决方案中的Bundle B提供的接口定义提取到Bundle C中,并在Bundle C的元数据中公开,通过在Bundle A和Bundle B中同时引入Bundle C中发布的接口,Bundle B提供该接口的实现,Bundle A使用该接口实现提供的功能。这一切看上去是不是解决的非常完美呢?!

3、OSGi的实现机制

OSGi是如何实现的呢?从本质上说,OSGi是充分使用了Java的类加载机制,对模块和应用进行了更加精细粒度的控制,然后在类域上建立一系列松耦合应用。OSGi为每一个Bundle组件定义了一些元数据信息,通过这些元数据,OSGi在运行时为每一个Bundle构建了一个独立的类域(即类空间),详细描述参考OSGi之Bundle小节。

4、OSGi的组成

OSGi在R4种将功能分为几层,包括:安全层、模块层、生命周期层、服务层和实际的服务。OSGi的核心实现即为OSGi框架,它本身也是一个OSGi Bundle。

  • OSGi的安全层(Security Layer)是一个可选的实现,该层基于Java2 安全架构,位于OSGi服务平台的底层对OSGi环境中应用的部署和管理提供更好的安全控制。
  • OSGi的模块层(Module Layer)为基于Java的应用、组件的打包,部署和校验提供了一个通用的标准化的解决方案。其他类似的解决方案如JBoss、NetBeans。
  • 生命周期层(Life Cycle Layer)为Bundle组件的安全和生命周期操作提供了API定义,该层位于安全层和模块层之上。
  • 服务层(Service Layer)定义了一个与生命周期层紧密结合的组件动态交互模型。OSGi中的服务是实现了一个或多个Java接口的Java对象,通过将这些对象依据其实现的接口注册到服务注册表中,Bundle组件可以发布自己的服务,查找使用服务,注册监听处理服务的状态变更等。
  • 实际的服务(Actual Services)是OSGi定义的一些标准的服务接口如日志服务(Log Service),包管理服务(Package Admin Service)、启动级别服务(Start Level Service)、HTTP服务(Http Service)、配置服务(Config Admin Service)、用户管理服务(User Admin Service)等等,详细的服务定义参考OSGi规范。

5、OSGi之Bundle

OSGi中的重要元素就是Bundle 和Service,Bundle提供了一种静态资源边界,类似于Web容器中的Web应用的概念。

每一个Bundle通过一个元数据文件(MANIFEST.MF)描述。OSGi框架(即SystemBundle)通过解析这个元数据文件对该Bundle进行加载和管理。Bundle通过元数据中的"Export-Package"属性将内部的类包发布给OSGi系统中其他Bundle使用,通过"Import-Package","Requie-Bundle"属性引用OSGi系统中其他Bundle发布的类包。

每一个Bundle有自己独立的类加载器(Fragment Bundle例外,其资源通过其Host Bundle加载),Bundle内部的资源(类,文件等)通过该类加载器查找和加载。Bundle的类加载器能够控制的类加载边界包括:启动类路径上的类资源,OSGi框架即SystemBundle上的类资源和Bundle内部的类资源。该类资源边界即形成该Bundle的类域。

每一个Bundle在OSGi框架中具有自己的生命周期,其生命周期内的状态包括:INSTALLED、RESOLVED、STARTING、ACTIVE、STOPPING和UNINSTALLED。

INSTALLED状态是Bundle的初始状态,当该Bundle部署到OSGi系统的Bundle Repository中时,Bundle的状态标记为INSTALLED。

Bundle内部的资源在加载之前,首先由OSGi框架对其进行解析(Resolve),解析的过程就是分析Bundle的元数据的过程,详细过程参考OSGi规范。解析后的Bundle进入RESOLVED状态,解析失败时,仍然处于INSTALLED状态。

Bundle内的资源被其它Bundle使用时,该Bundle被启动,也可以通过设定让OSGi框架在加载该Bundle时直接启动。

Bundle内的资源通过BundleContext与其他Bundle进行交互。元数据中的"Bundle-Activator"属性指定了实现BundleActivator接口的实现类,Bundle通过该类得到BundleContext,通过BundleContext可以查找其他的Bundle,查找注册在OSGi中的服务(Service)与OSGi环境进行交互等等。Bundle可以在其提供的BundleActivator实现类中进行初始化的工作,也可以注册服务到OSGi的服务注册表中,供其他Bundle查找使用。

6、开源的OSGi实现

Knopflerfish:http://www.knopflerfish.org

Oscar:http://oscar.objectweb.org

Equinox:http://www.eclipse.org/equinox

Flex:http://felix.apache.org

分享到:
评论

相关推荐

    OSGi入门资料-初探OSGi 的全文

    OSGi的入门资料,网上找的,初探OSGi 的全文

    OSGi基本原理pdf (by 静默虚空 )

    OSGi(Open Service Gateway Initiative)是一个动态模型系统的技术,主要用于Java平台。它为Java应用程序的...这些概念和组件共同构成了OSGi的核心功能,使得OSGi能够为Java应用程序提供高度的动态性和模块化能力。

    OSGI 开发文档中文的

    1. **OSGI基本概念**:包括bundle、服务、生命周期(启动、停止、暂停、更新和卸载)以及类加载器的工作原理。理解这些概念是使用OSGI的基础。 2. **模块化系统**:OSGI如何实现模块化,如何定义模块间的依赖关系,...

    SCA、SOA与OSGi概念浅析

    尽管两者都涉及服务和组件的概念,但OSGI更注重运行时环境的灵活性,而SCA则聚焦于服务组装和部署。 **发展历程**:SCA的早期版本为0.9和0.95,之后在2007年发布了1.0版本。这个规范由BEA、IBM、Oracle等公司共同...

    osgi介绍osgi介绍

    1. **Bundle**:是OSGi的基本模块单位,包含代码、资源和元数据,用于描述其提供的服务和依赖。 2. **Service**:是bundle之间通信的机制,允许bundle以松散耦合的方式互相协作。 3. **生命周期**:bundle有安装、...

    osgi 资料 总结 实践

    OSGi基本概念** OSGi的核心概念包括: - **Bundle**:这是OSGi的基本模块,类似于Java的JAR文件,但包含额外的元数据,定义了包的依赖关系、版本和导出/导入的服务。 - **Framework**:OSGi框架是运行时环境,...

    OSGI原理与最佳实践

    资源名称:OSGI原理与最佳实践内容简介:国内第一本OSGi图书OSGi国内推广者林昊多年经验的结晶涵盖OSGi从入门到深入的知识体系引领OSGi国内研究和普及本书基于作者多年使用OSGi的经验而...,介绍OSGi的作用及基本概念...

    OSGI 入门资料PDF

    通过阅读提供的PDF文档,你将深入理解OSGI的基本概念,掌握其核心特性,并学会如何在实际项目中运用OSGI来提升软件开发的效率和质量。同时,了解OSGI与Spring的整合,可以帮助你在现代企业级应用开发中发挥更大的...

    osgi,林昊写的osgi实战和进阶

    1. **OSGI基础**:介绍OSGI的基本概念,包括模块系统、服务注册与发现机制、动态性等。这会帮助读者理解OSGI是如何提供一个灵活且可扩展的平台的。 2. **模块化编程**:OSGI的模块化特性使得开发者可以将应用程序...

    OSGI组件编程(osgi.component.programming)

    在开始编程之前,了解OSGI的基本概念至关重要。OSGI服务平台是一个用于开发远程部署服务应用程序的框架,这些应用程序需要具有可靠性、大规模分布能力、跨设备兼容性以及协作功能。OSGI规范由行业领导者共同制定,并...

    OSGi原理与最佳实践

    本书基于作者多年使用OSGi的经验而编写,涵盖了OSGi从入门到深入的知识体系,从OSGi的简介开题,介绍OSGi的作用及基本概念;其后进入OSGi实战,结合实例讲解如何基于OSGi框架编写模块化、动态化的各种Java应用;最后...

    osgi学习笔记(一)

    本文将深入探讨OSGi的基本概念、架构以及如何使用它来构建可扩展和灵活的Java应用程序。 首先,我们需要了解OSGi的核心概念——模块化。在OSGi中,每个Java应用程序被划分为独立的模块,称为“bundle”。这些bundle...

    Spring OSGI 快速入门中文教程

    OSGi基本概念** - **模块化系统**:OSGi的核心是模块化,每个模块称为Bundle,包含代码和元数据,可以独立加载、卸载、启动和停止。 - **生命周期管理**:Bundle有安装、解析、启动、暂停、停止和卸载等状态,方便...

    osgi框架开发介绍

    一、OSGi框架基本概念 1. **模块系统**:OSGi的核心是其模块化系统,它通过Bundle(包)来组织代码。每个Bundle都是一个独立的部署单元,包含了类、资源以及元数据,类似于Java的JAR文件,但具有更高级别的封装和...

    IntelliJ IDEA OSGI helloworld

    - **Bundle**:是OSGi的基本模块单位,类似于Java的JAR文件,但包含额外的元数据描述其依赖关系和其他属性。 - **Framework**:是OSGi系统的运行时环境,管理Bundle的生命周期并处理它们之间的依赖关系。 - **...

    深入理解OSGi

    通过阅读《深入理解OSGi》,读者不仅能掌握OSGi的基本概念,还能了解到如何在实际项目中应用这些知识,提升软件开发的效率和质量。无论是对于Java开发者还是系统架构师,这本书都是一份宝贵的学习资料。

    OSGi入门教程(OSGi Introduce)

    OSGi的核心概念是基于Java的模块化,它的主要目标是为各种设备提供一个开放的服务平台,包括室内设备、交通工具、移动电话等,用于管理和分发应用程序和服务。 OSGi的特点主要包括: 1. **插件化(Bundles)**:...

    OSGI 实例eclipse插件开发

    7. `org.springframework.aop`:此模块提供了Spring的AOP支持,包括代理、切入点表达式、通知等核心AOP概念。 8. `org.springframework.osgi.io`:这个模块提供了OSGI环境下的资源读取和加载功能,如读取bundle中的...

    《OSGi实战》完整中文版

    《 OSGi实战》是学习OSGi的全面指导,利用与架构和开发人员相关的示例清楚地讲解OSGi概念,同时探讨了很多实践场景和技术,阐述了开发人员有多需要OSGi,怎么将OSGi嵌入其他容器中,将遗留系统移入OSGi的最佳实践,...

    OSGi™ Component Programming

    通过理解OSGi的基本概念和实践,开发者能够更好地应对复杂系统的需求,提高软件的弹性和可靠性。 总之,OSGi服务平台为Java开发者提供了一个强大且灵活的框架,用于构建模块化、动态的系统。通过掌握OSGi的组件、...

Global site tag (gtag.js) - Google Analytics