Springboot整合dubbo(二):服务启用事务(注解实现)所会遇到的坑

在前两天的工作中,遇到了个问题,现在手上在做的系统,从架构到目前的开发都是我自己独立完成,在项目构建时我选择使用了Springboot2.0.6+dubbo作为微服务的基本框架,但是在做的过程中发现有对数据库进行增删改操作,所以在这块接口地方我使用了事务管理,通过springboot的注解模式(懒得写配置文件),但是随后发现,项目正常启动,但是在dubbo-admin上看不到服务注册到zookeeper上,于是我检查了所有可能出问题的地方,包括配置文件,依赖等等,发现无论怎么改项目就是正常启动,就是没有报错,于是度娘了很多,发现原因是事务注解和dubbo注解无法同时使用问题,经过一番折腾终于捣鼓出来问题的解决办法,下面就来详细说下如何解决这个问题,做个分享,也同时自己做个沉淀。

首先搭建一个服务的步骤我已经在上一篇帖子中说明:点我查看

正常情况下我们通过注解方式就可以直接在springboot的service实现类实现事物管理,开启事物的方式:

第一步:

//在启动类上方添加开启事物管理的注解
@EnableTransactionManagement

 第二步:

//在对应事物的类或者方法上使用注解
@Transactional(rollbackFor = Exception.class)

具体使用方式可以通过度娘查找,这样配置之后正常就将事物开启了。但是,我开启事物管理后发现一个神奇的问题,项目没报错,但是通过dubbo-admin查看注册的dubbo服务发现,服务并未注册到zookeeper上,于是我开始检查哪里出了问题,查来查去也找不出原因,最后查了一篇博客才知道,注解方式配置dubbo服务与注解方式实现事务管理两个会起冲突,最好的解决方式(避免方式)就是使用注解事物管理+xml配置文件dubbo服务或者是注解配置dubbo服务+xml配置文件配置事物管理,也就是一种需求通过配置文件方式加载。

很显然我是不会满足这种解决方式的,那么如何兼容两种注解呢?我找到了个方式:

第一步:将spring-boot-starter-dubbo包中的dubbo依赖移除,并添加dubbo2.6.2依赖,且同时添加zookeeper客户端相关的curator依赖

         <!--dubbo相关依赖-->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <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>
        </dependency>
        <!--zookeeper客户端相关的curator依赖-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
        </dependency>

 第二步:事物的话通过aop注入实现,添加springboot对aop的相关依赖:

        <!--springboot上面添加aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

 第三步:补全dubbo的yml的配置信息:

 #dubbo配置
spring:
  dubbo:
    application:
      id: app-party-id
      name: iaa-app-party-service
    server: true
    registry:
      address: zookeeper://127.0.0.1:2181
      port: 2181
    protocol:
      name: dubbo
      port: 20891
    scan: com.meix.iaa.app.party.service.impl

 第四步:启动类上添加上注解@EnableAspectJAutoProxy开启aop自动代理

@SpringBootApplication
@EnableTransactionManagement
@EnableAspectJAutoProxy
public class IaaAppPartyServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(IaaAppPartyServiceApplication.class, args);
    }
}

再启动微服务就能在dubbo-admin上看到相关服务已经注册到了zookeeper上。这是解决的方案。具体原因我觉得应该是跟springboot配置加载的前后顺序有关,跟后面我所解释的另一个问题应该是差不多原因导致,等后续有时间我再通过源码分析下原因再做分析

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值