OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统

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

OSGi(Open Service Gateway Initiative) 技术是 Java 动态化模块化系统的一系列规范。OSGi 一方面指维护 OSGi 规范的 OSGi Alliance(OSGi 联盟),另一方面指的是该组织维护的基于 Java 语言的服务(业务)规范。简单来说,OSGi 可以认为是 Java 平台的模块层,为大型分布式系统以及嵌入式系统提供一种模块化架构减少了软件的复杂度。

1. 什么是 OSGi

OSGi 联盟(OSGi Alliance)于 1999 年开始着手制定 OSGi 规范,其主要目的就是要制定一套开放式标准,以便向局域网及其中的设备提供可管理的服务;其基本思路是,一旦您在网络设备(如服务器和嵌入式设备)上使用了 OSGi 服务平台,您就可以在网络上的任何地方管理这些设备上运行的软件组件的生命周期,可以在后台对这些组件进行安装、升级或卸载,但不需要打断该设备的正常运行。Eclipse 就是基于 OSGi 开发的。

2. OSGi 标准

OSGI R1 于 2000 年发布,现在最新的标准版本是 R5,到现在为止应用最广泛的当属是 2005 年发布的 R4。

其中主要定义了 OSGi 框架。OSGi 框架提供了一个通用安全可管理的 java 框架,能够支持可扩展可下载的应用(即 bundles)的部署。OSGi 框架是 OSGi 技术最基础也是最核心的部分。

这里你需要理解 OSGi 框架的三个最重要部分:模块层、生命周期层、服务层。

模块层 :关注打包和代码共享。

OSGi 是严格要求模块化的,模块有个专有名词 bundle。每个模块都是一个 bundle,一个 Business Logic 由多个 bundle 来实现。

注:后面全部使用 bundle 代替模块来表述。

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

bundle 是需要 OSGi 进行解析的,每个 bundle 在变得可用之前,都需要完整经历该生命周期。

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

OSGi 技术全面贯彻了 SOA,每个 bundle 都是其他 bundle 提供服务,夸张一点说,不提供服务的 bundle 就没有存在的价值。

2.1 OSGi 三层架构-模块层

模块化其实就是计算机科学中常见的一个概念:将一个大型系统分解为多个较小的互相协作的逻单元,通过强制设定模块之间的逻辑边界来改善系统的维护性和封装性。

模块层定义了 OSGi 中的模块 bundle:

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

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

bundle 的核心是 META-NF 目录下的 MANIFEST.MF 文件。

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

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

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

来看看在 MANIFEST.MF 中可以定义哪些 Bundle 的的元数据信息:

属性

属性描述

Bundle-Activator

Bundle 的 Activator 类名

Bundle-Category

Bundle 的分类属性描述

Bundle-Classpath

Bundle 的 Classpath

Bundle-Copyright

Bundle 的版权

Bundle-Description

Bundle 的描述信息

Bundle-DocURL

Bundle 的文档 URL 地址

Bundle-Localization

Bundle 的国际化文件

Bundle-ManifestVersion

定义 Bundle 所遵循的规范的版本, OSGI R3 对应的值为1, OSGI R4 对应的值为2

Bundle-Name

Bundle的有意义的名称

Bundle-NativeCode

Bundle 所引用的 Native Code 的地址

bundle-RequiredExecutionEnvironment

Bundle 运行所需要的环境,如可指定为需要 OSGI R3、Java1.4、Java1.3 等

Bundle-SymbolicName

Bundle 的唯一标识名,可采用类似 java package 名的机制来保证唯一性

Bundle-Version

Bundle 的版本

Dynamiclmport-Package

Bundle 动态引用的 package

Export-Package

Bundle对外暴露的 package

Fragment-Host

Fragment 类型 Bundle 所属的 Bundle 名

Import-Package

Bundle 引用的 package

Require-Bundle

Bundle 所需要引用的其他的 Bundle

2.2 OSGi 三层架构-生命周期

状态是 Bundle 在运行期的一项动态属性,不同状态的 Bundle 具有不同的行为,生命周期层规范定义了 Bundle 生命周期过程之中的 6 种状态。

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

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

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

