`
yipsilon
  • 浏览: 244683 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

OSGi的热部署特性及实现

阅读更多

很多文章里都提到了OSGi的热部署特性,但是很少有实例去演示它。

 

所谓热部署,就是在不停止服务运行时(或者说在不影响用户体验前提下)动态更新其服务内容,最终达到100%在线率的目标。而Java中,由于类加载机制的原因,导致一个类一旦加载进去就再也无法释放,因此,OSGi引入了基于插件的类加载机制,举例说明:plugin1里有examples.Test1类,而pulgin2里也有examples.Test1类,在载入这两个插件时,两个类是可以同时载入进入到类缓存中,这归功于OSGi实现的插件类加载器(ClassLoader),具体大家可以查看BlueDavy的《OSGi实战》和《OSGi进阶》两本电子书,我就不在这里费口舌了。

 

OSGi中,实现热部署最关键的方式就是使用服务 (Service),例如,我们要注册一个服务:

// 代码1
// BundleContext context ...
context.registerService("examples.Test", "world", null);

这样,就注册了名称为“examples.Test”,值为“world”的服务,其他依赖的插件们,只需要使用下面代码即可以调用:

// 代码2
// BundleContext context ...
Object rtn = context.getService(context.getServiceReference("examples.Test"));

好了,这些都是基础部分,下面看看如何来实现热部署的。

 

假设,我有一个插件为 examples_1.0.0,表示为 examples 插件且版本为1.0.0版,它里面使用【代码1】注册服务之后,其他依赖的插件们使用【代码2】调用“examples.Test”服务后返回的是“world”。经过一段时间运行后,运营人员发现“examples.Test”服务的值应该是“hello”,而不是“world”,这个bug就被找出。因此,开发人员就更新了 examples 插件,并升级版本为 1.0.1,代码内容改变如下:

// 代码3
// BundleContext context ...
context.registerService("examples.Test", "hello", null);

使用OSGi运行环境安装了 examples_1.0.1 插件之后,根据热部署的概念,按道理说依赖的插件们使用【代码2】调用的结果应该是“hello”才对,有一些OSGi实现确实是这么做的,但是一些主流的实现(如 equinox 等)返回的其实还是原来“world”,这是为什么呢?

 

这其实是 Service Ranking 搞的鬼,默认情况下,每个服务的 Service Ranking 都为 0(零),因此,在注册同名服务时,默认加载第一个注册的服务。因此,为了让依赖的插件们加载最新的 examples_1.0.1 插件所提供的服务,我们需要把【代码3】进行如下修改:

// 代码4
// BundleContext context ...
Dictionary props = new Dictionary();
props.put(org.osgi.framework.Constants.SERVICE_RANKING, new Integer(100));
context.registerService("examples.Test", "hello", props);

我们把“examples.Test”服务的 Service Ranking 属性更改成了 100(任何比所有其他服务的Service Ranking都大的值) 之后,该服务的排名就会排到最前面,依赖 examples 的插件们再使用【代码3】调用服务后,就返回了我们想要的“hello”字符串。

 

这也就是说,在不需要停止服务和其他插件都不用更新的情况下,我们只需要再安装一个更新版本的插件,其所注册的服务就可以自动更新并应用到所有调用该插件的插件中,达到了热部署的目的。

分享到:
评论
11 楼 yipsilon 2009-10-29  
ahuango 写道
最近正在学OSGI, 看了楼主的帖子很受益。 以前光看OSGI, 确实想不出他用在哪里比较合适。 OSGI 如果用户客户端发布,那么它的console如何才能被隐藏呢? 使用javaw来运行吗?

console 其实是osgi实现库的一个扩展,4.2之前并没有规定必须要有这东西,貌似r4.2版出来了一个规范。

用javaw运行,就可以隐藏console。当然你可以根据不同实现库提供的管理api去管理bundles。
10 楼 ahuango 2009-10-18  
最近正在学OSGI, 看了楼主的帖子很受益。 以前光看OSGI, 确实想不出他用在哪里比较合适。 OSGI 如果用户客户端发布,那么它的console如何才能被隐藏呢? 使用javaw来运行吗?
9 楼 maxin32 2009-09-15  
好处还是很多的
1 不同buddle使用自己的类加载器,解决了一些冲突问题,比如在classpath中有多个包,碰巧一个名字相同的类在两个包中都有,那么只能加载第一个
2 相对于jar包的管理,osgi提供了额外的信息,比如版本,明确的依赖关系。
3 热部署
应该还有的,呵呵
8 楼 yipsilon 2009-06-16  
shijiyu 写道
这个热部署以后还要重启应用才能识别新的bundle 能否不重启应用自动识别新的bundle然后部署bundle呢?


不用重启啊,在console里,直接install就行。
7 楼 zhouwendong006 2009-06-16  
大家有没有OSGi比较好的实例?我自己写过!但是还不是很熟练,有些应用不知道该从哪里下手!比如,自动搜索合适的Bundle并且安装!可以的话,请发到我的邮箱:zhouwendong006@163.com
6 楼 shijiyu 2009-06-15  
这个热部署以后还要重启应用才能识别新的bundle 能否不重启应用自动识别新的bundle然后部署bundle呢?
5 楼 honno 2009-05-22  
glacier3 写道
osgi的思想很好,在开发的过程中或多或少都会按照服务划分模块;确实osgi感觉开发的时候不方便(没有maven方便),现在使用像maven这些包依赖管理工具,已经很方便了,而且osgi的热部署能力大多情况都用不上。能请lz举举你们在项目中怎么使用osgi的吗?

OSGI Bundles是最基本的单元。另外,开发OSGI Bundles时可以将maven作为工具生成相关文件。OSGI和maven是两个不同的概念。
4 楼 yipsilon 2009-04-29  
<div class="quote_title">glacier3 写道</div>
<div class="quote_div">osgi的思想很好,在开发的过程中或多或少都会按照服务划分模块;确实osgi感觉开发的时候不方便(没有maven方便),现在使用像maven这些包依赖管理工具,已经很方便了,而且osgi的热部署能力大多情况都用不上。能请lz举举你们在项目中怎么使用osgi的吗?</div>
<p> </p>
<p> 其实,OSGi的特性之一,就是用规则去迫使架构师在软件设计上重视bundle的可重用性。假设我们开发一款游戏软件(仅仅是假设),那么,游戏端可以是这样的:</p>
<p style="text-align: center;"><img src="/upload/attachment/99052/d4dce71f-d118-3004-b091-b427f797bc70.gif" alt="" width="311" height="84"></p>
<p>而服务器端的软件,可以是这样的:</p>
<p style="text-align: center;"><img src="/upload/attachment/99044/7f02d933-7cec-3e93-beb1-b89cd5d78b85.gif" alt="" width="315" height="87"></p>
<p style="text-align: left;">由此,可以看出,两个软件不同之处仅仅在于 com.xiapao.games.ddz.client.jar 和 com.xiapao.games.ddz.server.jar,而其他的bundles都是公用的。</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">这里就有个好处,如果我们在发牌算法上,更改了一些算分策略或者出牌策略,那么,在理想情况下,游戏端会自动下载更新的bundle(s),例如更新 com.xiapao.games.ddz.jar 这个公用bundle,然后在后台进行安装,通过本文讲的热部署特性加载新策略算法。当玩家玩完一局,不用关闭软件,再开始一局时,就可以使用新的策略来进行计算了,所有的事情都在不知不觉中进行,不会影响用户体验。</p>
3 楼 glacier3 2009-04-28  
osgi的思想很好,在开发的过程中或多或少都会按照服务划分模块;确实osgi感觉开发的时候不方便(没有maven方便),现在使用像maven这些包依赖管理工具,已经很方便了,而且osgi的热部署能力大多情况都用不上。能请lz举举你们在项目中怎么使用osgi的吗?
2 楼 yipsilon 2009-04-06  
xyz20003 写道

感觉不太对,热部署应该是指把在系统启动后,在OSGi环境里管理bundle吧?service应该属于bundle的一部分,可以这样分开来操作么? 或许是没有了解lz的意思,不过我们用最简陋的方法,为bundle配置activator,在bundle安装的时候自动把service注册上。


我说的就是你表达的这个“最简陋”的方法呀,呵呵。

所有的代码都是在插件的 BundleActivator.start 方法里实现的,而且所有Bundles也都是OSGi环境里管理的,这是规范,必须要遵守。

我的目的是想用一个非常简单的案例来描述在OSGi环境下热部署的特性,毕竟很多人都知道OSGi好,但不知道其到底好在哪里。
1 楼 xyz20003 2009-04-05  
感觉不太对,热部署应该是指把在系统启动后,在OSGi环境里管理bundle吧?service应该属于bundle的一部分,可以这样分开来操作么?

或许是没有了解lz的意思,不过我们用最简陋的方法,为bundle配置activator,在bundle安装的时候自动把service注册上。

相关推荐

    OSGI原理和实现

    ### OSGI原理和实现深度解析 #### 一、OSGI概述 OSGi(Open Service Gateway Initiative)是一种Java平台上的模块化系统和动态模块化能力的实现,它为开发复杂的应用程序提供了一种灵活的框架。OSGi允许将应用程序...

    把OSGI部署成一个可运行的例子

    OSGI(Open Services Gateway Initiative)是一种模块化系统和Java服务框架,它允许应用...在实际开发中,你还可以探索更多高级特性,如Fragment Bundle、Delegation、Policy等内容,以实现更复杂的模块化系统设计。

    osgi介绍osgi介绍

    ### OSGi的主要特性: 1. **模块化**:每个bundle都是一个独立的模块,有自己的类路径和资源,可以通过声明式服务来暴露和消费接口。 2. **动态性**:bundle可以在运行时安装、启动、停止或卸载,使得系统可以进行热...

    基于OSGi的热插拔观察者模式

    本文将深入探讨如何利用OSGi的特性实现一个基于观察者模式的热部署系统。 观察者模式是一种行为设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...

    osgi资料

    - 微服务架构:讨论如何利用OSGi的模块化特性构建微服务,实现松耦合和独立部署。 - AOP在OSGi中的应用:阐述Spring的面向切面编程(AOP)在OSGi环境下的实现和优势。 - 测试策略:提供针对OSGi应用的测试方法,...

    开发一个简单的 OSGi Web 应用实例

    这个示例应用能够计算两个数字的和或乘积,并展示了OSGi bundle的动态部署特性。 #### 二、项目背景及目标 **背景:** OSGi (Open Service Gateway Initiative) 是一种模块化容器,它允许Java应用程序以模块化的形式...

    OSGI 入门资料PDF

    它为Java开发人员提供了一个框架,使他们能够构建可热插拔的组件,从而实现更灵活、可扩展和可维护的软件系统。在本入门资料中,我们将探讨OSGI的关键概念、优势以及如何通过实战和最佳实践来掌握它。 1. OSGI原理...

    osgi felix plug in

    - **配置管理**:Felix插件可以处理配置管理,动态改变模块的配置信息,实现配置的热更新。 - **依赖注入**:通过插件,可以实现依赖的自动注入,简化代码编写,提高可维护性。 4. **源码分析**: - **阅读和...

    osgi框架开发介绍

    3. **生命周期管理**:OSGi框架提供对Bundle的启动、停止、更新和卸载等操作,允许开发者在运行时动态地添加、移除或更新模块,实现热部署。 二、OSGi框架开发模式 1. **依赖管理**:在OSGi中,每个Bundle声明其...

    OSGI入门和整合Spring

    这种特性使得OSGI在大型复杂系统中特别有用,因为它允许开发者在不重启整个应用的情况下热部署和热更新代码。 OSGI的核心概念是bundle,每个bundle都是一个自包含的单元,包含了运行所需的类、资源和元数据。...

    spring-osgi 入门手册和代码

    OSGi 是一种模块化系统,它允许开发人员创建可热部署、可升级且相互独立的模块,称为“bundle”。下面,我们将深入探讨 Spring OSGi 的核心概念、优点以及如何开始使用它。 1. **Spring OSGi 核心概念** - **...

    OSGI相关

    3. **生命周期管理**:OSGI提供了启动、停止、更新和卸载等管理Bundle的API,使得动态更新和热部署成为可能。 4. **依赖管理**:OSGI通过解析Bundle的MANIFEST.MF文件来管理依赖关系,确保模块之间的依赖得到正确...

    OSGI 实战教程

    4. **持续集成和测试**:在开发过程中,OSGI的热部署特性可以加速测试和调试过程,开发者可以在不中断整个系统的情况下更新单个bundle。 **三、OSGI关键概念** 1. **Repository**:存储bundle的地方,可以是本地...

    Spring OSGI 快速入门中文教程

    - **热部署**:在运行时可以更新Bundle,无需重启系统。 - **灵活性**:允许按需加载或卸载模块,降低了系统的耦合度。 **3. Spring OSGi环境搭建** - **选择OSGi实现**:如Apache Felix、Equinox等,它们提供了...

    Tomcat-Osgi

    5. **开发实践**:开发过程中,开发者可以利用OSGi的特性,如使用版本控制来管理组件之间的依赖关系,通过服务注册表动态查找和使用服务,以及利用热更新功能进行快速调试和修复。 6. **Tomcat-OSGi-QuickStart**...

    OSGI实战及源码

    8. **Equinox与Felix**:作为OSGI实现的两个主流框架,Equinox(由Eclipse基金会维护)和Felix(Apache项目)的特性对比和使用方法。 9. **实战案例**:通过具体的项目实例,演示如何运用OSGI解决实际问题,如创建...

    osgi文档

    总结来说,OSGi是一种强大的模块化系统,它提供了动态部署、服务导向的架构和类隔离等特性,有助于构建更健壮、可维护的Java应用。通过阅读提供的PDF文档和实践代码,开发者可以深入理解OSGi的工作原理,并将其有效...

    OSGi原理与最佳实践 例子和pdf

    1. "OSGi进阶":这本书可能涵盖了OSGi的高级特性和技术,适合已经对基础有所了解的读者进一步提升。 2. "深入理解OSGi:Equinox原理、应用与最佳实践":Equinox是OSGi的一个实现,该书深入探讨了其原理,并结合实际...

Global site tag (gtag.js) - Google Analytics