spring-boot 集成dubbo框架第二集
之前也有写过boot集成dubbo的文章,当时也是解决了问题;但是今天在测试的时候发现这个项目里抛出的业务异常会被dubbo捕获并包装成运行时异常,导致我消费者这端接口返回给前端未知异常,其实错误原本的错误是业务异常,从而无法准确知道错误在哪里;
查找资料知道dubbo 包装错误是在ExceptionFilter类里面,同时同事也写了一个自己的filter,来做错误的统一处理,调试时发现,filter的调用顺序为ExceptionFilter------>MyExceptionFilter;由于在ExceptionFilter中已经将错误封装成了RunTimeException导致我们自定义的filter中无法判断到是运行时异常还是业务异常。
解决办法:设置filter调用顺序,使其不走ExceptionFilter,直接走我们自定义的;
即在配置文件中添加
spring.dubbo.provider.filter=xxxFilter,xxxExceptionFilter,-exception.
注意:-exception,表示使程序不走ExceptionFilter
配置以后启动程序测试发现,程序还是走了ExceptionFilter;
这时候很匪夷所思了,我就在消费者端项目里面也加上这个,我们消费者项目是springMVC项目,是在xml文件中配置的这一段,如下:
<dubbo:consumer filter="xxxFilter,xxxxFilter,xxxxxxExceptionFilter,-exception" check="false"/>
注意:-exception,表示使程序不走ExceptionFilter
启动两个程序后,调试发现还是走了ExceptionFilter;
这时候就猜测可能是因为我提供者这边的项目是boot的原因,可能这边的配置没有生效;
因为我们还有另一个项目也是提供者,然后那个项目是springMVC框架的,同样我也在那个项目的xml文件里加上一句:
spring.dubbo.provider.filter=xxxFilter,xxxExceptionFilter,-exception.
注意:-exception,表示使程序不走ExceptionFilter
然后启动这两个项目发现,程序报错正常了,不走ExceptionFilter这个类中的方法了;
找到原因:是因为boot这个项目中的配置没有生效;
这个时候联系到上篇文章,我的boot整合dubbo框架用的jar包依赖是
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo.boot.version}</version>
</dependency>
查看这个包里面的源码,发现并没有对自定义filter的配置做支持;也就是说我再配置文件中配置的参数根本就没生效,没有地方去解析;
查找网络发现dubbo集成框架有很多的方法,官方提供的jar包也有好几种,我都去尝试了下;
第一种使用的jar包:
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
网络上也有很多关这个jar包的集成方式,我也跟着试了下,中间出了很多的问题;
1.dubbo版本不兼容,导致找不到xx类;
2.需要引入额外的jar包,但是没有网上没有说明;
3.成功启动了但是,消费者这端进行消费时,注入的类为null;
总结:1.2两个问题很快就解决了,但是第三个问题找了很多方法都没用,不知道原因在哪里,反正没有解决;
猜测:可能是因为我的消费者用的是SpringMVC框架项目的原因,我发现网上用的boot框架的消费者是可以正常消费的,由于时间问题,就不去寻找原因了,毕竟,像我们一样一部分走boot一部分走springMVC的还是比较少的。(如果有人解决来的话,希望可以告知,谢谢)
然后考虑到,我们的环境是不能修改dubbo版本的,因为我们用的不是ali的dubbo,所以我只能放弃了这个方法
第二种使用的jar包:
<!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-starter -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
</dependency>
网上关于这个jar包的集成教程很少,可能是因为比较新,maven仓库可以看到这个jar包是2018-2019的,所以我找到的资料也有限,根据这个地址的教程:https://blog.csdn.net/belonghuang157405/article/details/84070689 尝试后发现:
1.dubbo版本兼容问题,找不到相关注解;
2.解决兼容问题后,发现能够正常启动了,但是无法注册bean到zookeeper上;
总结: 由此无法解决上述问题,又考虑到必须更改dubbo的版本,跟我们的环境不符合;
第三种方式的jar包:
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
</dependency>
没错,这里用的还是原来的jar,但是前面说到原来的jar包不支持filter的配置,但是这里为什么还要用呢,这里也是同事解决的,他从github上将源码拉下来后发现跟原来jar包中的代码不一样,多了一些配置参数的支持,并且filter也支持,但是在maven仓库里,这个jar包只有一个版本,也就是作者并没有将最新的代码发布到仓库里,那么就只能自己动手,丰衣足食了,同事将最新的包打出来后发给我,然后我将该包修改了下groupId然后发不到我们私服的第三方仓库里,修改配置文件以及依赖,启动项目后发现一切正常,并且程序也没有走入默认的ExceptionFilter,而且自定义的filter也都正常运行。