java父类拦截子类传递_一种微服务体系异常机制传递方法与流程

本发明涉及互联网微服务相关技术领域,尤其是指一种微服务体系异常机制传递方法。

背景技术:

微服务架构风格是一种将单个应用程序作为一套小型服务开发的方法,每种应用程序都在自己的进程中运行,并与轻量级机制(通常是http资源api)进行通信。

当前,springcloud作为微服务最具典型的实现方案,是很多服务端研发人员的优先选择。但由于默认异常处理方式只是将简单的信息进行封装传递给上游,在实际生产环境中会有很多局限性,也无法满足业务个性化要求。而且在微服务体系越来越庞大的情况下,服务间相互依赖,相互交错,可能一个业务的实现,是基于一条很长的微服务链完成。如果在链的最底端出现问题,由于默认机制传递信息少,底端问题的原因会在上层就丢失掉,这无疑给最上层的开发排查带来严重困扰,无法得知问题究竟出自哪里,因此,异常信息的逐层传递是十分必要的。

服务端的微服务体系是基于springcloud(微服务体系治理方案)基础上搭建的。由于原生的体系对异常情况的默认处理只是将有限的错误消息传递给上层调用者,对于上层调用者是无法了解下层异常的详细细节,也无法得知异常是自定义异常或是其他异常,致使在微服务的调用链中异常细节不断丢失,研发人员无法精准的定位问题所在,导致排查问题变得尤为困难。

技术实现要素:

本发明是为了克服现有技术中存在上述的不足,提供了一种能够快速定位问题的微服务体系异常机制传递方法。

为了实现上述目的,本发明采用以下技术方案:

一种微服务体系异常机制传递方法,应用于服务端springcloud体系之上,具体包括如下步骤:

(1)在程序出现异常情况下,会进入预定义的统一拦截方法,对异常进行统一拦截;

(2)在统一拦截方法内,获取异常核心信息,并将异常核心信息进行重新组装;

(3)传递重新组装的异常信息至上层调用者,上层调用者进行异常信息解析,并重新封装为异常进行上抛。

而本发明的方法用于解决原体系内异常信息丢失导致的问题排查困难,确保在每个环节都能明确得知问题所在,提升研发人员高效快速定位问题的效率。

作为优选,在步骤(1)中,具体方法如下:基于异常exception是所有异常的父类的这个语言特性,即所有类型异常都是exception类的子类,因此统一拦截时只对异常父类exception类进行拦截,无需对特定类型异常进行拦截,拦截方法为:当拦截到异常时进行判断,只要异常是exception类的实例或者exception类子类的实例,都会触发拦截方法的逻辑,这样当出现异常时即可涵盖所有异常情况。

作为优选,在步骤(2)中,获取的异常核心信息主要包括异常类的全路径名称和异常消息堆栈,根据异常类的全路径名称区分判别是否是自定义异常或是其他异常,自定义异常和其他异常在返回内容上会通过返回不同的http响应码进行区别。

作为优选,在步骤(3)中,上层调用者进行异常信息解析时,根据http响应码进行不同解析,并根据传递过来的异常消息内容通过java语言特性里的反射机制完成异常对象创建,然后进行上抛;其中:反射机制指的是根据一个类的全路径名称去动态生成这个类的一种描述的对象,并用这个类的描述对象去构建这个类的实例。

作为优选,在步骤(3)中,在利用反射机制创建异常对象后,对于其他异常将传递过来的异常堆栈信息作为异常根源信息,来丰富异常信息,而上抛生成的异常,上层调用者可根据实际需要选择捕获或者继续上抛,由于上抛生成的异常包含了下游的异常信息,如果继续进行上抛,可将上游的信息也携带进去,确保了整条链路上异常的逐层传递。

本发明的有益效果是:解决原体系内异常信息丢失导致的问题排查困难,确保在每个环节都能明确得知问题所在,提升研发人员高效快速定位问题的效率。

具体实施方式

下面结合具体实施方式对本发明做进一步的描述。

一种微服务体系异常机制传递方法,应用于服务端springcloud体系之上,具体包括如下步骤:

(1)在程序出现异常情况下,会进入预定义的统一拦截方法,对异常进行统一拦截;具体方法如下:基于异常exception是所有异常的父类的这个语言特性,即所有类型异常都是exception类的子类,因此统一拦截时只对异常父类exception类进行拦截,无需对特定类型异常进行拦截,拦截方法为:当拦截到异常时进行判断,只要异常是exception类的实例或者exception类子类的实例,都会触发拦截方法的逻辑,这样当出现异常时即可涵盖所有异常情况。

(2)在统一拦截方法内,获取异常核心信息,并将异常核心信息进行重新组装;获取的异常核心信息主要包括异常类的全路径名称和异常消息堆栈,根据异常类的全路径名称区分判别是否是自定义异常或是其他异常,自定义异常和其他异常在返回内容上会通过返回不同的http响应码进行区别。

具体为:将异常核心信息封装到一个新的模型中,对异常全称进行判别,如果是自定义异常则将当前http响应码置为bad_request(400),如果是其他异常,将http响应码置为internal_server_error(500),将http响应携带新的模型信息返回给上层调用者。

(3)传递重新组装的异常信息至上层调用者,上层调用者进行异常信息解析,并重新封装为异常进行上抛;上层调用者进行异常信息解析时,根据http响应码进行不同解析,并根据传递过来的异常消息内容通过java语言特性里的反射机制完成异常对象创建,然后进行上抛;其中:反射机制指的是根据一个类的全路径名称去动态生成这个类的一种描述的对象,并用这个类的描述对象去构建这个类的实例。在利用反射机制创建异常对象后,对于其他异常将传递过来的异常堆栈信息作为异常根源信息,来丰富异常信息,而上抛生成的异常,上层调用者可根据实际需要选择捕获或者继续上抛,由于上抛生成的异常包含了下游的异常信息,如果继续进行上抛,可将上游的信息也携带进去,确保了整条链路上异常的逐层传递。

具体为:上层调用者接收到返回的http请求,并进行解析;根据传递过来的异常信息,利用反射机制生成真正的异常;对http响应码判别,如果是internal_server_error(500),需要将传递过来的异常信息中的根源信息写入真正的异常中;上抛生成真正的异常,调用者可根据实际需要选择捕获或者继续上抛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值