分布式系统异常统一处理的方法与流程

文档序号:18796297发布日期:2019-09-29 19:42阅读:2117来源:国知局
分布式系统异常统一处理的方法与流程

本发明涉及分布式系统异常统一处理的方法。



背景技术:

在分布式系统对程序异常的处理中,dubborpc框架提供了基础的异常处理组件,在发生异常的情况下,能够对消费方抛出自定义异常,而消费方需要了解每种异常类型并针对不同的异常类型做出不同的处理策略,如果消费方没有显示捕获异常的情况下,将对业务系统产生致命的错误。dubbo框架的官方文档可参考:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

由此可见,现有对异常处理的方式存在的缺点有:

1.服务方在定义api接口(应用程序编程接口)的时候,需要显示的在接口上定义可能抛出的各种异常,并告知消费方每种异常应该怎么处理。这无疑增加了服务提供方的工作量。

2.消费方需要分别捕获每种异常并对异常做出不同的处理策略,如果忘记或遗漏了捕获异常,将会对业务造成致命错误。因此显示的捕获异常同样也增加了消费方的工作量。

3.常规的由系统对外抛出异常的方式,对消费方不友好并存在性能问题。

4.在分布式调用情况下,为了完成一笔业务进件很可能会调用多个服务方,当在业务调用链路上发生异常的情况下,现有方式很难快速定位调用链路上下文并快速定位问题原因。



技术实现要素:

本发明提供了一种分布式系统异常统一处理的方法,以降低开发成本、对异常快速定位和分析,防止内部代码混乱而出现不必要的风险。

本发明分布式系统异常统一处理的方法,其特征包括:

a.建立用于发起远程调用的基于串行接口的调用过程拦截器类,当远程调用发生异常时,所述的调用过程拦截器类会捕获异常并打印相关日志;

b.建立结果响应类,用于响应各服务之间的调用结果,并接收步骤a所述调用过程拦截器类的输出信息;

c.建立基于threadlocal(一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰)、rpccontext(threadlocal的临时状态记录器)和mdc(mappeddiagnosticcontext,映射调试上下文,用于在多线程条件下记录日志)的链路跟踪工具类,用于设置请求编号,并将请求编号设置到当前线程、rpccontext和mdc的上下文中用于链路跟踪;

d.服务方和消费方分别以xml(可扩展标记语言)方式配置所述的调用过程拦截器类,对应实现对服务方统一的异常拦截和对消费方统一的异常拦截;

e.建立消费方切面拦截器类,用于在消费方调用方法之前进行拦截,并调用步骤c所述的链路跟踪工具类来设置请求编号和消费方链路跟踪上下文;

f.建立服务方切面拦截器类,用于在服务方调用方法之前进行拦截,并调用步骤c所述的链路跟踪工具类获取消费方传入的请求编号,并设置服务方链路跟踪上下文。

通过本发明的上述步骤,即完成了从消费端到服务端的异常处理和链路跟踪的能力,从消费端发起调用请求到服务端进行响应处理的过程,不论是消费端还是服务端发生异常或正常运行的情况下,消费端都能正常的获取到结果响应类,对异常快速定位,同时也能通过相关分布式日志收集工具获取到整个调用链路的流水日志。

进一步的,在步骤a所述的调用过程拦截器类中至少包含用于发起远程调用的调用器,和用于调用元数据的调用接口与调用方法。

进一步的,在步骤b所述的结果响应类中至少包含4个字段属性:请求编号,唯一标识一个请求并用于链路跟踪;响应码,通过码值判定响应结果是否正常;响应描述,对当前调用结果的描述;响应对象,调用方本次获取的真实结果。

进一步的,在步骤c中至少包含有两个方法,第一个方法用于在发起请求的时候设置请求编号到链路上下文;第二个方法用于在请求返回结果之前清空链路上下文。

在此基础上,在步骤e完成所述设置后,在返回结果时再调用所述的链路跟踪工具类清空消费方链路跟踪上下文,释放内存空间。

进一步的,在步骤f完成所述设置后,在返回结果时再调用所述的链路跟踪工具类清空服务方链路跟踪上下文,释放内存空间。

进一步的,在步骤e的消费方切面拦截器类和步骤f的服务方切面拦截器类中,分别包含有两个方法,第一个方法是定义拦截切面,用于对调用的方法进行拦截;第二个方法是实现拦截逻辑,用于在执行方法之前设置请求编号,在最终返回结果的时候清空链路跟踪上线文并释放内存空间,分别对应完成消费方和服务方的异常处理和链路跟踪。

