发明内容
为了克服远程调用中,远程代码改变以及执行用户不希望执行的方法问题,本发明提供了一种
有鉴于此,本发明提供了一种Dubbo泛化接口调用方法及装置。
为实现上述目的,本发明提供如下技术方案:
一种Dubbo泛化接口调用方法,包括以下步骤:
步骤1:在本地程序中构建字符串,所述字符串包括方法唯一标识和参数;
步骤2:在本地程序中调用Dubbo中的泛化接口,将所述字符串作为唯一参数传入泛化接口中;
步骤3:在远程程序中根据所述字符串的唯一标识和参数确定要远程调用的对象的具体方法;
步骤4:将远程调用方法的执行的结果返回到本地程序;
步骤5:本地程序根据返回的结果继续执行后续程序。
所述唯一标识为具有唯一标识性的字符串,且要调用的远程对象的方法也是利用所述具有唯一标识性的字符串注解,而且即使要远程调用的对象的具体方法的方法名改变,也利用所述字符串包括的唯一标识确定要调用的对象的方法。
所述参数包括参数类型和参数名,根据参数名将本地程序中具有相同参数名的参数对象序列化,在确定要远程调用的对象的具体方法后,将序列化后结果作为参数传入到远程调用的对象的具体方法中。
在执行所述步骤4之前还包括:统计要远程调用的对象的具体方法的平均执行时间,若平均执行时间大于第一时间阈值,将本地程序挂起,当挂起时间与当前时间差大于第二时间阈值时,唤醒挂起的本地程序,所述第二时间阈值小于第一时间阈值;若平均执行时间不大于第一时间阈值,本地程序等待结果返回。
所述步骤3具体为:解析所述字符串,将所述字符串切分为两部分,第一部分内容为方法唯一标识,第二部分内容为参数列表,根据第一部分内容以及调用关系确定要远程调用的函数的方法列表,利用第二部分内容从所述方法列表中确定实际要调用的方法,并将参数列表中的参数作为实际要调用的方法的参数,所述参数列表包括0个或至少1个参数。
更进一步地,本发明还提供了一种Dubbo泛化接口调用装置,包括以下模块:
构建模块,用于在本地程序中构建字符串,所述字符串包括方法唯一标识和参数;
调用模块,用于在本地程序中调用Dubbo中的泛化接口,将所述字符串作为唯一参数传入泛化接口中;
确定模块,用于在远程程序中根据所述字符串的唯一标识和参数确定要远程调用的对象的具体方法;
结果返回模块,用于将远程调用方法的执行的结果返回到本地程序;
本地模块,用于本地程序根据返回的结果继续执行后续程序。
所述唯一标识为具有唯一标识性的字符串,且要调用的远程对象的方法也是利用所述具有唯一标识性的字符串注解,而且即使要远程调用的对象的具体方法的方法名改变,也利用所述字符串包括的唯一标识确定要调用的对象的方法。
所述参数包括参数类型和参数名,根据参数名将本地程序中具有相同参数名的参数对象序列化,在确定要远程调用的对象的具体方法后,将序列化后结果作为参数传入到远程调用的对象的具体方法中。
还包括:
统计模块,用于统计要远程调用的对象的具体方法的平均执行时间;
挂起模块,用于若平均执行时间大于第一时间阈值,将本地程序挂起,当挂起时间与当前时间差大于第二时间阈值时,唤醒挂起的本地程序,所述第二时间阈值小于第一时间阈值;若平均执行时间不大于第一时间阈值,本地程序等待结果返回。
还包括:
解析模块,用于解析所述字符串,将所述字符串切分为两部分,第一部分内容为方法唯一标识,第二部分内容为参数列表,根据第一部分内容以及调用关系确定要远程调用的函数的方法列表,利用第二部分内容从所述方法列表中确定实际要调用的方法,并将参数列表中的参数作为实际要调用的方法的参数,所述参数列表包括0个或至少1个参数。
本发明利用包括唯一标识方法的唯一标识和参数确定要远程调用的对象的方法,并利用唯一标识性的字符串注解远程调用的对象的方法,即使远程代码被修改,甚至修改了远程代码的类名、方法名,依然可以唯一确定要调用的方法。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了便于理解,下面就现有技术中Dubbo的调用方式和本发明改进的调用方法作进一步的说明。
目前Dubbo中泛化接口调用是采用如下方式,
Object result=dubboServiceProvider.$invoke("helloServiceProvider",new String[]{"java.lang.String"},new Object[]{"hello"});
其中dubboServiceProvider是要调用的对象,本地程序通过GenericService类的对象获得。
采用现有技术中的方法存在很多问题,比如如果远程调用对象的方法修改,例如将helloServiceProvider修改为hiServiceProvider,上述代码由无法找到dubboServiceProvider对象中的helloServiceProvider方法而返回错误,再比如,如果helloServiceProvider有多个方法名字都是helloServiceProvider,则要么用户修改远程的代码,要么按照默认的顺序执行第一个helloServiceProvider方法,但是该方法并不是用户希望执行的方法。
在一个具体实施例中,以java代码作为示例,应当注意的是,也可以采用例如C++、Python等语言实现,远端程序代码如下:
在编译阶段,中间代码会检查Dubbo中的泛化接口,对其中的参数字符串进行切割,例如上例中会切割成“helloServiceProvider”、“str”、“map”三部分,当然也可以包括更多的参数,而且可以采用其他连接符连接要远程调用的方法名和参数。当代码执行到Dubbo的泛化调用时,会将方法名和参数发送给远程代码,远程代码根据要调用的方法名和参数个数以及参数类型,调用远程代码中对应的方法。
在另外一个实施例中,其中的方法名可以用远程代码中的注解代替,例如需要调用DubboServiceProvider中的第一个helloServiceProvider方法,只需要将本地代码中的方法名替换为注解字符串即可。具体是本地调用代码是Object result=genericService.$invoke("acfada6f2171457ae-str");根据字符串“acfada6f2171457ae”可以唯一确定要调用的远程程序中的DubboServiceProvider中的第一个helloServiceProvider方法,而且程序会对切分后的参数进行校验,如果参数的个数或者参数类型和远程程序中的唯一确定的方法不对应,会返回错误信息到本地。为了区分方法名和注解字符串,可以在使用单引号标识方法名,也可以采用其他特殊字符串。
在一个实施例中,Dubbo中会存储一个中间表,中间列表存储有远端程序方法和注解字符串的对应关系,仍然以上述代码为例,中间表如下所示:
当执行到Dubbo泛化调用接口时,如果是注解字符串,则通过中间表查找对应的远程对象的方法,在一个更为具体的实施例中,中间表还会存储远程代码的地址和端口等信息,还可以包括远程方法的相关文字性介绍,这样便于本地用户调用时参考。注解字符串是根据远程程序的对象名、方法名和参数进行hash或者md5等生成,具有唯一性。
在一个实施例中,包括以下步骤:
步骤1:在本地程序中构建字符串,所述字符串包括方法唯一标识和参数;
所述唯一标识为具有唯一标识性的字符串,且要调用的远程对象的方法也是利用所述具有唯一标识性的字符串注解,而且即使要远程调用的对象的具体方法的方法名改变,也利用所述字符串包括的唯一标识确定要调用的对象的方法;
步骤2:在本地程序中调用Dubbo中的泛化接口,将所述字符串作为唯一参数传入泛化接口中;
所述参数包括参数类型和参数名,根据参数名将本地程序中具有相同参数名的参数对象序列化,在确定要远程调用的对象的具体方法后,将序列化后结果作为参数传入到远程调用的对象的具体方法中
步骤3:在远程程序中根据所述字符串的唯一标识和参数确定要远程调用的对象的具体方法;
在一个实施例中,步骤3具体包括:
步骤3.1解析所述字符串,将所述字符串切分为两部分,第一部分内容为方法唯一标识,第二部分内容为参数列表,根据第一部分内容以及调用关系确定要远程调用的函数的方法列表,利用第二部分内容从所述方法列表中确定实际要调用的方法,并将参数列表中的参数作为实际要调用的方法的参数,所述参数列表包括0个或至少1个参数。方法的唯一标识为方法名。
步骤3.2统计要远程调用的对象的具体方法的平均执行时间,若平均执行时间大于第一时间阈值,将本地程序挂起,当挂起时间与当前时间差大于第二时间阈值时,唤醒挂起的本地程序,所述第二时间阈值小于第一时间阈值;若平均执行时间不大于第一时间阈值,本地程序等待结果返回。
步骤4:将远程调用方法的执行的结果返回到本地程序;
步骤5:本地程序根据返回的结果继续执行后续程序。
在另外一个实施例中,主要包括以下步骤:
步骤0:根据远程程序的对象名、方法名和参数进行hash或者md5等生成方法的唯一标识字符串,利用该唯一标识字符串注解远程代码的方法;
步骤1:在本地程序中构建字符串,所述字符串包括方法唯一标识和参数;
所述唯一标识为具有唯一标识性的字符串,且要调用的远程对象的方法也是利用所述具有唯一标识性的字符串注解,而且即使要远程调用的对象的具体方法的方法名改变,也利用所述字符串包括的唯一标识确定要调用的对象的方法;
步骤2:在本地程序中调用Dubbo中的泛化接口,将所述字符串作为唯一参数传入泛化接口中;
所述参数包括参数类型和参数名,根据参数名将本地程序中具有相同参数名的参数对象序列化,在确定要远程调用的对象的具体方法后,将序列化后结果作为参数传入到远程调用的对象的具体方法中
步骤3:在远程程序中根据所述字符串的唯一标识和参数确定要远程调用的对象的具体方法;
在一个实施例中,步骤3具体包括:
步骤3.1解析所述字符串,将所述字符串切分为两部分,第一部分内容为方法唯一标识,第二部分内容为参数列表,根据第一部分内容以及调用关系确定要远程调用的函数的方法列表,利用第二部分内容从所述方法列表中确定实际要调用的方法,并将参数列表中的参数作为实际要调用的方法的参数,所述参数列表包括0个或至少1个参数。方法的唯一标识为唯一标识字符串。
在一个更为具体的实施例中,可以在中间表中记录有唯一标识字符串和对应的方法的对应关系,通过该中间表查找到具体调用的远程代码的对象及其方法,并将切分后的参数作为远程代码的方法的参数;当切分后的参数个数以及类型和确定的远程代码的方法不相同时,返回错误信息;
步骤3.2统计要远程调用的对象的具体方法的平均执行时间,若平均执行时间大于第一时间阈值,将本地程序挂起,当挂起时间与当前时间差大于第二时间阈值时,唤醒挂起的本地程序,所述第二时间阈值小于第一时间阈值;若平均执行时间不大于第一时间阈值,本地程序等待结果返回。
步骤4:将远程调用方法的执行的结果返回到本地程序;
步骤5:本地程序根据返回的结果继续执行后续程序。
相应的,本发明的具体实施例还包括对应的模块,这里不再赘述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。