2.3 OSGi 三层架构-服务层

OSGi 的服务层除了面向服务的编程模型,还有一个区别于其他很多类似模型的特性。也就是说,当一个 bundle 发现并开始使用 OSGi 中的一个服务了以后,这个服务可能在任何的时候改变或者是消失。

OSGi 框架有一个中心化的注册表,这个注册表从 publish-find-bind 模型:

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 容器的实现)

4. OSGi 特点

从开发的角度:

复杂性的降低:基于 OSGi 的组件横型 bundle 能够隐藏内部实现,bundle 基于服务进行交互。

复用:很多第三方的组件可以以 bundle 的形式进行复用。

简单:核心的 API 总过包括不超过 30 个类和接口。

小巧: OSGi R4 和实现仅需要 300KB 的 JAR file 就足够。在系统中引入 OSGi 几乎有什么开销。

非侵入式:服务可以以 POJO 的形式实现,不需要关注特定的接口。

从可维护的角度:

切合真实运行环境:OSGi 框架是动态的,bundle 能够进行即时的更新,服务可以根据需要动态增加或者删除。

易于部署:OSGi 定义了组件是如何安装和管理的,标准化的管理 API 使得 OSGi。 能够和现有和将来的各种系统有机的集成。

动态更新:这是 OSGi 被最经常提起的一个特性,即所谓的 "热插拔" 特性,bundle 能够动态的安装、启动、停止、更新和卸载,而整个系统无需重启。

适配性:这主要得益于 OSGi 提供的服务机制、组件可以动态的注册、获取和监听服务,使得系统能够在 OSGi 环境调整自己的功能。

版本化:bundle 可以版本化,多版本能够共存而不会影响系统功能。

懒加载:OSGi 技术采用了很多懒加载机制。比如服务可以被注册,但是直到被使用时才创建。

5. OSGi VS 传统 java 模块化

"OSGi" 相比 "传统 java 模块化" 有以下优势:

基于接口编程,完全隐藏底层代码实现

动态性(对扩展开放,即使是运行时的)

版本控制

部分支持 OSGi 的项目:

Apache cxf、Apache thrift、Apache activemq、Apache curator Activiti、drools、mysql-connector-java、postgresql(java client)、rabbitmq(java client)、hazelcast

OSGi 的缺点:

目前只支持Java

入门高、技术更加复杂

相对的重量级

资料匮乏

lib 支持的不好,很多 lib 无法在 OSGi 环境下运行

6. OSGi 开源框架介绍

Equinox:OSGi R4 core framework 的一个实现,一组实现各种可选的 OSGi bundle 和一些开发基于 OSGi 技术的系统所需要的基础构件。 Eclipse 是基于 Equinox 项目开发的一个典型例子。具体内容可以从 http://www.eclipse.org/equinox/ 下载。

比较适合不需要集成太多外部技术的应用,如桌面应用开发,当需要进行集成时,会遇到相当多的兼容性问题;

Apache Felix:实现 OSGi R4 规范(包括 OSGi 框架,Standard Service 和其它 OSGi 相关技术)的另一个开源项目。具体内容可以从 http://felix.apache.org/ 下载。

与 Equinox 非常相似,都属于基础环境。但也有一个最大的不同,其兼容性、可扩展性都比较强,能够很方便的集成 Web Container、DataSource 管理等许多实际开发中必须具备的组件。但是这里有个很大的隐患:所有的集成都需要手工完成,质量、测试都无法保证,作为系统最重要的基础运行环境,其稳定性、可靠性是至关重要的。

Apache Karaf:一个基于 OSGi 的运行环境,它提供了一个轻量级的 OSGi 容器,可以用于部署各种组件和应用程序。它提供了很多的组件和功能用于帮助开发人员更加灵活的部署应用,更适合作为商业化产品的开发、运行平台。具体内容可以从 http://karaf.apache.org/ 下载。

结论:使用 karaf 作为接下来的 OSGi 基础平台,进行下一步的 JavaEE 与 OSGi 整合工作。

参考:

