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依赖

         
        
            io.dubbo.springboot
            spring-boot-starter-dubbo
            
                
                
                    com.alibaba
                    dubbo
                
            
        
        
        
            com.alibaba
            dubbo
        
        
        
            org.apache.curator
            curator-framework
        

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

        
        
            org.springframework.boot
            spring-boot-starter-aop
        

 第三步:补全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配置加载的前后顺序有关,跟后面我所解释的另一个问题应该是差不多原因导致,等后续有时间我再通过源码分析下原因再做分析

你可能感兴趣的:(工作总结)