Spring cloud 整合分布式事务Seata

整合Seata之前要先安装好Seata的服务端 可以参考上一章
从Seata的开源地址当中下载相关的案例代码,地址如下:

  • 选择自己熟悉的框架和案例代码,创建一个Maven 父工具,导入代码到IDEA工具当中,具体的代码结构图如下:Spring cloud 整合分布式事务Seata_第1张图片
  • 修改各个核心链路下的各个微服务的file.conf和register.conf文件,和搭的Seata服务端的配置一致,我的配置文件修改如下:
    Spring cloud 整合分布式事务Seata_第2张图片
    register.conf的配置文件如下:
    Spring cloud 整合分布式事务Seata_第3张图片
    pom.xml文件
<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!--mybatis-->
<!--        <dependency>-->
<!--            <groupId>org.mybatis.spring.boot</groupId>-->
<!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--            <version>${mybatis-spring-boot-starter.version}</version>-->
<!--        </dependency>-->
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</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>${seata.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatisplus.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-generator</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>${commons.lang.version}</version>
        </dependency>
    </dependencies>

启动应该程序

先启动服务注册中心(eureka)->再启动Seata服务->订单服务->库存服务->账号服务
在这里插入图片描述
在这里插入图片描述
Spring cloud 整合分布式事务Seata_第4张图片
Spring cloud 整合分布式事务Seata_第5张图片
Spring cloud 整合分布式事务Seata_第6张图片

说明:
1.依赖spring-cloud-alibaba-seata,内部集成了seata,并实现了xid传递
2.数据源代理,如果你的Seata的版本在0.9.0之后,那么数据源代理有二种配置方式
方式一:
1.0.0: client.support.spring.datasource.autoproxy=true
0.9.0: support.spring.datasource.autoproxy=true
方式二:

@Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druidDataSource() {
        DruidDataSource druidDataSource = new DruidDataSource();
        return druidDataSource;
    }
    @Primary
    @Bean("dataSource")
    public DataSourceProxy dataSource(DataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }

3.初始化GlobalTransactionScanner

  • 手动
   public GlobalTransactionScanner globalTransactionScanner() {
           String applicationName = this.applicationContext.getEnvironment().getProperty("spring.application.name");
           String txServiceGroup = this.seataProperties.getTxServiceGroup();
           if (StringUtils.isEmpty(txServiceGroup)) {
               txServiceGroup = applicationName + "-fescar-service-group";
               this.seataProperties.setTxServiceGroup(txServiceGroup);
           }
   
           return new GlobalTransactionScanner(applicationName, txServiceGroup);
       }
 * 自动(提供的项目就是通过引入了spring-cloud-alibaba-seata.jar)
      + 引入seata-spring-boot-starter、spring-cloud-alibaba-seata等jar

4.实现xid跨服务传递

  • 手动 参考源码integration文件夹下的各种rpc实现 module
  • 自动 springCloud用户可以引入spring-cloud-alibaba-seata,内部已经实现xid传递

5.事务分组
事务分组可以作为资源的逻辑隔离单位,去注册中心获得相应的TC服务列表。
seata注册、配置中心分为两类,内置file、第三方注册(配置)中心如nacos等等,注册中心和配置中心之间没有约束,可各自使用不同类型。
6. file注册中心和配置中心

  • 读取配置
    通过FileConfiguration本地加载file.conf的配置参数

7.获取事务分组
spring配置,springboot可配置在yml、properties中,服务启动时加载配置,对应的值"my_test_tx_group"即为一个事务分组名,若不配置,默认获取属性spring.application.name的值+"-fescar-service-group"

8.查找TC集群名
拿到事务分组名"my_test_tx_group"拼接成"service.vgroup_mapping.my_test_tx_group"查找TC集群名clusterName为"default"

9.查询TC服务
拼接"service."+clusterName+".grouplist"找到真实TC服务地址127.0.0.1:8091

具体的客户端在启动过程当中做了哪些操作,后面再补充

你可能感兴趣的:(分布式事务,Spring,Cloud)