最近在使用springcloud Finchley.SR2 + springcloud alibaba 0.2.1.RELEASE + springboot 2.0.6.RELEASE+Nacos 1.3.1+Seata 0.9.0+Mybatis+Redis开发时,seata做全局分布式事务控制时一直报错.工程依赖jar包管理,
源码地址https://gitee.com/wuhan1/spring-cloud-alibaba-shop
<!--版本号管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql版本 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 数据源druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.5.0</version>
</dependency>
<!-- 分布式事务seata包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.1.0.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>seata-all</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>0.9.0</version>
</dependency>
</dependencies>
</dependencyManagement>
业务逻辑执行的时候报下面的错,找不到服务
主要是配置没配好,0.9.0版本的seata跟1.0以后的使用差别还是有点大,详细配置如下
1.下载seata0.9.0,地址:http://seata.io/zh-cn/blog/download.html
2.进入conf目录下,创建seatas数据库,执行脚本和修改file.conf、registry.conf、nacos-config.txt三个文件,创建seata数据库,执行脚本db_store.sql、,对应的业务表下都需要执行db_undo_log.sql,
,
file.conf修改的地方,使用的db方式存储数据,所以后面的要配置数据库的连接
registry.conf修改,注册中心改成nacos
修改nacos-config.txt文件,配置seata的事务组名称等信息
3.比较重要的一点,需要把seata的配置信息注册到nacos上,在conf目录下执行命令 sh nacos-config.sh localhost
在nacos那边也可以看到,4.需要把file.conf和registry.conf文件复制到工程的resources下面,并且在application.yml中配置seata的事务组名称。
还有很重要的一点,在启动类中加入以下代码 ,否则会发现失败了事务却没有回滚,主要是 配置seata 数据源,数据源采用 druid 的DruidDataSource,但实际 jdbcTemplate 执行时并不是用该数据源,而用的是 seata 对DruidDataSource的代理DataSourceProxy,所以,与 RM 相关的代码逻辑基本上都是从DataSourceProxy这个代理数据源开始的。
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource druidDataSource() {
return new DruidDataSource();
}
/**
* 需要将 DataSourceProxy 设置为主数据源,否则事务无法回滚
*/
@Primary
@Bean("dataSource")
public DataSource dataSource(DruidDataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
重新启动工程就OK了