实现动态模拟远程接口的装置及方法

文档序号:6430961阅读:195来源:国知局
专利名称:实现动态模拟远程接口的装置及方法
技术领域
本申请涉及网络环境中的系统测试技术,尤其涉及一种实现动态模拟远程接口的装置及方法。
背景技术
远程接口通常部署在远程服务器 里,用于提供各种类型的服务,同时通过自身提供的远程调用方法以供其他服务器完成对这些服务的远程调用。在多系统共存的网络环境中,系统与系统之间通常通过远程接口的方式进行交互。另一方面,在一个系统正式上线应用之前,开发和测试人员通常需要针对该系统设置定期自动化执行系统部署、测试和集成的过程,以此来持续地检测系统中存在的问题,这一过程通常被称为持续集成,其中理所当然也包括对待测系统调用其所依赖的第三方系统提供的远程接口的过程的测试。然而,在长期的持续集成过程中,难免会出现第三方系统不可用的情况,当这种情况发生时,为了继续进行正常的测试工作,便需要通过下述几种方法来屏蔽第三方系统不可用所带来的不利影响。其中一种方法通过人为修改调用端系统(即待测系统)的远程接口调用逻辑来实现,该方法意在临时去除调用端对远程接口的依赖,而待远程接口可用后,再恢复原来的正常逻辑。然而,该方法只能临时解决开发过程中远程接口不可用的问题,但其在持续集成的过程中并不合适,一方面是由于往返修改的时间成本比较高,另一方面还会存在因开发人员忘记恢复原来的正常逻辑而将临时逻辑带入正式环境中而造成故障的隐患。另一种方法通过添加对调用端的拦截逻辑来实现,该方法需要在调用端系统里添加对调用远程接口进行拦截的模块,以在设定的规则下拦截调用端对远程接口的调用,并返回该调用过程所需要的模拟值。然而,该方法需要对调用端系统进行改造,会在其中引入与正常逻辑无关的模块,从而对调用端系统造成了侵入;并且,该方法如果要实现返回远程接口的模拟值,就需要额外提供不同的拦截规则,从而造成模拟行为实现繁琐、不够便捷。

发明内容
本申请的实施例旨在提供一种实现动态模拟远程接口的装置及方法,以解决现有调用端系统依赖的远程接口不可用时所采取的手段中存在的上述问题。为实现上述目的,本申请的实施例提供了一种实现动态模拟远程接口的装置,连接至对被调用系统的远程接口进行调用的调用端系统,其中所述调用端系统运行在Java虚拟机中,该装置包括代理单元,用于修改所述调用端系统所加载的Java字节码中涉及接口调用请求的相关字节码;模拟单元,用于根据所述被调用系统的远程接口设置模拟远程接口 ;控制单元,用于在确认所述远程接口不可用时,控制所述代理单元修改所述相关字节码,以使所述调用端系统由调用所述远程接口切换至调用所述模拟远程接口。
本申请的实施例还提供了一种实现动态模拟远程接口的方法,应用于调用端系统对被调用系统的远程接口进行调用的过程中,其中所述调用端系统运行在Java虚拟机中,该方法包括以下步骤监测所述远程接口的可用状态;在所述远程接口不可用时修改所述调用端系 统所加载的Java字节码中涉及接口调用请求的相关字节码,以控制所述调用端系统由调用所述远程接口切换至调用模拟远程接口;其中,所述模拟远程接口用于对所述远程接口进行模拟。由上述技术方案可知,本申请的实施例通过动态修改Java字节码的方式修改调用端系统,无需在原有系统里附加任何代码,不会给系统在正式环境上线造成隐患。


