首页> 中国专利> 一种基于Spring远程调用的异常处理方法和系统

一种基于Spring远程调用的异常处理方法和系统

摘要

本发明公开了一种基于Spring远程调用的异常处理方法和系统,所述方法包括:构建服务器异常处理器,并定义所述服务器异常处理基类和相关业务参数;在所述服务器异常处理器中构建拦截注解,生成远程服务拦截器,通过所述远程服务拦截器拦截业务数据;根据所述服务器异常处理基类判断远程服务拦截器拦截的业务数据是否是异常业务数据;构建客户端异常处理器,并定义所述客户端异常处理基类和注解;根据所述客户端异常处理注解生成Spring代理,通过所述Spring代理拦截客户端执行方法;调用所述客户端异常处理器和客户端异常处理基类对拦截的客户端执行方法进行异常判断和处理。

著录项

  • 公开/公告号CN114579194A

    专利类型发明专利

  • 公开/公告日2022-06-03

    原文格式PDF

  • 申请/专利权人 杭州每刻科技有限公司;

    申请/专利号CN202210228619.2

  • 发明设计人 舒超群;辛晶艺;叶正卿;魏美钟;

    申请日2022-03-08

  • 分类号G06F9/4401;

  • 代理机构杭州裕阳联合专利代理有限公司;

  • 代理人杨琪宇

  • 地址 310000 浙江省杭州市钱塘新区万晶湖畔中心西区2幢1501室

  • 入库时间 2023-06-19 15:32:14

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-06-03

    公开

    发明专利申请公布

说明书

技术领域

本发明涉及微服务技术领域,特别涉及一种基于Spring远程调用的异常处理方法和系统。

背景技术

目前在微服务器架构中,随着业务的增加,每个项目的开发者会在自身的开发业务中定义异常,并将定义异常捕获后转换为远程服务异常,然而上述项目中不同的开发者在处理不同的业务时都会自定义其业务异常同时又需trycatch其业务异常然后转换为远程服务异常,同时客户端又需捕获其远程服务异常转换为业务异常,由于异常处理过程比较长且复杂会导致一些开发者的疏忽同时会导致业务代码臃肿。

发明内容

本发明其中一个发明目的在于,提供一种基于Spring远程调用的异常处理方法和系统,所述方法和系统通过解耦业务处理逻辑和异常处理逻辑,从而可以实现异常处理高效处理和灵活扩展。使得异常处理逻代码实现可以更加简单高效。

本发明另一个发明目的在于,提供一种基于Spring远程调用的异常处理方法和系统,所述方法和系统通过同时定义异常处理规则、服务器异常拦截处理器注解和客户端异常拦截处理器注解的方式进行异常捕获处理,减少业务处理过程中流程长度。

本发明另一个发明目的在于,提供一种基于Spring远程调用的异常处理方法和系统,所述方法和系统通过Spring创建Bean时为远程服务服务端添加异常处理拦截器统一处理服务端抛出的业务异常,同时为远程服务客户端构建客户端代理在代理端调用方法时捕获其远程服务异常同时转换为客户端需要的业务异常。

为了实现至少一个上述发明目的,本发明进一步提供一种基于Spring远程调用的异常处理方法,所述方法包括:

构建服务器异常处理器,并定义所述服务器异常处理基类和相关业务参数;

在所述服务器异常处理器中构建拦截注解,生成远程服务拦截器,通过所述远程服务拦截器拦截业务数据;

根据所述服务器异常处理基类判断远程服务拦截器拦截的业务数据是否是异常业务数据;

构建客户端异常处理器,并定义所述客户端异常处理基类和注解;

根据所述客户端异常处理注解生成Spring代理,通过所述Spring代理拦截客户端执行方法;

调用所述客户端异常处理器和客户端异常处理基类对拦截的客户端执行方法进行异常判断和处理。

根据本发明其中一个较佳实施例,所述定义所述服务器异常处理基类方法包括:获取业务数据,根据所述业务参数业务异常参数,其中所述业务异常参数包括错误业务编码、错误信息参数和错误内容,根据所述业务异常参数构建完整的业务异常数据,并实现所述业务异常数据的基类。

根据本发明另一个较佳实施例,通过所述远程服务拦截器获取服务器的业务数据后,在所述拦截器中捕获业务异常参数,并判断所述业务异常参数是否属于定义的业务异常基类,若是则将所述业务异常参数组建为完整的业务异常数据写入到远程服务中。

