Spring cloud 整合分佈式事務Seata

整合Seata之前要先安裝好Seata的服務端 可以參考上一章
從Seata的開源地址當中下載相關的案例代碼,地址如下:

  • 選擇自己熟悉的框架和案例代碼,創建一個Maven 父工具,導入代碼到IDEA工具當中,具體的代碼結構圖如下:在這裏插入圖片描述
  • 修改各個核心鏈路下的各個微服務的file.conf和register.conf文件,和搭的Seata服務端的配置一致,我的配置文件修改如下:
    file.conf
    register.conf的配置文件如下:
    在這裏插入圖片描述
    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服務->訂單服務->庫存服務->賬號服務
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

說明:
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

具體的客戶端在啓動過程當中做了哪些操作,後面再補充

發佈了25 篇原創文章 · 獲贊 0 · 訪問量 7807
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章