基于代理的动态软件更新方法

2013-05-24 15:51黄晗
三明学院学报 2013年4期
关键词:调用代理构件

黄晗

(泉州师范学院物理与信息工程学院,福建泉州362000)

基于代理的动态软件更新方法

黄晗

(泉州师范学院物理与信息工程学院,福建泉州362000)

动态软件更新是一种新型的软件演化机制,它允许应用软件系统在运行过程中执行软件更新而不会出现停机状态。一些大型重要的应用软件系统需要提供不间断的可用性服务将受益于此机制,因此将OSGI作为软件构件的支撑平台,提出一种基于代理的OSGi构件动态更新方法。该方法继承了OSGi良好的生命周期管理和动态依赖管理特性,拓展了其动态性和互换性的特点。实验表明,该方法可以准确地进行OSGi构件的动态更新,将对智能家居环境下的系统维护及其软件演化提供一定的指导意义。

代理;动态软件;更新;OSGi;构件;bundle

目前,不仅专业化的软件系统需要为客户提供不间断服务,比如航天航空科技和医院的生命支撑平台等都必须连续运行,就是一些“大众化”的软件系统如银行等金融机构的服务器一旦停机也可能造成巨大恐慌,因此动态软件更新是一种机制,它允许软件更新或打补丁到被应用正在运行系统的服务中去而不会出现停机或宕机等故障。文献[1]通过分析比较,论证了动态软件更新是在不停机情况下最佳的选择方法。杨芙清等[2]提出了构件的软件开发是提高软件开发效率和质量的保证,并已在分布式系统中得到了充分的验证。OSGi(open service gateway initiative)框架作为一种成功服务的平台模型,其开放源代码的形式可以作为部署软件服务的基础平台。R-OSGi在OSGi基础上将单一的JAVA虚拟机扩展到分布平台上,通过引入一个R-OSGi的bundle构件组成了远程服务,形成网络通道,生成代理来实现一个分布环境支持OSGi标准的中间件平台,该平台被广泛地应用在各种应用程序中。对动态软件更新有多种方法,Iulian Neamtiu[3]设计一个Ginseng系统完成对基于过程的程序的动态更新,它通过打补丁的方法来保证不会违反类型安全等事宜;Malabarba[4]通过修改了标准的Java虚拟机引入动态类的方法,违背了Java跨平台的初衷;而Plash[5]等人提出了支持动态组件更新的DCUP体系结构,但它对开发人员不是透明的。本文提出了一种基于OSGi平台的代理动态软件更新的方法,增加一个bundle而不修改OSGi的平台结构来完成动态软件更新,而鲍春键[6]等人提出更新操作必须解决4个问题,也就是确定更新单元、获取最佳更新时机、状态转移机制确立和请求重定向,其中状态转移机制是最重要的,如果能保持当前的状态,就可以确保更新处理过程的正确执行。因此由服务主动保存当前状态,然后提取状态,转移到新的服务,再替换原服务的状态也是一种可以进行实践的想法。

本文采用在client和server之间加入一层Myproxy(代理),通过降低bundle间的耦合程度加大server可控性,因为对于动态软件更新永远只能在server上进行,步骤是MyProxy发现服务并注册服务,client通过MyProxy获取服务,MyProxy帮助client调用服务。

1 代理更新

代理模式是常用的Java设计模式[7],动态代理中的代理类通过java.lang.reflect.proxy类在运行时根据接口定义,采用Java反射功能动态生成的,它的特征是代理类与委托类有同样的接口,并通过java.lang.reflect.InvocationHandler实现handler对象。本文所用到的代理更新框架如图1所示,该结构由3 个bundle分别是更新模块,代理显示模块以及测试模块组成。

更新模块:包括保存状态子模块,R-OSGi服务寻找子模块和动态更新实现子模块组成。R-OSGi服务寻找子模块获取bundle上的client要更新的信息,记录bundle的标记并将信息状态传递保存块,同时代理子模块要完成调用更新过程。

代理显示模块:该模块在管理端显示要更新的bundle模块,可以以图形的形式和XML文件的形式输出。

试验测试模块:为了测试而专门引进的一个模块,以图形的形式直观显示。

为了不修改底层OSGi以及R-OSGi的结构,只使用它们的服务,也不修改bundle的业务逻辑,使用代理传递所需更新的bundle的实现,无需对相应bundle作任何更改,只产生一个相应的代理来管理bundle的服务请求。

图1 代理的动态更新框架结构图

1.1 基于代理的服务更新

该方法使用代理来进行更新,如图2所示。在org. osgi.framework.Service.Discovery.Listener接口中定义了对bundle远程的注册服务,MyProxy代理类实现了接口这一功能,当发现出现一个新的远程服务时,调用_announceService这个函数,把远程服务注册的接口及URI加入到注册表中;而当远程服务没有调用时,则使用_discardService函数,把注册表中这项服务记录删除。