根据本发明另一个较佳实施例,所述客户端异常处理器处理客户端异常的方法包括:在客户端装配定义的异常处理注解后,通过spring bean的创建过程中判断bean是否存在客户端装配的异常处理注解,若存在所述异常处理注解,则进一步对所述bean生成Spring CGLIB代理,通过所述Spring CGLIB代理拦截客户端执行方法,并判断拦截到的客户端执行方法是否存异常,若存在则根据所述Spring CGLIB代理中的注解判断异常处理类的类型,根据所述异常处理类的类型调用对应的异常处理器处理该异常。

根据本发明另一个较佳实施例,对所述bean生成Spring CGLIB代理并拦截对应异常的方法包括:定义bean类工厂,通过所述bean类工厂的接口获取实例bean,在获取所述实例bean时,构建所述Spring的Enhancer类实例,并将所述Spring的Enhancer类实例设置为所述bean的代理类,同时设置所述Enhancer类实例的代理类型为bean类类型,进一步设置回调处理函数,通过所述回调处理函数拦截bean实例并捕获异常。

根据本发明另一个较佳实施例,所述客户端异常处理注解包括handle信息,在所述客户端定义异常处理基类,所述handle信息包含异常处理类型,其中所述handle信息异常处理类型的值为所述异常处理基类的子类,根据所述异常处理基类实现的方法处理对应子类的客户端异常。

根据本发明另一个较佳实施例,在获取客户端异常类型后,若需要将所述客户端异常类型判定为全局默认异常,则对所述客户异常类型添加全局异常注解。

根据本发明另一个较佳实施例,所述服务器异常处理器通过Grpc拦截器提供的关闭数据流将数据返回方法将拦截的异常数据写入到远程服务中。

为了实现至少一个上述发明目的,本发明进一步提供一种基于Spring远程调用的异常处理系统,所述系统执行所述一种基于Spring远程调用的异常处理方法。

本发明进一步提供一种计算机可读存储介质,所述计算机可读存储介质存储计算机程序,所述计算机程序可被处理器执行所述一种基于Spring远程调用的异常处理方法。

附图说明

图1显示的是本发明一种基于Spring远程调用的异常处理方法的流程示意图。

具体实施方式

以下描述用于揭露本发明以使本领域技术人员能够实现本发明。以下描述中的优选实施例只作为举例,本领域技术人员可以想到其他显而易见的变型。在以下描述中界定的本发明的基本原理可以应用于其他实施方案、变形方案、改进方案、等同方案以及没有背离本发明的精神和范围的其他技术方案。

可以理解的是,术语“一”应理解为“至少一”或“一个或多个”,即在一个实施例中,一个元件的数量可以为一个,而在另外的实施例中,该元件的数量可以为多个,术语“一”不能理解为对数量的限制。

请结合图,本发明公开了一种基于Spring远程调用的异常处理方法和系统,其中所述方法主要包括如下步骤:首先需要在服务器端定义服务器异常处理基类和业务参数,以及定义服务器异常拦截注解,其中所述服务器异常拦截注解包括:EnableGrpcServerExceptionCatch,进一步生成服务器拦截器,通过所服务器异常拦截注解装配拦截逻辑后,实现远程服务的拦截器ServerInterceptor。在所述拦截器内对服务器业务操作进行拦截,并进一步捕获服务器业务操作的异常,判断所述捕获的异常是否属于上述服务器异常处理基类实现,若是则获取波或服务器业务操作的异常参数,将所述异常参数封装成完整的异常数据作为远程服务异常写入到远程服务中。其中所述方法还包括在客户端定义异常处理基类,并定义客户端异常处理注解RpcExceptionHandler,其中所述客户端异常处理注解RpcExceptionHandler在客户端进行装配。

具体的,在所述客户端异常处理注解装配后,创建Spring Bean,在创建所述Spring Bean过程中判断Bean是否存在上述配置的客户端异常处理注解,若存在则对所述Bean生成Spring CGLIB代理,其中CGLIB为Code Generation Library,所述Spring CGLIB代理可以为没有实现接口的类进行代理,所述Spring CGLIB代理可以定义一个拦截器,通过所述Spring CGLIB代理定义的拦截器可以通过回调MethodInterceptor接口方法拦截客户端执行的方法,并进一步捕获客户端执行的异常,进一步判断所述Spring CGLIB代理拦截器上定义的异常处理器类型,并根据所述异常处理器类型执行所述异常的处理操作。

