美文网首页互联网科技个人学习程序员
Springboot整合dubbo(二):服务启用事务(注解实现

Springboot整合dubbo(二):服务启用事务(注解实现

作者: 问题_解决_分享_讨论_最优 | 来源:发表于2019-12-25 06:43 被阅读0次

在前两天的工作中,遇到了个问题,现在手上在做的系统,从架构到目前的开发都是我自己独立完成,在项目构建时我选择使用了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配置加载的前后顺序有关,跟后面我所解释的另一个问题应该是差不多原因导致,等后续有时间我再通过源码分析下原因再做分析
解决了与注解配置事物的问题后,又遇到了一个坑,通过@Reference注解注入接口调试项目时发现接口注入显示为null,但是查看dubbo-admin上的消费者已经注册到了zookeeper上,但是为什么引用不到呢?查看了很多大神们的博文,发现这个是因为springboot初始化时加载配置的先后顺序有关,扫描@Reference的步骤是在类加载之后,也就是说consumer注册到zookeeper之后才扫描该注解,此时就无法注入相关接口。修改的方式很简单,在启动类的注解@SpringBootApplication之前添加注解@EnableDubboConfig就可以解决了,确保优先加载dubbo配置。


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

打个广告,本人博客地址是:风吟个人博客

相关文章

网友评论

    本文标题:Springboot整合dubbo(二):服务启用事务(注解实现

    本文链接:https://www.haomeiwen.com/subject/qncznctx.html