一种细粒度远程调用在线重构方法

文档序号:7760123阅读:312来源:国知局
专利名称:一种细粒度远程调用在线重构方法
技术领域
本发明是一种针对分布式系统中运行时刻对细粒度远程调用进行重构的方法,属 于软件技术领域,适用于软件维护。
背景技术
在分布式系统中,通过网络进行的远程调用会带来很大的性能开销通过网络传 输数据会花费大量的时间;因为数据只能以字节流的格式在网络上进行传输,因此方法调 用的参数、返回值等在传输前后都需要分别进行序列化与反序列化的操作,这些操作将会 花费一定的时间与系统资源。因此,远程调用的频率是影响系统性能的关键因素之一。为 减少进行远程调用的频率,应该严格控制远程调用的粒度,尽量通过一次远程调用就完成 所有操作或获得所有数据,避免细粒度的远程调用。开发人员可以在系统设计或开发过程 中应用某些设计模式去除细粒度远程调用,如会话外观(Session Fafade )、数据传输对象 (Data Transfer Ob ject)等。然而,对于已经开发完成且正在运行的应用系统,去除其中的 细粒度远程调用则会存在一些问题。首先,重构现有的应用系统,目前的方法只能通过修改 源代码进行。而目前的许多应用系统都采用了基于构件的开发技术并通过组装不同厂商提 供的商用构件(COTS,Commercial off-the-shelf)进行开发,因此获得应用的源代码会非 常困难;其次,对于目前具有高可用性的应用系统而言,能够提供7(天)*24(小时)的不中 断服务已经成为很普遍的需求。而对于现有的离线修改方式,应用系统需要经过“停止-更 新-重启”的步骤才能使得修改生效,这将不得不中断应用系统的正常运行,因此无法满足 应用系统的高可用需求。综上所述,如何实现在不修改应用系统、不中断其正常运行的前提 下在线地进行细粒度远程调用的重构是一个急待解决的技术问题。