值得一提的是,通过所述Spring CGLIB代理的操作包括如下步骤:先定义Bean类工厂ServiceFactory,所述Bean类工厂ServiceFactory通过spring提供的FactoryBean接口并实现获取bean的方法。也就是说,当获取所述bean实例的方法过程中,需要构建spring的Enhancer类实例,并将所述Enhancer类实例设置为bean类的代理,同时设置所述Enhancer类实例的代理类型为对应的Bean类类型,进一步设置所述代理实例的回调处理函数,通过所述回调处理函数拦截bean实例方法,并捕获所述异常。

在通过所述Spring CGLIB代理捕获到客户端的异常后,将获取所述Spring CGLIB代理定义的异常处理注解@RpcExceptionHandler,进一步根据所述异常处理器注解中的Handler信息判断该异常处理类的类型,进一步根据所述异常处理类类型调用对应类型的异常处理器执行该异常处理。需要说明的是,所述Handler值为异常解析器ExceptionResolver的子类,所述异常处理注解可以实现所述异常解析器对应的方法。也就是说,若定义异常解析器作为父类(基类),而在该父类下自定义异常处理类作为子类,从而可以实现覆盖特定异常处理的诉求。

本发明通过Guanaitong服务调用为例,Guanaitong是一个GRPC提供的服务:

定义业务异常:BizServiceException,并定义服务器业务异常处理基类:AbstractBizServiceException,所述业务异常处理基类的参数包括:错误业务编码errorCode、错误内容extraMsg、错误信息参数>args;将上述三个异常处理基类参数组装成完整的异常消息写入到对应的远程服务中。

定义服务器异常拦截注解:@EnableGrpcServerExceptionCatche,其中将所述服务器异常拦截注解注入到GrpcServerExceptionHandler处理器中,通过所述GrpcServerExceptionHandler处理器实现Grpc提供的ServerInterceptor拦截器,在拦截器中拦截所述AbstractBizServiceException的服务器业务异常,进一步通过所述Grpc通讯服务识别服务器业务异常Status(状态),并调用所述ServerInterceptor拦截器提供的关闭数据流并将异常返回(close)的方法将所述业务异常写入到远程服务中。

需要说明的是,本发明通过在服务器主类中加入@EnableGrpcServerExceptionCatch注解的方式实现对服务器业务异常的统一拦截捕获。

对于客户端部分,在客户端定义异常处理器注解:@UniformExceptionResolver,并进一步定义客户端异常处理基类ExceptionResolver,其中所述客户端异常处理基类可以将Grpc通讯服务状态(Status)中的3个参数识别获取后,将错误代码、错误描述、错误参数分别填入errorCode、extraMsg、args三个参数并格式化为客户端需要的完整异常信息。在本发明其中一个较佳实施例中,若需要指定该异常类型为全局默认异常,则需要在该异常的类上添加标注:@ExceptionGlobal。进一步在客户端端建立相关异常处理器文件和路径用于注册客户端异常处理器,以上述Guanaitong服务调用为例:在项目目录resource目录下创建META-INF/services目录并创建com.maycur.datahub.exception.ExceptionResolver文档,其中所述文档的内容为实现客户端异常处理的全路径名。进一步根据注册的客户端异常处理器,为客户端配置对应的异常处理器,通过在客户端加入注解@RpcExceptionHandler(handle=UniformExceptionResolver.class)实现异常处理器的配置,若客户端需要配置默认的异常处理器,则直接在客户端加入注解:@RpcExceptionHandler,客户端可以通过所述默认注解可以实现在远程调用时出现异常则会自动调用该异常处理器处理异常,不再需要在每个客户端方法中try catch其异常再处理。

特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。在该计算机程序被中央处理单元(CPU)执行时,执行本申请的方法中限定的上述功能。需要说明的是,本申请上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是但不限于电、磁、光、电磁、红外线段、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线段的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本申请中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本申请中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线段、电线段、光缆、RF等等,或者上述的任意合适的组合。

附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

本领域的技术人员应理解,上述描述及附图中所示的本发明的实施例只作为举例而并不限制本发明,本发明的目的已经完整并有效地实现,本发明的功能及结构原理已在实施例中展示和说明,在没有背离所述原理下,本发明的实施方式可以有任何变形或修改。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号