OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统
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 整合工作。
参考:
http://blog.csdn.net/cz_jjq/article/details/50378661
OSGi 系列(一)之什么是 OSGi :Java 语言的动态模块系统的更多相关文章
- OSGi是什么:Java语言的动态模块系统(一)
OSGi是什么 OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构.OSGi容器已有多家开源实现,比如Knoflerfish.Equinox和Apache的Felix.您 ...
- 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些
目录 1 HotSpot VM的历史 2 HotSpot VM 概述 2.1 编译器 2.2 解释器 2.3 解释型语言 VS 编译型语言 3 动态编译 3.1 什么是动态编译 3.2 HotSpot ...
- 让这个Java语言的开源商城系统火起来
Java是一门非常优秀的面向对象编程语言,功能强大且简单易用,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,凭借其简单性.面向对象.分布式.健壮性.安全性.平台独立与可 ...
- 别人家的java语言编写的自动化测试系统
https://gitee.com/testdevops/easyrest 但是我还不会用 ~~~~(>_<)~~~~ 目前的状况是:大概知道流程了,可是第一个用例就跑步起来 自己想写一些 ...
- Java语言的9个主要特性
Java作为时下很流行的一门编程语言,受到很多人的热爱,那么它有哪些特性呢?一起来看看吧. 1.Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用.另 ...
- Jigsaw 项目:Java 模块系统新手引导
前言 随着 2017 年 10 月 Java 9 的发布,Java 能够使用模块系统了,但是中文互联网上的资料太少,许多关于 Java 模块系统的文章都只是介绍了模块系统的好处,或者给了一些毫无组织的 ...
- 2018.6.13 Java语言基础复习总结
Java语言基础与面向对象编程实践 第一章 初识Java 1.1机器语言 机器语言是指一台计算机全部的指令集合.机器语言室友0和1组成的二进制数,是一串串由0和1组成的指令序列,可将这些指令序列交给计 ...
- 开发电商平台用PHP语言和JAVA语言有什么区别?哪种语言更好?
现在很多行业都通过电子商务拓展业务,所以商城系统开发成为很多企业的刚性需求.一般有一点技术基础的客户应该知道目前商城系统开发主流语言有两个,PHP和Java.那么很多客户朋友会纠结是选择哪个语言开发好 ...
- Java 语言的主要特性
Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用. Java丢弃了C++中很少使用的.很难理解的.令人迷惑的那些特性,如操作符重载.多继承.自动的强 ...
随机推荐
- tomcat启动原理
2018年04月12日 19:55:22 太极小帅帅 阅读数:282 前言 一直在用Tomcat,但是对其启动原理一直没去研究,这里准备去面试,可能会问道.于是总结了下启动原理.完全凭感觉去揣测, ...
- MNIST数据集入门
简单的训练MNIST数据集 (0-9的数字图片) 详细地址(包括下载地址):http://www.tensorfly.cn/tfdoc/tutorials/mnist_beginners.html # ...
- Mysql-表关系
表关系分为三种:一对一,一对多,多对多 一对多:一个学院对应多个学生,而一个学生只对应一个学院 -- 这儿classroom 是代表的学院. -- 一对多 - A表的一条记录 对应 B 表多条记 ...
- jqgird
将jqgird某字段设为超链接,并传递相关参数 cellvalue:为后台传递过来的字段数据 rowObject:为本行数据 实现: formatter:function(cellvalue, opt ...
- thymeleaf的使用
1.导包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- VBA 操作 VBE
Introduction You can write code in VBA that reads or modifies other VBA projects, modules, or proced ...
- C++ 实现的netstat -an 的功能<转>-目的为获取rtmp推流地址如果是域名的话查看1935的ip
目的可能是为了获取rtmp真正的推流ip 如果rtmp推流地址是域名,往CDN推流的话,需要nslookup 的那种DNS解析,然后获取的几个ip 可以使用netstat -n 等命令查看 1935 ...
- UI5-文档-4.3-Controls
现在是时候构建我们的第一个小UI了,将HTML主体中的“Hello World”文本替换为SAPUI5控件sap.m.Text.首先,我们将使用JavaScript控件接口来设置UI,然后将控件实例放 ...
- struts2,servlet和springmvc的单例多例问题
struts2,servlet和springmvc的单例多例问题 原创 2017年06月12日 09:59:21 标签: struts2 / servlet / springmvc / 单例 / 多例 ...
- DELL服务器iDRAC相关设置
iDRAC又称为Integrated Dell Remote Access Controller,也就是集成戴尔远程控制卡 iDRAC卡相当于是附加在服务器上的一台小电脑,通过与服务器主板上的管理芯片 ...