1.1.1 两张注册表

图2 代理类图

(1)u&i_map:用来记录MyProxy Class所发现的当前每一个可用的服务,把服务实现的接口,服务的地址记录到注册表中。存在一种可能是如果存在两个服务,在接口相同但其地址不同,这表明有两个client在不同地址上同时申请该项服务,本方法当作两个服务对象。

(2)registry_map:用来记录当前正在被client所使用的服务,本地代理bundle以及client使用的服务实例handler对象。

1.1.2 调用服务

该方法通过增加的MyProxy bundle(代理)的3个函数getService(),setService(),action()完成调用功能。下面谈谈setService(),首先它调用getService生成一个实例,并为IProxy服务的using_service所捕获,完成一个实例。

其调用分成两个阶段进行:

第一阶段:

1)client要求服务被MyProxy捕获,获得getService;

2)IProxy的setService函数被调用;

3)IProxy的using_service方法。

第二阶段:

1)client调用IProxy的action函数;

2)IProxy使用using_service方法中的action函数;

3)调用handler中的invoke函数,完成实现类调用。

1.1.3 更新服务

该方法通过增加的MyProxy bundle(代理)中的3个函数replace(),update(),addingService()完成更新功能如图3所示,其算法如下:

1)client更新命令被MyProxy捕获;

2)IProxy调用replace进行bundle定位;

3)handler中的update与invoke进行时机判断;

4)如果invoke则实现类调用,否则update获得控制获取最佳更新时机;

4-1)提取原服务状态;

4-2)停止服务;

4-3)重定向到新服务的handle中去;

5)新服务resume;

6)更新结束,去除标记,断开旧服务。

图3 远程服务更新

1.2 服务状态存储

OSGi上各个bundle中发布着不同的服务,我们以一个服务作为更新的粒度,服务拥有良好的接口和封闭性,因此在更新阶段需要解决状态的转移问题,本文使用一个接口IUpdate来主动保存原来的状态,通过3个函数object(),resume(),action()完成状态的转移,如图3所示。

1.3 请求服务bundle标记

请求服务标记模块为每一个bundle打上标记,该方法利用Java TI[8]技术来对client进行标记,当一个线程获得更新服务命令时,会在相应记录的bundle上留有标记并在更新完毕时去除。

1.4 代理显示模块

代理显示模块主要是使用Java的AWT图形界面交互的接口,利用其能提供操作系统的图形库,在本地注册一个R-OSGi的远程服务,如properties.put (RemoteOSGiService,"info.UI");管理员可以通过R-OSGi系统提供的UI服务来获取这个图形界面,UI类将收集当前在MyProxy所在的OSGi平台上所有代理所注册服务信息,并将直接在屏幕是显示当前MyProxy上注册的服务,如图4所示。

图4 代理信息显示

2 试验与分析

为了很好地观测更新过程,该方法再增加一个bundle,负责处理与数据更新相关的一些内容,如获取M yProxy的数据、写入文件、返回到图像信息,如图5所示。

通过task函数get_used_time()返回从MyProxy中获得数据始到现在止的时间;get_state()返回当前的数据量,是个bool函数;run()函数将获取数据写入文件,在Myframe接口中通过t.scheduleAtFixedRate(new MyTask(),50,100),将在100ms抽样一次以获取相关数据量,通过幅度与时间的比值或可获得数据速率,并显示在屏幕上,我们的测试环境是将两台intel P4 2.1GHz,1G内存的电脑连接在一个相对独立的实验室局域网内,运行环境是windows7和R-OSGi框架,并建立两个快慢数据传输软件,如图6所示,图中是数据高速软件在传输过程的某个时间内被低速软件迅速代替。

图5 测验类图

图6 动态更新实验

适用性分析:更新框架采用独立的bundle代理机制,避免对OSGi平台的侵入,直接运行在Java虚拟机平台上,再加上OSGi本身是智能家居的控制模块,因此特别适合于嵌入式设备。

透明性分析:管理人员简单操作动态更新过程,使用服务注册、发布、绑定,实现了对用户的透明,但在更新期间或多或少会受到更新内容的影响,如动态实验中传输速度变慢可能会被客户认为服务不可用,因此在更新过程中还要进行回滚等方法给予协助。

正确性分析:除了上述方法回滚外,在运行过程中选择原来状态变量的保存,更新时机选择在最佳安全时期(例如选择在软件使用量最少时机),状态保存和转移遵从严格的约定,保持状态中所有变量前后一致性。

3 讨论

