springcloud+springcloud alibaba+springboot+Nacos+Seata+Mybatis+Redis开发框架

最近在使用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了

猜你喜欢

转载自blog.csdn.net/dhj199181/article/details/108467202