OSGI基础概括(一)

研究了两天的OSGI,对于这两天的学习进行一个简短的总结。

OSGi是什么

OSGi——Open Service Gateway Initiative 字面上的意思是一个公共的服务平台。OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。

简单说,它是是一个动态模块化框架的规范,提供了插件化、面向服务和插件扩展三大功能。这个规范体现非常重要的2点:“模块化”和“动态”。

OSGi容器已有多家开源实现,比如 Knoflerfish、Equinox和Apache的Felix。我们可以通过这些容器,把应用程序劈分为多个模块单元,这样,就可以更容易地管理这些模块单元之间的交叉依赖关系。

OSGi的由来

从问题入手:

面对现在的软件变得越来越庞大。这样,随之而来的最大挑战就是软件在设计上的越来越复杂和维护上的越来越困难。为了解决这个问题,软件架构师将软件切分成比较小的并且易于理解的多个模块。

软件模块化是软件架构师的主流思想。为了实现软件模块化,应运而生的就是面向对象的高级编程语言,Java是其中的典型代表。但是 Java 却不能真正的带给我们软件模块化

一个模块应该有以下3 个特性:

  • 自包含:一个模块应该是一个业务逻辑的整体。它应该可以作为一个独立的整体被移动、安装和卸载。模块不是一个原子体,它可以包含多个更小的部分,但这些部分不能独立存在。
  • 高内聚:一个模块不应该做很多不相关的事情,它应该专注于 1 个业务逻辑的目标并尽全力实现这个目标。
  • 低耦合:一个模块不应该关注其他模块的内部实现,松散的联系允许我们去更改某个特定的模块,而不会影响到其他的模块。

那么java的问题在哪里?

1,Java类装载器

针对一个Jar 文件,没有对应的 Java 运行时的概念。Jar 文件只有在开发和部署的时候有意义,而在 JVM 中,所有的 Jar文件中的内容被简单地联系在一起作为一个单独的全局的列表,这就是所谓的“Classpath”。这种类加载模式,使 Jar文件在运行时是不可见的(即在运行时是看不到依赖关系的),导致的问题不能动态加载。

2,类冲突

即当类路径上存在同一个类的不同版本时,如果类加载器找到一个版本,则不再搜索加载下一个版本(现在的Jar 文件没有版本信息,这样,同一 Jar 文件的多个版本就不能同时被加载)。

3,包可见性管理

Java没有机制在不同的 Jar 文件中隐藏信息。

考虑下面这种场景:

Jar包中包含以下三个包:

com.boco.tongyong.kernal

com.boco.tongyong.service

com.boco.tongyong.service.impl

假设impl和kernal包中是我们的实现,应用模块并不需要关心,我们只需要将service包暴露出来,应该如何处理?

4,jar包依赖性管理

即无法确定jar之间的依赖关系:现有的JAR标准中缺乏对与Jar文件之间依赖关系的定义支持,因此只有在运行时间无法找到所需的类时,才会打出java.lang.ClassNotFoundException,但这通常不能有效帮助开发人员解决问题

简单解释:Jar文件没有标准信息去指明该 Jar 文件所需要的外部依赖文件列表,这样我们就不能清楚的知道,该 Jar 文件需要和其他的那些 Jar 文件一起工作。

应对以上问题

OSGi是一个动态的Java模块(Module)系统,它规定了如何定义一个Module以及这些模块之间如何交互。每个OSGi的Java模块被称为一个bundle。每个bundle都有自己的类路径,可以精确规定哪些Java包和类可以被导出,需要导入哪些其它bundle的哪些类和包,并从而指明bundle之间的依赖关系可以指明版本信息。另外bundle可以被在运行时间安装,更新,卸载并且不影响整个应用。通过这种方式,分层的类加载机制变成了网状的类加载机制。在应用程序启动之前,OSGi就可以检测出来是否所有的依赖关系被满足,并在不满足时精确报出是哪些依赖关系没被满足。

那么接下来我们再具体说一下它的优点:

a) 可以在不重启容器的情况下,动态地安装、卸载、启动和停止我们的应用程序中的不同模块;

b) 对于应用程序中的某一特定模块,容器可以同时运行该模块的多个版本;

c)高复用性

d) OSGi为开发嵌入式应用、移动应用、富互联网应用(RIA)提供了非常优秀的基础架构

OSGI与Maven

通过以上的陈述,大家会觉得maven也具有模块化系统的特征;那么它们又有什么关系呢?maven它只是一个编译时工具,而不是运行时框架。Maven并不是OSGi的竞争者,而是OSGi的一个补充。

OSGi在企业开发中的应用

OSGi联盟(OSGiAlliance)于1999年3月开始着手制定OSGi规范,其主要目的就是要制定一套开放式标准,以便向局域网及其中的 设备提供可管理的服务;其基本思路是,一旦您在网络设备(如服务器和嵌入式设备)上使用了OSGi服务平台,您就可以在网络上的任何地方管理这些设备上运 行的软件组件的生命周期,可以在后台对这些组件进行安装、升级或卸载,但不需要打断该设备的正常运行。 近年来,OSGi技术在嵌入式系统及网络设备市场得到广泛应用。现在,由于Eclipse的成功,OSGi在企业开发中逐渐成为切实可行的、较有价值的一种技术。