图I为本申请实现动态模拟远程接口的装置实施例结构图;图2为图I所示实施例中模拟单元的模拟远程接口配置界面示意图;图3为本申请实现动态模拟远程接口的方法实施例流程图;图4为图3所示实施例中接口调用请求的动态修改流程示意图;图5为图3所示实施例中调用端系统的模拟远程接口调用流程示意图。
具体实施例方式下面将详细描述本申请的具体实施例。应当注意,这里描述的实施例只用于举例说明,并不用于限制本申请。图I为本申请实现动态模拟远程接口的装置实施例结构图,如图所示,本实施例实现动态模拟远程接口的装置10连接至对被调用系统30的远程接口进行调用的调用端系统20,其中调用端系统运行在Java虚拟机中,该装置包括代理单元11、模拟单元12及控制单元13。其中,代理单元11用于修改调用端系统20所加载的Java字节码中涉及接口调用请求的相关字节码;模拟单元12用于根据被调用系统30的远程接口设置模拟远程接口 ;控制单元13用于在确认远程接口不可用时,控制代理单元11在调用端系统20上修改上述的相关字节码,以使调用端系统20由调用远程接口切换至调用模拟远程接口。Java虚拟机(JVM, Java Virtual Machine)通过在实际的计算机上仿真模拟各种计算机功能,能够屏蔽与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的字节码,就可以在多种平台上不加修改地运行。如上所述,图I所示实施例的调用端系统20便运行在这样一个Java虚拟机中,在一个实施例中,代理单元11可以利用Java虚拟机工具接口(JVM TI, JVM Tool Interface)来实现。JVM工具接口通常是用于对JVM进行监控,通过JVM工具接口可以监控JVM的运行状态以及控制运行在JVM之上的Java应用程序。具体而言,利用JVM工具接口实现的代理单元11能够在预设的网络端口上侦听JVM中的所有网络请求,由此其得以在JVM所加载的Java字节码中找到与远程接口调用请求相关的字节码,进而,代理单元11可以利用JVM工具接口中的JavaInstrumentation所提供的特性来动态修改调用端系统中加载的Java字节码。由上述可知,本申请实施例实现动态模拟远程接口的装置在调用端系统20原本需要调用的远程接口不可用时,是通过动态修改Java字节码的方式来修改调用端系统20切换至调用模拟远程接口,而无需在调用端系统里附加任何代码,从而不会给系统在正式环境上线时造成隐患;并且,在字节码已经加载运行的情况下对其进行修改的动态方式,不会影响到系统的正常工作,相较于只能在系统未启动状态下对待加载字节码进行的静态修改方式,应用起来显然更加灵活。进一步,在一个实施例中,上述的代理单元11包括指令接收子单元111及调用修改子单元112。其中,指令接收子单元111用于接收控制单元13发送的控制指令,以此决定
是否进行后续字节码的修改;调用修改子单元112则根据接收到的控制指令将上述相关字节码中的调用对象由远程接口修改为模拟远程接口。在一个实施例中,调用修改子单元112是利用Java Instrumentation提供的特性来动态更改调用端系统20所加载的Java字节码。具体而言,指令接收子单元111在收到控制单元13传来的指令后通知给调用修改子单元112,后者进而找到调用端系统20所加载的Java字节码中涉及接口调用对象的相关字节码,并将接口调用对象由被调用系统30的远程接口替换为模拟单元12提供的模拟远程接口,从而实现调用端系统20的动态修改。接续,上述模拟单元12设置的模拟远程接口具体是根据被调用系统30的真实远程接口的实现逻辑对该真实远程接口进行模拟。进一步具体而言,被调用系统30的每个真实远程接口各自具有相应的实现逻辑,这一实现逻辑可以理解为由可执行的计算机程序代码组成,当被调用系统30从调用端系统20收到调用某个真实远程接口的请求且该真实远程接口为可用时,与该真实远程接口对应的实现逻辑会以调用请求中携带的特定信息作为输入而被执行并得到用来返回给调用端系统20的输出结果;而上述模拟单元12设置的模拟远程接口为了对真实远程接口进行模拟,其自身并不需要设置与真实远程接口完全一致的实现逻辑,而只需要模拟该真实远程接口的实现逻辑对调用端系统20的调用请求作出响应并输出模拟的输出结果。对于调用端系统20而言,其向被调用系统30发出调用某个远程接口的调用请求,而后收到被调用系统30返回的输出结果,这就成功完成了一次远程接口的调用,至于该返回的输出结果是真实远程接口返回的真实值还是模拟远程接口返回的模拟值,作为测试对象的调用端系统20来说则完全不必关心。在一个实施例中,上述模拟单元12包括模拟配置库121及模拟执行子单元122。其中,模拟配置库121用于存储调用端系统20所依赖的远程接口的相关配置;模拟执行子单元122用于根据模拟配置库121存储的相关配置对远程接口进行模拟,以设置对应的模拟远程接口供调用端系统20调用并向调用端系统20返回模拟值。在一个实施例中,上述的相关配置具体包括接口服务名、接口方法名、模拟脚本及模拟标识,其各项配置的说明及内容示例如表I所示,其中,接口服务名用于识别要模拟的远程接口 ;接口方法名用于识别远程接口的实现方法;模拟脚本用于由模拟执行子单元122执行以完成实现方法并返回模拟值,在一个实施例中,模拟脚本为利用动态语言Groovy实现的代码;模拟标识用于表示当前是否需要对远程接口进行模拟。表I配置项__配置项说明__配置内容示例_
接口服务名定义需模拟的远程接口的服务名,以此来com.taobao.uic.common.service.userinfo.__识别需要模拟的远程接口__UicReadService: I.O.O.daily_
接口方法名定义远程接口具体需模拟的方法名,以此getBaseUserByNick
__来识别需要模拟的远程接口的实现方法__
模拟脚本定义完成具 体实现方法的Groovy脚本,def result=new ResultDO()
用于由模拟执行子单元来执行以得到所result· setSuccess(true)
__需的模拟值__return result_
是否模拟用于标识当前是否需要对远程接口进行I:模拟模拟,如果设置为不模拟,则仍然调用真O:不模拟_实的远程接口__在一个实施例中,模拟单元12可以提供一个配置界面,如此一来,用户便可以通过该配置界面将例如表I所示的各配置项输入至模拟单元12的模拟配置库121中进行存储。其中,模拟脚本如上所述是利用Groovy实现,作为Java程序设计语言的一种扩展,Groovy是一种面向对象的脚本语言,其使得Java平台上具备了脚本语言的动态特性,而本实施例采用基于Groovy实现的模拟脚本,无需预先开发和部署任何模拟代码,只需按例如上述的配置表项进行配置后便可立即生效,因此实现远程接口模拟逻辑的过程灵活敏捷且成本较低。进一步,按表I中各项完成配置后的配置界面的一个示例如图2所示,其中模拟脚本内容的一个示例如下def result = new com. taobao. uic. common, domain. ResultDO ()//定义返回结果对象result. setSucess (true) // 设置返回结果对象的 Success 属性为 Truedef u = new. com. taobao. uic. common, domain. BaseUserDO ()Η定义用户信息对象,该对象是结果对象的一个子对象u. setUserld(20256964671) // 设置用户对象 Id 属性为 20256964671result. setModule (u) //将用户对象关联到结果对象上return result// 返回调用结果最后,针对控制单元13而言,其对远程接口是否可用的判断可以按如下所述来加以实施。在一个实施例中,控制单元13可以通过在调用端系统的远程接口调用进程之外单独设置的一个网络监测进程,来监测远程接口的可用状态。在另一个实施例中,控制单元13还可以通过在调用端系统上设置一个前述调用进程的相关进程,进而利用该相关进程侦听调用端系统对远程接口进行调用的请求及其响应,来实现远程接口是否可用的判断。需要说明的是,由于如前文所述代理单元11能够在预设的网络端口上侦听JVM的网络请求,因此,在一个实施例中,可以由代理单元11对调用端系统的远程接口调用请求及其相应进行侦听,由此来完成远程接口是否可用的判断,并进而将判断接口通知给控制单元13,作为后续下发控制指令的依据。综上所述,本申请实现动态模拟远程接口的装置实施例通过动态修改Java字节码的方式修改调用端系统,无需在原有系统里附加任何代码,不会给系统在正式环境上线造成隐患。进一步,当被调用系统30的真实远程接口状态变为可用时,首先,如果需要永久恢复成调用真实远程接口,则只需要重启调用端系统20即可实现,这是因为调用端系统20每次重启时都会重新加载原始的Java字节码;其次,如果只是临时恢复成调用真实远程接口,则不需要重启调用端系统20,而只需修改模拟单元12的模拟配置库121中的相关配置便可以实现恢复,例如,在一个实施例中,可以是将模拟标识由表示需要模拟的值(例如“I”)修改为表示不需要模拟的值(例如“0”),然后控制单元13会下发相关控制指令,再由代理单元11根据接收到的控制指令将之前经过修改的相关字节码中的调用对象由模拟远程接口改回真实远程接口,就可以使得调用端系统20停止调用模拟远程接口转而恢复调用被调用系统30的真实远程接口。对应于上述实现动态模拟远程接口的装置实施例,本申请还提出一种实现动态模拟远程接口的方法,其应用于调用端系统(运行在Java虚拟机中)对被调用系统的远程接口进行调用的过程中,该方法的实施例如图3所示,包括以下步骤S31、S34。S31、监测远程接口的可用状态,判断远程接口是否可用;在一个实施例中,本步骤可以通过在调用端系统的调用进程之外单独设置一个网络监测进程专门用来监测远程接口的可用状态。在另一个实施例中,本步骤还可以通过在调用端系统上设置一个前述调用进程的相关进程,进而利用该相关进程对调用端系统的远程接口调用的请求及其响应进行侦听,来实现远程接口是否可用的判断。S34、在远程接口不可用时修改调用端系统所加载的Java字节码中涉及接口调用请求的相关字节码,以控制调用端系统由调用远程接口切换至调用模拟远程接口。步骤S34中所述的模拟远程接口用于对远程接口进行模拟,以向调用端系统返回模拟值,模拟远程接口可以如上文装置实施例中所述的那样根据被调用系统的真实远程接口的实现逻辑对该真实远程接口进行模拟。具体而言,在一个实施例中,模拟远程接口是根据步骤S34之前的以下步骤S32、S33来提供。S32、存储调用端系统所依赖的远程接口的相关配置;在一个实施例中,步骤S32所述的相关配置具体包括接口服务名、接口方法名、模拟脚本及模拟标识,其各项配置的说明及内容示例如上文中表I所示,其中,接口服务名用于识别要模拟的远程接口 ;接口方法名用于识别远程接口的实现方法;模拟脚本用来被执行以完成上述实现方法并返回所需模拟值,在一个实施例中,模拟脚本是利用动态语言Groovy实现的代码;模拟标识则用于表示当前是否需要对远程接口进行模拟。另外,对上述各项进行配置可以通过图2所示的配置界面来完成,具体内容在上文装置实施例中已有述及,此处不再赘述。S33、根据相关配置模拟远程接口,以设置对应的模拟远程接口供调用端系统调用;实际上,在针对某个真实远程接口完成步骤S32的配置存储后,本实施例的方法就提供了将要用来对该真实远程接口进行模拟的模拟远程接口。这时,一旦步骤S31中判断得出真实远程接口不可用的结论,便可以经由步骤S34修改相关字节码将调用端系统由调用真实远程接口切换到调用通过步骤S32 S33所配置的模拟远程接口。同时还可以看出,步骤S32 S33可以如图3所示置于步骤S31与步骤S34之间,但在其他实施例中步骤S32 S33也可以置于步骤S31之前。进一步,在一个实施例中,步骤S34中所述的修改相关字节码具体包括以下步骤S341、设置与调用端系统连接且利用Java虚拟机工具接口实现的代理单元;S342、控制代理单元利用Java Instrumentation将相关字节码中的调用对象由远程接口修改为模拟远程接口。通常JVM工具接口是用于对JVM进行监控,通过JVM工具接口可以监控JVM的运行状态以及控制运行在JVM之上的Java应用程序,从而,步骤S341中利用JVM工具接口实现的代理单元得以对运行在JVM上的调用端系统所加载的Java字节码进行修改。在一个实施例的步骤S342中,利用JVM工具接口实现的代理单元能够在预设的网络端口上侦听JVM中的所有网络请求,由此其得以在JVM所加载的Java字节码找到与远程接口调用请求相关的字节码,进而,代理单元可以利用JVM工具接口中的Java Instrumentation所提供的特性来动态更改前述所找到的Java字节码。需要说明的是,由于代理单元有侦听JVM网络请求的能力,因此,在一个实施例中,前文步骤S31中所述通过侦听远程接口调用请求及其响应来判断远程接口是否可用的动作,便可以由代理单元来执行。由上述可知,本申请实施例实现动态模拟远程接口的方法在调用端系统原本需要 调用的远程接口不可用时,是通过动态修改Java字节码的方式来修改调用端系统以切换至调用模拟远程接口,而无需在调用端系统里附加任何代码,从而不会给系统在正式环境上线时造成隐患。进一步,结合前文装置实施例及上述方法实施例的说明,本申请实现接口调用请求动态修改的流程的一个示例可以参考图4所示,包括以下步骤S401 S405。S401、控制单元向代理单元传送指令;该传送指令用于通知代理单元修改调用端系统的接口调用请求,以将接口调用对象由被调用系统的真实远程接口修改为模拟单元提供的模拟远程接口。S402、代理单元载入原相关字节码;S403、调用端系统返回原相关字节码;利用JVM工具接口实现的代理单元可以找到调用端系统已加载的Java字节码中涉及接口调用对象的相关字节码。S404、修改调用端系统所加载的原相关字节码;S405、用新的相关字节码替换原相关字节码;在找到调用端系统所加载的原相关字节码之后,代理单元进一步可以利用Javainstrumentation提供的特性对该相关字节码进行修改,进而用修改后的新字节码替换原相关字节码由调用端系统进行加载,由此将调用端系统的接口调用对象由真实远程接口替换为模拟远程接口。接续,结合前文装置实施例及上述方法实施例的说明,本申请调用端系统调用模拟远程接口的流程的一个示例可以参考图5所示,包括以下步骤S501 S505。S501、调用端系统向模拟单元发起调用请求;在经过前述调用请求的动态修改后,调用端系统的接口调用对象由被调用系统的真实远程接口替换为模拟单元提供的模拟远程接口。S502、根据接口服务名和接口方法名载入相关配置;在一个实施例中,调用端系统的接口调用请求可以携带接口服务名和接口方法名,而模拟单元便可以根据该接口服务名和接口方法名在模拟配置库存储的配置中查找对应的相关配置。S503、执行模拟脚本;在模拟配置库中载入对应的相关配置后,进一步由模拟执行子单元执行配置项中存储的Groovy脚本。S504、返回模拟值;模拟执行子单元执行模拟脚本后,会得到预先设置的模拟值,由模拟单元反馈给调用端系统。调用端系统从发出接口调用请求到收到模拟值,即完成一次接口调用过程,从调用端系统的角度看, 该过程与调用真实远程接口并无区别,相应也表示模拟单元成功完成一次远程接口的模拟。进一步,本申请实现动态模拟远程接口的过程是通过动态修改Java字节码的方式修改调用端系统,而没有在原有系统里附加任何代码,因此,后续当被调用系统的真实远程接口状态变为可用时,只需要重启调用端系统即可恢复为调用被调用系统的远程接口 ;并且,如果只是临时恢复,则不需要重启调用端系统,而只需修改模拟单元的模拟配置库中的相关配置,例如将模拟标识由表示需要模拟的值(例如“I”)修改为不需要模拟的值(例如“O”),便可以由代理单元控制调用端系统停止调用模拟远程接口转而调用被调用系统的真实远程接口。在一个实施例中,上述本申请所提供实现动态模拟远程接口的装置可以是计算机。该计算机可以包括处理器和存储器,其中,处理器可以根据存储器中存储的指令或程序来执行前述各个实施例中提供的方法中的步骤。虽然已参照几个典型实施例描述了本申请,但应当理解,所用的术语是说明和示例性、而非限制性的术语。由于本申请能够以多种形式具体实施而不脱离申请的精神或实质,所以应当理解,上述实施例不限于任何前述的细节,而应在随附权利要求所限定的精神和范围内广泛地解释,因此落入权利要求或其等效范围内的全部变化和改型都应为随附权利要求所涵盖。
权利要求
1.一种实现动态模拟远程接口的装置,连接至对被调用系统的远程接口进行调用的调用端系统,其中所述调用端系统运行在Java虚拟机中,该装置包括 代理单元,用于修改所述调用端系统所加载的Java字节码中涉及接口调用请求的相关字节码; 模拟单元,用于根据所述被调用系统的远程接口设置模拟远程接口 ; 控制单元,用于在确认所述远程接口不可用时,控制所述代理单元修改所述相关字节码,以使所述调用端系统由调用所述远程接口切换至调用所述模拟远程接口。
2.如权利要求I所述实现动态模拟远程接口的装置,其中,所述模拟单元包括模拟配置库及模拟执行子单元, 所述模拟配置库用于存储所述调用端系统所依赖的所述远程接口的相关配置; 所述模拟执行子单元用于根据所述相关配置模拟所述远程接口,以设置对应的模拟远程接口供所述调用端系统调用并向所述调用端系统返回模拟值。
3.如权利要求2所述实现动态模拟远程接口的装置,其中,所述相关配置包括接口服务名、接口方法名、模拟脚本及模拟标识; 所述接口服务名用于识别要模拟的远程接口; 所述接口方法名用于识别所述远程接口的实现方法; 所述模拟脚本用于由所述模拟执行子单元执行以完成所述实现方法并返回所述模拟值; 所述模拟标识用于表示当前是否需要对所述远程接口进行模拟。
4.如权利要求3所述实现动态模拟远程接口的装置,其中,所述模拟脚本是利用Groovy实现的代码。
5.如权利要求I所述实现动态模拟远程接口的装置,其中,所述代理单元包括指令接收子单元及调用修改子单元; 所述指令接收子单元用于接收所述控制单元发送的控制指令; 所述调用修改子单元根据接收到的所述控制指令将所述相关字节码中的调用对象由所述远程接口修改为所述模拟远程接口。
6.如权利要求5所述实现动态模拟远程接口的装置,其中,所述代理单元是利用Java虚拟机工具接口实现,且所述调用修改子单元是利用Java Instrumentation来修改所述相关字节码。
7.一种实现动态模拟远程接口的方法,应用于调用端系统对被调用系统的远程接口进行调用的过程中,其中所述调用端系统运行在Java虚拟机中,该方法包括以下步骤 监测所述远程接口的可用状态; 在所述远程接口不可用时修改所述调用端系统所加载的Java字节码中涉及接口调用请求的相关字节码,以控制所述调用端系统由调用所述远程接口切换至调用模拟远程接口;其中,所述模拟远程接口用于对所述远程接口进行模拟。
8.如权利要求7所述实现动态模拟远程接口的方法,在修改所述相关字节码之前还包括以下步骤 存储所述调用端系统所依赖的所述远程接口的相关配置; 根据所述相关配置模拟所述远程接口,以设置对应的模拟远程接口供所述调用端系统调用并向所述调用端系统返回模拟值。
9.如权利要求8所述实现动态模拟远程接口的方法,其中,所述相关配置包括接口服务名、接口方法名、模拟脚本及模拟标识; 所述接口服务名用于识别要模拟的远程接口; 所述接口方法名用于识别所述远程接口的实现方法; 所述模拟脚本用来被执行以完成所述实现方法并返回所述模拟值; 所述模拟标识用于表示当前是否需要对所述远程接口进行模拟。
10.如权利要求9所述实现动态模拟远程接口的方法,其中,所述模拟脚本是利用Groovy实现的代码;所述修改相关字节码包括以下步骤 设置与所述调用端系统连接且利用Java虚拟机工具接口实现的代理单元; 控制所述代理单元利用Java Instrumentation将所述相关字节码中的调用对象由所述远程接口修改为所述模拟远程接口。
全文摘要
本发明公开一种实现动态模拟远程接口的装置,连接至对被调用系统的远程接口进行调用的调用端系统,其中所述调用端系统运行在Java虚拟机中,该装置包括代理单元,用于修改所述调用端系统所加载的Java字节码中涉及接口调用请求的相关字节码;模拟单元,用于根据所述被调用系统的远程接口设置模拟远程接口;控制单元,用于在确认所述远程接口不可用时,控制所述代理单元修改所述相关字节码,以使所述调用端系统由调用所述远程接口切换至调用所述模拟远程接口。本发明还相应公开一种实现动态模拟远程接口的方法。本发明的实施例通过动态修改Java字节码的方式修改调用端系统,无需在原有系统里附加任何代码,不会给系统在正式环境上线造成隐患。
文档编号G06F9/46GK102955714SQ201110235989
公开日2013年3月6日 申请日期2011年8月17日 优先权日2011年8月17日
发明者袁志俊, 禹扬帆 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1