前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springboot dubbo @Service @Transactional 无法提供服务或者无法提供事务的解决办法

Springboot dubbo @Service @Transactional 无法提供服务或者无法提供事务的解决办法

作者头像
林老师带你学编程
发布2019-05-26 07:01:35
2.8K0
发布2019-05-26 07:01:35
举报
文章被收录于专栏:强仔仔强仔仔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1434362

问题场景:

今天在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 同时存在时候,无法提供服务或者无法提供事务的问题了。真的简直坑的一批,这种依赖,配置相关的问题是最恶心的,因为它不会报错,所以需要从方方面面猜测问题的原因才可以,不过虽然很坑,但是还好问题得到解决。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档