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查看:

springboot dubbo无法整合spring事务解决方案

服务提供方已经注册成功了,但是服务名是一个代理服务,没关系,在提供服务的service注解上指定接口名称,如下:

@Service(interfaceName="com.yvpai.www.service.UserService")

重新启动,再次访问dubbo-admin查看,发现服务名已改成UserService

springboot dubbo无法整合spring事务解决方案

启动消费者,测试事务回滚正常!

三、补充

网上有的说要加下面两个配置,应该是跟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

访问我的达人课

访问我的博客 Wang's Blog

关注我的微信公众号获取更多资源

springboot dubbo无法整合spring事务解决方案