springboot dubbo无法整合spring事务解决方案
在springboot整合dubbo进行RPC调用时,发现在service层加上@Transactional注解后注册dubbo服务失败。查询得知dubbo版本过低,不支持事务。虽然找到了解决方案,但是自己还是摸索了很久才解决,所以将自己的填坑过程总结如下:
一、升级版本-添加依赖
将dubbo和zookeeper的版本都进行升级
<!-- Dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
二、填坑
启动报错:
SLF4J: Class path contains multiple SLF4J bindings.
...
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
...
...
因为zkclient在0.7版本之后将log4j替换成了slf4j,因为缺少依赖报错,添加maven依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
<scope>test</scope>
</dependency>
再次启动,报错:
Caused by: java.lang.ClassNotFoundException: org.apache.curator.framework.CuratorFrameworkFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_111]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_111]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_111]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_111]
... 49 common frames omitted
没有找到CuratorFrameworkFactory,添加依赖:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
再次启动,启动成功!进入dubbo-admin查看:
服务提供方已经注册成功了,但是服务名是一个代理服务,没关系,在提供服务的service注解上指定接口名称,如下:
@Service(interfaceName="com.yvpai.www.service.UserService")
重新启动,再次访问dubbo-admin查看,发现服务名已改成UserService
启动消费者,测试事务回滚正常!
三、补充
网上有的说要加下面两个配置,应该是跟AOP有关,我这里没有配置,如果有需要的小伙伴可以参考下:
1.在启动类加上相应注解
@SpringBootApplication
@EnableTransactionManagement
@EnableAspectJAutoProxy
public class YvpaiWebApplication {
public static void main(String[] args) {
SpringApplication.run(YvpaiWebApplication.class, args);
}
}
在springboot启动类上加上@EnableTransactionManagement注解表示开启事务管理,加上 @EnableAspectJAutoProxy表示开启AOP代理自动配置
2.在application.properties配置文件中加入以下配置
spring.aop.proxy-target-class=true
关注我的微信公众号获取更多资源