OSGI的核心 — 模块化、动态 。基于OSGi就可以模块化的开发java应用,模块化的部署java应用,还可以动态管理模块。

 

一、模块化

  1.概念:抽象出可公用的模块以避免同一处修改在多个地方出现,重用了代码,可维护性强

  2.优点:

    1)多人合作开发的分工更加明确,容易控制

    2)使程序实现的逻辑更加清晰,可读性强

 

二、OSGI概念

  OSGi (Open Services Gateway initiative) 开放服务网关协议。

  OSGi 联盟 OSGi Alliance。

  OSGi java动态模块化系统的一系列规范。

 

三、OSGI核心规范

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

  OSGi框架是OSGi技术最基础也是最核心的部分。

  OSGi框架主要分为以下几层:模块层、生命周期层、服务层。

  

java osgi java osgi架构原理_模块化

  1、模块层 — 关注打包和代码共享

    模块层定义了OSGi中的模块Bundle。

    Bundle是以jar包形式存在的一个模块化物理单元,里面包含了代码,资源文件和元数据(metadata),并且jar包的物理边界也同时是运行时逻辑模块的封装边界。

    Bundle是开发、部署OSGi应用的基本单元。

    Bundle的核心是META-INF目录下的MANIFEST.MF文件。

    Bundle定义了其所包含的包的可见性、可以认为是在public/private/protected的基础上的一个扩展。

    Bundle的Java包共享、屏蔽的规则。通过Export-Package、Import-Package方式进行交互。

    每个Bundle都有单独的类加载器。

 

  2、生命周期层 — 关注提供执行时模块管理和对底层OSGi框架的访问

    OSGi生命周期层有两种不同的作用:

      1)在应用程序外部,定义了对bundle生命周期的相关操作。OSGi生命周期层允许在执行时,从外部安装、启动、更新、停止、卸载不同的bundle,进而定制应用的配置。

      2)在应用程序内部,定义了bundle访问其执行上下文的方式,为bundle提供了一种与OSGi框架交互的途径以及一些执行时的便利条件。

 

  3、服务层 — 关注模块,特别是模块内的组件的交互和通讯

    服务层支持和促成了一个灵活的应用编程模型。

    涉及面向服务的发布、查找和绑定的交互模式:服务提供者将服务发布到服务注册中心,服务客户端搜索服务注册中心,查找可供使用的服务。

 

四、OSGI纲要规范

  除了OSGi 核心规范(core specification)中的服务,OSGi联盟也定义了一组非核心的(non-core)标准服务,称为Compendium服务。

  Core服务在任何运行的OSGi框架内都是可用的,这要求所有的OSGi框架都要实现核心服务。

  Compendium服务则不然,这些服务以分离的bundle的形式出现,由框架实施者或者第三方实现并提供,能在任何框架上运行。

  主要有如下几个:

  • LOG Service (日志服务)
  • HTTP Service(注册servlet和资源)
  • Configuration Admin(配置管理)
  • Event Admin(事件通知)
  • Declarative Services(定义轻量级的面向服务的组件模型)
  • Blueprint (一个类似IOC容器的实现)

 

五、OSGI的特点

  • 复用:很多第三方的组件可以以bundle的形式进行复用。
  • 简单:核心的API总过包括不超过30个类和接口。
  • 适配性:这主要得益于OSGi提供的服务机制、组件可以动态的注册、获取和监听服务,使得系统能够在OSGi环境调整自己的功能。
  • 版本化:bundle可以版本化,多版本能够共存而不会影响系统功能
  • 懒加载:OSGi技术采用了很多懒加载机制。比如服务可以被注册,但是直到被使用时才创建。
  • 非侵入式:服务可以以POJO的形式实现,不需要关注特定的接口
  • 易于部署:OSGi定义了组件是如何安装和管理的,标准化的管理API使得OSGi能够和现有和将来的各种系统有机的集成。
  • 动态更新:这是OSGi被最经常提起的一个特性,即所谓的“热插拔”特性,bundle能够动态的安装、启动、停止、更新和卸载,而整个系统无需重启。
  • 复杂性的降低:基于OSGi的组件模型bundle能够隐藏内部实现,bundle基于服务进行交互。