发明内容
本发明的目的是提供一种分布式系统中细粒度远程调用的在线重构方法。其核心 思想是在运行时刻修改并替换分布式方法调用中负责网络通信的代理对象,将需要多次细 粒度远程调用完成的工作通过一次远程调用完成,达到提高系统性能的目的。本发明包含三个步骤第一步、可在线重构细粒度远程调用检测在该步骤中,服 务器端会识别出可在线重构的一组细粒度远程调用;第二步、智能代理对象自动生成在 该步骤中,服务器端对于上一步中检测出来的可重构的细粒度远程调用的客户端和服务器 端代理对象生成智能代理对象;3、运行时刻进行代理对象替换对于检测出来的可重构的 细粒度远程调用的客户端和服务器端,在运行时刻服务器端将普通的客户端和服务器端代 理对象替换成上一步生成的智能代理对象。上述步骤的具体技术方案如下一种细粒度远程调用在线重构方法,其步骤为1)服务器端根据应用运行时刻信息检测当前应用中某一个类的可在线重构细粒 度远程调用;所述可在线重构细粒度远程调用包括数据型细粒度远程调用、操作型细粒度远程调用;2)服务器端将该类的所有属性添加到可在线重构细粒度远程调用的客户端代理 对象中,生成该类的客户端智能代理对象;所述客户端智能代理对象使得对于数据型细粒度远程调用,当客户端向客户端智能代理对象发起获取数据请求 时,客户端智能代理对象直接将该请求对应的属性值返回给客户端;对于操作型细粒度远程调用,客户端智能代理对象将一组细粒度调用请求与相应 的参数记录到客户端智能代理对象的属性中,在该组细粒度远程调用结束后,通过一个远 程调用将客户端智能代理对象中的属性值转发到服务器端;3)服务器端根据客户端发出的该类的每一次请求,返回该类的客户端智能代理对 象实例给客户端。进一步的,检测数据型可在线重构细粒度远程调用的方法为如果同一客户端与 服务器端对象之间存在一组连续的远程调用,且该组连续的远程调用参数的值为空且返回 值不为空,则这组远程调用为一数据型可在线重构细粒度远程调用。进一步的,检测操作型可在线重构细粒度远程调用的方法为如果在同一客户端 与服务器端对象之间存在一组连续的远程调用,且该组调用返回值为空,则这组远程调用 为一可在线重构的操作型细粒度远程调用。进一步的,所述一组连续的远程调用为一段时间内同一客户端的一组请求看做 一组连续的远程调用。进一步的,根据设定的时间长度确定一组细粒度远程调用是否结束。进一步的,服务器端生成所述客户端智能代理对象过程中,缓存新接收到的客户 端请求,待生成所述客户端智能代理对象后,依次执行缓存的客户端请求后撤销缓存。本发明的主要内容包括(1)可在线重构细粒度远程调用的检测。部分细粒度远程调用可以通过在线重构 调用序列去除,通过一次远程调用获取所有数据或完成所有操作,从而达到提高性能的目 的。可以通过分析应用运行时刻信息来确定当前应用中是否存在细粒度远程调用。但是, 由于在线重构的前提是不依赖应用的源代码,因此,并非所有的细粒度远程调用都适合进 行类似重构。本方法中可以将可以在线重构的细粒度远程调用分为两类(a)数据型细粒度远程调用属于该类型的一组时间上连续发生的远程调用均是 客户端从服务器端获取数据,重构(即自动生成智能代理,然后在运行时刻替换代理对象) 后可以通过一次远程调用获取所有客户端需要的数据。通过分析运行时刻信息可以检测 出该类调用,如果在同一客户端与服务器端对象之间存在一组连续的远程调用,这些调用 参数的值为空且返回值不为空,则这组远程调用是一个可在线重构的数据型细粒度远程调 用。(b)操作型细粒度远程调用属于该类型的一组连续的远程调用均是客户端对服 务器端应用进行操作,重构(即自动生成智能代理,然后在运行时刻替换代理对象)后可以 通过一次远程调用将所有操作的参数传递到服务器端,并完成所有操作。通过分析运行时 刻信息,即调用的返回值,可以检测出该类调用,如果在同一客户端与服务器端对象之间存 在一组连续的远程调用,这些调用返回值为空,则这组远程调用是一个可在线重构的操作 型细粒度远程调用。
(2)智能代理对象的自动生成。在分布式应用中,客户端与服务器端对象间并不 能直接调用,而是必须通过代理对象完成远程交互。这些代理对象一般被称为Stub(客户 端代理对象)与Skeleton(服务器端代理对象),它们自动生成,并对应用透明。Stub的任 务主要是将客户端的调用转发到服务器端;Skeleton的任务主要是接收客户端的请求,将 其转发给相应的服务器端对象。它们同时负责调用参数与返回值的序列化/反序列化。可 以通过修改代理对象,使其具有除远程通信以外的功能。在远程调用开始时,客户端会通过 向服务器端发起请求,得到一个Stub对象,然后通过它进行其后的远程调用。本方法中通 过向普通的客户端代理对象Stub中添加额外的功能,自动生成新的客户端智能代理对象 SmartStub,即根据运行时刻信息自动修改重构对象Stub,将服务端某可重构细粒度调用所 属类的所有属性写入到SmartStub中,并修改相应的Get和Set方法,并动态重编译生成该 类的SmartStub,使得该类的客户端智能代理对象SmartStub对于数据型细粒度远程调用, 当客户端向客户端智能代理对象发起获取数据请求时,客户端智能代理对象直接将该请求 对应的属性值返回给客户端;对于操作型细粒度远程调用,客户端智能代理对象将一组细 粒度调用请求与相应的参数记录到客户端智能代理对象的属性中,在该组细粒度远程调用 结束后,通过一个远程调用将客户端智能代理对象中的属性值转发到服务器端,完成细粒 度远程调用的重构工作;同时修改服务器端代理对象(Skeleton)以接受和转发SmartStub 发送的请求,即修改Skeleton的Set方法,将SmartStub发送的多次Set操作合并成一次 操作进行,即使得客户端智能代理对象SmartStub对于操作型细粒度远程调用,客户端智 能代理对象将一组细粒度调用请求与相应的参数记录到客户端智能代理对象的属性中,在 该组细粒度远程调用结束后,通过一个远程调用将客户端智能代理对象中的属性值转发到 服务器端,完成细粒度远程调用的重构工作。(3)运行时刻对代理对象的替换。为了使智能代理对象SmartStub生效,需要用 它替换原有的Stub。当检测到可重构的细粒度远程调用后,即可以开始进行重构工作。重 构执行的过程中不应该中断应用系统的正常运行,并且不对正在执行的调用生效,以保证 它们的一致性。首先,在服务器端将新接收到的获取重构对象Stub的请求缓存;然后用上 一步中生成的智能代理对象SmartStub替换普通Stub。完成替换后,对于数据型远程调 用,当客户端向SmartStub发起请求获取数据时,由于SmartStub在生成时即包含了服务器 端对象所有的属性,所以SmartStub不再将请求转发到服务器端,而是直接返回客户端的 SmartStub实例中请求对应的属性值给客户端;对于操作型远程调用,在一组远程调用结 束后(通常将一段时间内同一客户端的一组请求看做一组远程调用,通过时间可以来判断 一组远程调用是否结束。),SmartStub才通过一个远程调用将所有请求与相应的参数一次 性转发到服务器端,此时传递的参数即SmartStub中的属性值。当服务器端接收到一组请 求时,将对服务器端对象依次进行调用。服务器修改获取重构对象Stub请求的响应机制,具体做法是修改获取Stub的方 法,将生成普通Stub的部分改成生成智能对象,从而使得对于客户端的该类的每一次请 求,都将返回SmartStub实例给客户端;最后撤消缓存,执行获取重构对象Stub的请求。客 户端可以通过动态下载的机制获得SmartStub对象,并由获得重构对象Stub的请求的返回 值生成SmartStub实例,继而,通过SmartStub,可以经过一次远程调用就完成所有操作或 获得所有数据,从而去除细粒度远程调用。
与现有技术相比,本发明的积极效果为本发明通过动态、实时地检测系统状态,构造可在线重构的细粒度远程调用机制, 生成智能对象代理并完成对象替换,从而在不修改应用系统、不中断其正常运行的前提下, 完成软件系统的维护和演化,提高软件系统的可靠性和可用性。