总结

简单举例说明一下,比如我们在开发Web应用时,我们可以把这个Web应用分为多个模块,一个模块负责视图层,另一个模块负责DAO层,第三个模块负责数据访问层,如果我们使用OSGi容器来管理这些模块之间的交叉依赖,我们就可以在不用重启该Web应用的前提下,将DAO层从速度较慢的升级到速度较快的DAO。

下篇继续:实现简单demo

时间: 2024-08-09 02:20:26

OSGI基础概括(一)的相关文章

Android - Android基础概括

Android基础概括 本文地址: http://blog.csdn.net/caroline_wendy 1. 定义 为移动设备设计的第一个真正开发的综合平台,包含操作系统.用户界面.和应用程序,所有软件都能运行在手机上,从而消除了阻碍移动创新的障碍. 2. 主要部分 硬件:基于位置的服务硬件(如GPS).摄像头.音频.网络连接.Wi-Fi.蓝牙.传感器(包括加速计).NFC.触摸屏和电源管理. 位置服务:地图.地理编码器(geocoder)[地理编码(geocoding).地理逆编码(rev

Unity3D的基础概括1

坐标系统 坐标系统在Unity3D开发过程中具有非常重要的作用,是游戏对象定位.移动.缩放.旋转等操作的基础.坐标系统包含以下基本概念: 三维向量(Vector3): 用于表示三维坐标空间的向量和点,可进行向量运算. 世界坐标(World Space): 相对于整个世界空间建立坐标系,使用全局坐标(通过Transform.position获取).其X轴正方向指向屏幕右侧,Y轴正方向背离观察者,Z轴正方向指向屏幕上方. 视口坐标(ViewPort Space): 坐标点被归一化,并且相对于相机建立

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

OSGi是什么 OSGi亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构.OSGi容器已有多家开源实现,比如Knoflerfish.Equinox和Apache的Felix.您可以通过这些容器,把您的应用程序劈分为多个模块单元,这样,您就可以更容易地管理这些模块单元之间的交叉依赖关系. OSGi规范和Servlet规范及EJB规范类似,该规范定义了两种对象,一是容器对外提供的服务对象,另一个是容器和您的应用程序之间必须遵守的契约,其中,服务对象是容器要实现的.您如果想要在

Linux進取之旅2: 一个最基本的 LVS负载均衡架构及配置(NAT路由方式)

平台及环境: LVS1:    srv1.training.cc                       private_IP: 172.25.31.20/24    pub_IP :10.0.0.20/24    OS=rhel6.5 private_Virtual IP: 172.25.31.99/32       pub_Virtual IP:10.0.0.99/32 realserver1 :    srv2.training.cc             private_IP:17

hmm和Veterbi算法(一)

只是略微的看了些,有点感觉,还未深入,做个记录. 参考: 隐马尔可夫 (HMM).前 / 后向算法.Viterbi 算法 再次总结 谁能通俗的讲解下 viterbi 算法? 数学之美第二版的第 26 章 本文结构: 1.hmm三要素 2.维特比算法 3.简明例子 hmm三要素: 1.初始概率分布 π z1 可能是状态 1,状态 2 ... 状态 n,于是 z1 就有个 N 点分布: Z1 状态 1 状态 2 ... 状态 n 概率 P1 P2 ... Pn 即:Z1 对应个 n 维的向量. 上面

C++标准IO库

概述 先不要急着知道怎么用这个玩意,让我们一起先来看一看C++标准IO库的框架,其实挺有意思的!那就开始吧! C++的输入输出由标准库提供,标准库提供了一族类型,支持对文件.string对象.和控制窗口等设备的读写.一方面,这些IO类型都定义了如何读写内置类型的的值,另一方面,用户在设计类时可以仿照IO标准库设施读写内置类型的方式设计自己的输入输出操作. 1. 面向对象的IO库 面向对象是C++的一大特色,他的标准库自然也不例外,统统都是面向对象设计的.标准库使用了继承(inheritance)

PE框架源码分析(6):mca数据源

mca是包含了后端的所有业务逻辑,因为网银这类外围项目需要大量的与银行核心系统.客户系统或是其它外围系统通信,mca负责整合这些需求,称为"整合平台". 数据库配置 采用了OSGI模块化,MCA端的数据库配置在com.csii.mca.db模块中. 该模块主要包括以下文件: /META-INF/config/svc_db.xml //数据源相关bean /META-INF/config/dynamicservice.xml //数据源动态服务导出 /META-INF/peconfig/

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

Eclipse插件开发之基础篇(5) 制作OSGi Bundle

转载出处:http://www.cnblogs.com/liuzhuo 1. 生成OSGi工程 首先打开新工程向导,选择创建Eclipse插件工程.在[目标平台(Target Platform)]选项中选择[OSGi 框架(OSGi framework)]. 图5-1 创建插件工程 在选择模板的时候选择,Hello OSGi Bundle后点击完成. 图5-2 选择OSGi模板 生成工程后,在Manifest编辑器中点击[启动框架(Launch the framework)]运行新生成的OSGi