由于OSGi中各个bundle存在着不同的生命周期,不可避免地需要进行各种维护,软件也需要进行升级。Sameer[9]实现了用于支持C/S结构动态更新的基础框架,但对于新旧版本出现不兼容的情况却无法解决,Baumann[10]等人就面向对象操作系统的动态更新建立一套实用的机制但没有考虑接口问题,Tewksbury[11]等人则描述CORBA使用中间版本的进行更新的更新机制,Kramer[12]和Magee[13]等人主要集中在构件动态更新上,王晓鹏[14]等人主要处理构件化软件的动态更新问题,而上海交大的RAD实验室则组织了对基于服务的分布式软件动态更新关键技术研究和分布式系统中软件动态更新的形式化研究等国家级重点课题的攻关并取得多项国家发明专利,但嵌入式系统动态更新技术发展进步有限[15],这一问题值得我们进一步探索。本文提出了一种基于代理的软件动态更新方法,该方法以OSGi为支撑平台,没有更改的平台框架结构和逻辑功能,实验表明该方法符合设计要求,但在实验过程中发现服务类型受到一定限制,因此在后续研究中重点是如何解决这个限制,只要注册在更新框架上就可以完成动态更新动作并争取将它扩展到嵌入式应用中。

致谢:感谢在上海交大访学期间得到sjturad实验室陈俊清博士大力支持与帮助。

[1]张仕.黄林鹏.基于OSGi的服务动态演化[J].软件学报,2008,19(5):1201-1211.

[2]杨芙清.梅宏.软件复用与软件构件技术[J].电子学报,1999,27(2):68-75.

[3]NEAMTIU I,HICKS M,STOYLE G,et al.Practical dynamic software updating for C[M].ACM,2006.

[4]MALABARBA S,PANDEY R,GRAGG J,et al.Runtime support for type-safe dynamic Java classes[M].Berlin:Springer Heidelberg,2000.

[5]PLASIL F,B?LEK D,JANECEK R.SOFA/DCUP:Architecture for component trading and dynamic updating[C]// Configurable Distributed Systems,1998.Proceedings.Fourth International Conference on.IEEE,1998:43-51.

[6]鲍春健.吴俊敏.许胤龙,等.基于组件的动态软件更新[J].计算机应用,2006,26(8):1909-1911.

[7]李青虹.基于Java的Web服务的构建和开发[J].三明学院学报,2005,22(2):205-208.

[8]林洪武,尤朝,周明辉,等.以代理为中心的OSGi构件资源监控方法[J].计算机科学与探索,2011,5(1):23-31

[9]JMANI S.Automatic software upgrades for distributed systems[D].Cambridge:Massachusetts Instituteof Technology,2005.

[10]BAUMANN A,HEISER G,APPAVOO J,et al.Providing dynamic update in an operating system[C]//Proceedings of the 2005 USENIX Technical Conference,2005:279-291.

[11]TEWKSBURY L A,MOSER L E,MELLIAR-SMITH P M.Live upgrades of CORBA applications using object replication[C]//Software Maintenance,2001.Proceedings.IEEE International Conference on.IEEE,2001:488-497.

[12]KRAMER J,MAGEE J.The evolving philosophers problem:Dynamic change management[J].Software Engineering, IEEE Transactions on,1990,16(11):1293-1306.

[13]MAGEE J,KRAMER J.Dynamic structure in software architectures[C]//ACM SIGSOFT Software Engineering Notes. ACM,1996,21(6):3-14.

[14]王晓鹏.王千祥.梅宏.一种面向构件化软件的在线演化方法[J].计算机学报,2005,28(11):1890-1897.

[15]王德俊.黄林鹏.徐晓辉,等.分布式动态更新支持系统:研究综述[J].计算机科学,2007,34(11):19-25.

Proxy-Based Dynamic Software Updating Method

HUANG Han
(School of Physics and Information Engineering,Quanzhou Normal University,Quanzhou 362000,China)

Dynamic software updating is a new type of software evolution mechanism,which allows applications perform software updating in the system while it is running without downtime.Some important applications of large software systems need to provide available services which will benefit from this mechanism.This approach will make OSGi as a platform for software components,and present a new proxy-based method to achieve the dynamic software updating for OSGi component.The method inherits from the OSGI dynamic management of component's lifecycle and dependency,and has features such as dynamic availability and substitutability.The experiment shows that the method can accurately do dynamic updating,and provide reference to system maintenance and software evolution of smart home environment.

proxy;dynamic software;updates;OSGi;component;bundle

TP311.53

A

1673-4343(2013)04-0063-05

2013-03-20

高等学校博士学科点专项科研基金课题(20090073110026)

黄晗,男,福建莆田人,副教授。研究方向:容错服务,服务计算。

猜你喜欢
调用代理构件
核电项目物项调用管理的应用研究
代理圣诞老人
LabWindows/CVI下基于ActiveX技术的Excel调用
代理手金宝 生意特别好
建筑构件
建筑构件
基于系统调用的恶意软件检测技术研究
建筑构件
建筑构件
复仇代理乌龟君