图1网上书店细粒度远程调用重构前后场景说明图;(a),网上书店不良模式场景,(b),网上书店重构后场景,图2本发明方法流程图。
具体实施例方式本节给出了 J2EE应用中去除一个细粒度远程调用的实现。该应用是一个网上书店的部分实现,主要用于客户端从服务器端获取图书的信 息,并将这些信息显示在Web页面上。该应用主要包括一个叫BookEJB的实体bean以及一 些Web端的构件,它们被部署在不同的机器上。如图1(a)所示,当客户端需要从服务器端 获取一本书的包括书名、作者、价格在内的一组信息时,需要对服务器端的BookEJB执行连 续的远程调用getNameO、getAuthor()、getPrice()、getAmount (),这些调用参数为空且返 回值不为空,属于可在线重构的数据型细粒度远程调用。BookEJB的Stub名为BookStub,该Stub中对于每个获取对象属性的请求,都会 转发给服务器端。根据BookStub自动生成智能代理对象,名为BookSmartStub,该Stub 中对于每个获取对象属性的请求,都直接返回BookSmartStub里的属性值,而不是发送给 服务器端。相比较BookStub,BookSmartStub中添加了四个属性,分别是Name,Author, Price,Amount,从而将对象所包含的所有属性存储在本地的Stub中,并修改了 getNameO、 getAuthor ()、getPrice ()、getAmount ()四个方法,当客户端发起请求获取数据时, SmartStub不再将请求转发到服务器端,而是直接返回当前对象实例中的值,而不是进行远 程调用。在重构完成后,客户端调用ejbFindByPKO方法来发送获取Stub的请求,服务器 端不再返回BookStub,而是返回一个SmartStub示例,具体做法是新建一个BookSmartStub 实例,对其中的四个属性赋值并返回给客户端。客户端之后进行的getNameO等调用, BookSmartStub都将直接返回其中的属性值,而不再将其转发给远程的BookEJB,如图1 (b) 所示。
权利要求
一种细粒度远程调用在线重构方法,其步骤为1)服务器端根据应用运行时刻信息检测当前应用中某一个类的可在线重构细粒度远程调用;所述可在线重构细粒度远程调用包括数据型细粒度远程调用、操作型细粒度远程调用;2)服务器端将该类的所有属性添加到可在线重构细粒度远程调用的客户端代理对象中,生成该类的客户端智能代理对象;所述客户端智能代理对象使得对于数据型细粒度远程调用,当客户端向客户端智能代理对象发起获取数据请求时,客户端智能代理对象直接将该请求对应的属性值返回给客户端;对于操作型细粒度远程调用,客户端智能代理对象将一组细粒度调用请求与相应的参数记录到客户端智能代理对象的属性中,在该组细粒度远程调用结束后,通过一个远程调用将客户端智能代理对象中的属性值转发到服务器端;3)服务器端根据客户端发出的该类的每一次请求,返回该类的客户端智能代理对象实例给客户端。
2.如权利要求1所述的方法,其特征在于检测数据型可在线重构细粒度远程调用的方 法为如果同一客户端与服务器端对象之间存在一组连续的远程调用,且该组连续的远程 调用参数的值为空且返回值不为空,则这组远程调用为一数据型可在线重构细粒度远程调用。
3.如权利要求1所述的方法,其特征在于检测操作型可在线重构细粒度远程调用的方 法为如果在同一客户端与服务器端对象之间存在一组连续的远程调用,且该组调用返回 值为空,则这组远程调用为一可在线重构的操作型细粒度远程调用。
4.如权利要求3所述的方法,其特征在于所述一组连续的远程调用为一段时间内同 一客户端的一组请求看做一组连续的远程调用。
5.如权利要求4所述的方法,其特征在于根据设定的时间长度确定一组细粒度远程调 用是否结束。
6.如权利要求1所述的方法,其特征在于服务器端生成所述客户端智能代理对象过程 中,缓存新接收到的客户端请求,待生成所述客户端智能代理对象后,依次执行缓存的客户 端请求后撤销缓存。
全文摘要
本发明公开了一种细粒度远程调用在线重构方法,属于软件技术领域。本发明的方法为1)服务器端根据应用运行时刻信息检测当前应用中某一个类的可在线重构细粒度远程调用;2)服务器端将该类的所有属性添加到可在线重构细粒度远程调用的客户端代理对象中,生成该类的客户端智能代理对象;3)服务器端根据客户端发出的该类的每一次请求,返回该类的客户端智能代理对象实例给客户端。与现有技术相比,本发明可以在不修改应用系统、不中断其正常运行的前提下,完成软件系统的维护和演化,提高软件系统的可靠性和可用性。
文档编号H04L29/08GK101958928SQ20101028633
公开日2011年1月26日 申请日期2010年9月17日 优先权日2010年9月17日
发明者刘儇哲, 梅宏, 王玮琥, 黄罡 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1