本发明的有益效果包括:

1.实现了调用链路的跟踪能力,能够快速获取到链路调用上下文,并快速定位异常和解决异常,有效提升了开发和运维的响应能力。

2.定义了服务方和调用方的开发契约,降低了无契约编程导致的业务风险。

3.定义了框架级别的服务响应对象类、调用过程拦截器类、链路跟踪类,开发者只需要关心自身的业务开发逻辑,统一了异常的处理方式,降低了开发成本。

4.实现了代码的低侵入,并对业务代码零侵入,降低了因引入整套技术方案而导致的业务风险。

以下结合实施例的具体实施方式,对本发明的上述内容再作进一步的详细说明。但不应将此理解为本发明上述主题的范围仅限于以下的实例。在不脱离本发明上述技术思想情况下,根据本领域普通技术知识和惯用手段做出的各种替换或变更,均应包括在本发明的范围内。

附图说明

图1为本发明分布式系统异常统一处理的方法的流程图。

图2为通过本发明方法最终获得的链路跟踪日志样例。

具体实施方式

如图1所示本发明分布式系统异常统一处理的方法,包括:

a.建立用于发起远程调用的基于串行接口(spi)的调用过程拦截器类,该类实现了dubbofilter接口类的invoke方法。当远程调用发生异常时,所述的调用过程拦截器类会捕获异常并打印相关日志。在调用过程拦截器类中至少包含用于发起远程调用的调用器,和用于调用元数据的调用接口与调用方法。

b.建立结果响应类,用于响应各服务之间的调用结果,并接收步骤a所述调用过程拦截器类的输出信息。在结果响应类中至少包含4个字段属性:请求编号,唯一标识一个请求并用于链路跟踪;响应码,通过码值判定响应结果是否正常;响应描述,对当前调用结果的描述;响应对象,调用方本次获取的真实结果。

c.建立基于threadlocal、rpccontext和mdc的链路跟踪工具类,用于设置请求编号,并将请求编号设置到当前线程、rpccontext和mdc的上下文中用于链路跟踪。相应的,在链路跟踪工具类中包含有两个方法,第一个方法用于在发起请求的时候设置请求编号到链路上下文;第二个方法用于在请求返回结果之前清空链路上下文。

d.服务方和消费方分别以xml(可扩展标记语言)方式配置所述的调用过程拦截器类,对应实现对服务方统一的异常拦截和对消费方统一的异常拦截。

分别配置服务方和消费方的调用过程拦截器类:

d1.新建dubbo.xml的文件到项目的resources目录下。

d2.编辑dubbo.xml,配置调用过程拦截器类:

d3.保存文件。

e.建立消费方切面拦截器类,用于在消费方调用方法之前进行拦截,并调用步骤c所述的链路跟踪工具类来设置请求编号和消费方链路跟踪上下文。然后在返回结果时再调用所述的链路跟踪工具类清空消费方链路跟踪上下文,释放内存空间。因此,在消费方切面拦截器类中对应包含有两个方法,第一个方法是定义拦截切面,用于对调用的方法进行拦截;第二个方法是实现拦截逻辑,用于在执行方法之前设置请求编号,在最终返回结果的时候清空链路跟踪上线文并释放内存空间,完成消费方的异常处理和链路跟踪。

f.建立服务方切面拦截器类,用于在服务方调用方法之前进行拦截,并调用步骤c所述的链路跟踪工具类获取消费方传入的请求编号,并设置服务方链路跟踪上下文。然后在返回结果时再调用所述的链路跟踪工具类清空服务方链路跟踪上下文,释放内存空间。因此,在服务方切面拦截器类中对应包含有两个方法,第一个方法是定义拦截切面,用于对调用的方法进行拦截;第二个方法是实现拦截逻辑,用于在执行方法之前设置请求编号,在最终返回结果的时候清空链路跟踪上线文并释放内存空间,完成服务方的异常处理和链路跟踪。

通过上述步骤,即完成了从消费端到服务端的异常处理和链路跟踪的能力,从消费端发起调用请求到服务端进行响应处理的过程,链路跟踪日志样例如图2所示。不论是消费端还是服务端发生异常或正常运行的情况下,消费端都能正常的获取到结果响应类,对异常快速定位,同时也能通过相关分布式日志收集工具获取到整个调用链路的流水日志。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1