美文网首页
spring-boot 集成dubbo框架第二集

spring-boot 集成dubbo框架第二集

作者: java_飞 | 来源:发表于2019-03-12 16:06 被阅读0次

    之前也有写过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也都正常运行。

    如果帮到您了,请点个喜欢,谢谢!,有问题加QQ:1107156537

    相关文章

      网友评论

          本文标题:spring-boot 集成dubbo框架第二集

          本文链接:https://www.haomeiwen.com/subject/dlknpqtx.html