问题场景:

今天在springboot中集成spring事务的时候,遇到了一个大坑。如果(springboot+dubbo)中添加 @Service、@Transactional 两个注解的时候,就不能进行dubbo服务注册了。

解决历程:

1,先是在springboot启动类添加注解@EnableTransactionManagement,在对应的服务实现类上添加@Transactional。然后发现不能正常发布dubbo服务了,没有报错,但dubbo-admin就是没有收到服务注册。搜索一下,发现dubbo版本低,老版本不支持注解的事务,于是提高到dubbo2.6.2版本。

启动类:

服务类:

2,提高版本到dubbo2.6.2后,还是不行,又搜索一下,发现springboot的事务需要我们打开aop才可以,springboot开启aop需要添加aop相关的依赖,然后再在启动类中添加@EnableAspectJAutoProxy注解就可以开启aop功能了。然后我们还需要在application.yml添加spring.aop.proxy-target-class=true,试了试,可以了,但是消费端说找不到服务,腚眼一看,发现dubbo-admin里的服务是个代理(org.springframework.aop.SpringProxy)。

启动类中添加@EnableAspectJAutoProxy注释:

application.yml配置:

aop依赖:

<!--springboot上面添加aop-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId>

</dependency>

3,虽然能提供服务,但不能被消费者找到,继续搜索,需要在具体实现类里的@Service上添加(version = "1.0.0",interfaceClass=*.class),才可以,需要将接口的类名写入,才可以在dubbo-admin里正常展现服务接口,然后调用,可以做到事务回滚了。

服务提供方:

服务消费方:

注意:

1,首先提升dubbo的版本到2.6以后,再就是需要明确接口名称。

2,好多文章说要么注解实现dubbo,配置文件实现Transactional;要么注解实现Transactional,配置文件实现dubbo,不能同时注解两个,应该是老版本原因,现在可以同时支持了。

高能预警:

springboot+dubbo比较坑的是需要实现io.dubbo.springboot依赖,但是io.dubbo.springboot中包含的dubbo是dubbo:2.5.3,而且没有高版本的dubbo依赖了,那怎么办呢。。。。纠结了一下午,突然想到一个方案,然后顺利的解决这个问题了。

解决方案:

我们可以通过exclusions去除io.dubbo.springboot中的dubbo:2.5.3,然后再重新添加dubbo:2.6.2依赖就可以了。如果大家觉得这样就已经解决的话,那就大错特错了,因为你们会出现如下的错误:

1.java.lang.NoClassDefFoundError: org/I0Itec/zkclient/IZkStateListener

2.java.lang.NoClassDefFoundError: org/apache/zookeeper/Watcher$Event$KeeperState

3.java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy

大家从报错的信息就可以看出来,是缺少对应的依赖,我们只要添加对应的依赖就可以了。

<!--spring-boot-dubbo依赖-->

<dependency>

<groupId>io.dubbo.springboot</groupId>

<artifactId>spring-boot-starter-dubbo</artifactId>

<version>1.0.0</version>

<exclusions>

<!--去除com.alibaba依赖-->

<exclusion>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

</exclusion>

</exclusions>

</dependency>

 

<!--添加2.6.2的dubbo依赖-->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.6.2</version>

</dependency>

 

<!--zookeeper客户端相关的curator依赖-->

<dependency>

<groupId>org.apache.curator</groupId>

<artifactId>curator-framework</artifactId>

<version>2.8.0</version>

</dependency>

 

<!--添加zookeeper依赖-->

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>3.4.5</version>

</dependency>

dubbo全部的配置文件:

这样一波三折之后终于解决@Service、@Transactional 同时存在时候,无法提供服务或者无法提供事务的问题了。真的简直坑的一批,这种依赖,配置相关的问题是最恶心的,因为它不会报错,所以需要从方方面面猜测问题的原因才可以,不过虽然很坑,但是还好问题得到解决。

想要更多干货、技术猛料的孩子,快点拿起手机扫码关注我,我在这里等你哦~

                                                       


本文转载:CSDN博客