Dubbo 如何处理业务异常,这个一定要知道哦!
为什么产生
我们来看看 dubbo 的源码进行分析,如果 Dubbo 的 provider 端 抛出异常(Throwable),则会被 provider 端 的 ExceptionFilter 拦截到,执行以下 invoke 方法,里面有个实现 Listener 类,重写了 onResponse。
我们来分析一些代码:
if (appResponse.hasException() && GenericService.class != invoker.getInterface())
上面代码的含义就是 如果有异常并且未实现 GenericService 接口,进入后续判断逻辑,否则直接返回结果。
上面代码的含义就是 不是 RuntimeException 类型的异常,并且是受检异常(继承 Exception),直接抛出。
上面代码的含义就是 在方法签名上有声明,直接抛出。
上面代码的含义就是 如果异常类和接口类在同一个 jar 包中,直接抛出。
上面代码的含义就是 以 java.或 javax.开头的异常直接抛出。
上面代码的含义就是 dubbo 自身的异常,直接抛出。
不满足上述条件,会做 toString 处理并被封装成 RuntimeException 抛出。
现在我们知道了 **为什么我们自定义的异常,没有正确的抛出,**这个是因为上面的几个条件,我们都没有满足,所以最后 dubbo 把它封装成了 RuntimeExceptio Java 开源项目【ali1024.coding.net/public/P7/Java/git】 n。
《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 #### 如何解决解决方法就针对上面的几个条件进行,有几种方案,我们一一看一下:
1、将该异常的包名以 java.或者 javax.开头
这个方案不现实,也不符合规范,所以不采用
2、业务异常继承 Exception,变为 checked 异常
自定义的业务异常本身属于 RuntimeException,所以也不采用
3、异常类和接口类在同一 jar 包里
较大的项目一般都会有一些 common 包,定义好异常类型,使用二方包的方式引用,所以也不适用
4、provider 的 api 明确写明 throws XxxException
作为生产服务端,不应显式抛出异常给客户的进行处理,所以也不适用
最终方案
以上方案都不合适,我们这里介绍个最终的方案,即采用 dubbo 的 filter 重写,dubbo 的异常处理。
1、将 dubbo 源码中 ExceptionFilter 复制到我们的项目改名为 DubboExceptionFilter 修改一些代码
2、在此处加上一段代码来过滤我们项目中的异常,以免被 dubbo 重新封装 3、在 resources 目录下添加纯文本文件 META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 并添加内容
dubboExceptionFilter=com.rainbow.goods.server.filter.
总结
互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
**另外本人还整理收藏了 2021 年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对大家有所帮助。
评论