java osgi 文件_OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统相关推荐

  1. 总结java创建文件夹的4种方法及其优缺点-JAVA IO基础总结第三篇

    本文是Java IO总结系列篇的第3篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  2. java 编译文件 命令,CMD命令行编译运行单个java文件

    java文件中不含包名 这种情况比较简单 public class NoPackage{ public static void main(String[] args){ System.out.prin ...

  3. ant java xml文件,ant 学习(2)-ant开发java程序,buile.xml文件分离

    用Ant 开发java 程序----以及将build.xml文件拆分 用Ant 开发java 程序,以HelloWord 为例 1> 本次实例的目录结构: c:\ant_test 主目录 --- ...

  4. mac java打包文件_关于macos:使用JarBundler将Java转换为MacOSX的.app文件

    我要做的就是将一个简单的Java程序转换为一个macOSX .app文件,以便我可以将其作为简单的可执行文件分发. 我到处都读过,每个人都说相同的话: 使用Xcode-据我所知,Xcode不再支持Ja ...

  5. java保存文件到linux指定目录_怎么使用java编程实现linux下全部文件目录的遍历

    为了避免目录列举消耗时间过长,请指定一个目录来模拟,命令行参数:代表路径的字符串. 如果认可代码,请加分50,谢谢 ---- import javax.swing.*; import javax.sw ...

  6. java压缩文件能否不压缩路径_如何在Java中压缩文件而不包含文件路径

    例如,我要压缩存储在/Users/me/Desktop/image.jpg中的文件 我做了这个方法: public static Boolean generateZipFile(ArrayList s ...

  7. mac java 创建文件夹_在mac电脑上创建java的一些简单操作

    首先你要在电脑上下载一个JDK创造出一个java环境 如下第二个: 然后步奏如下: step1: 苹果->系统偏好设置->最下边点MySQL 在弹出页面中 关闭mysql服务(点击stop ...

  8. cmd 将文件夹下文件剪切到另外一个文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...

    本文是Java IO总结系列篇的第5篇,前篇的访问地址如下: 总结java中创建并写文件的5种方式-JAVA IO基础总结第一篇 总结java从文件中读取数据的6种方法-JAVA IO基础总结第二篇 ...

  9. JAVA面试常考系列一

    转载自 JAVA面试常考系列一 题目一 什么是Java虚拟机?为什么Java被称为平台无关的编程语言? java虚拟机是一个可以执行字节码文件(.class)的虚拟机进程. 为什么java与平台无关呢 ...

最新文章

  1. 描述一下 Intent 和 IntentFilter?
  2. ICCV2021 | SMCA:即插即用的共同注意力模型,可使DETR收敛加速10倍
  3. 蓄力十年,做一个成就
  4. 有源则至清——我读《移山之道》
  5. Xquery 被设计用来查询 XML 数据
  6. where is Angular parts filled
  7. P4781-[模板]拉格朗日插值
  8. 倦怠和枯燥_我如何艰难地学习倦怠
  9. 如何手工配置DBControl
  10. elasticsearch安装bigdest插件
  11. callback回调使用 vue_Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸
  12. A站没落了,付费会员成B站破解盈利难题的最优解?
  13. 测试计算机性能的软件比较专业,用什么软件测验电脑CPU性能最好
  14. 23、Camunda DMN决策初探
  15. 爬虫爬取到百度首页html,python爬虫实战之爬取百度首页的方法
  16. Java 垃圾回收器G1介绍
  17. 计算机分区gpt无法启动项,双系统引导失败怎么修复?用bcd编辑MBR/GPT教程
  18. 达索Catia许可证优化管理方案
  19. H5+css+js前端特效源代码:发光动画按钮:上传按钮
  20. 【转】手机充电器原理

热门文章

  1. 【Linux】用Linux命令一次性解压多个.tar.gz文件
  2. Windows里面的DISKPART分区工具
  3. php批量上传图片并带参数,php批量上传图片并把图片名放入数据库
  4. laravel 批量上传图片
  5. 怎样批量自动上传图片
  6. python安装annoy
  7. 基于SSM技术的汽车销售系统
  8. 智慧树日均直播课堂超1.5万次 声网RTC技术保障学生“学的好”
  9. HTTP/2 504 Gateway Timeout 36369ms
  10. 纯Java项目批处理(打包方法二)