seataチュートリアル-seata 1.0バージョン統合チュートリアル


seata 1.0チュートリアル
テクノロジーの選択とバージョン
spring-cloud-starter-alibaba-seata
spring-cloud-alibaba:1.5.1.RELEASE
springcloud:Edgware.SR4
seata-all:1.0.0
springboot:1.5.4
mybatis-spring-boot-starter.version:2.0.0
java:jdk8
1.seata serverの起動
ダウンロード:https://github.com/seata/seata/releases
解凍:tar-xzvf seata-server-1.0.0.tar.gz
構成の変更:
1.registryを構成する.conf
[root@jr-test conf]# cat registry.conf 
//    
registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka" //      

  nacos {
    serverAddr = "localhost"
    namespace = ""
    cluster = "default"
  }
  eureka {
    serviceUrl = "http://192.xx.xx.xx:8761/eureka" //      
    application = "seata-server" //tc      
    weight = "1"
  }
  //......    
}
//    
config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "file" //      
  file {
    name = "file.conf" //
  }
  //......    
}


2.fileを構成する.conf
[root@jr-test conf]# cat file.conf
service {
  #transaction service group mapping
  vgroup_mapping.fsp_tx_group = "fsp-tx"  //    ,    ,client tc     ,fsp_tx_group          
  #only support when registry.type=file, please don't set multiple addresses
  default.grouplist = "127.0.0.1:8091"
  #disable seata
  disableGlobalTransaction = false
}

## transaction log store, only used in seata-server
store {
  ## store mode: file、db
  mode = "db" //        

  ## file store property
  file {
    ## store location dir
    dir = "sessionStore"
  }

  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
    datasource = "dbcp"
    ## mysql/oracle/h2/oceanbase etc.
    db-type = "mysql"
    driver-class-name = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://192.xx.xx.xx:3306/seata" // tc    ,      ,    
    user = "root"
    password = "xxx"
  }
}

3.建表
グローバル・トランザクション・セッション情報は、次の3つのブロックで構成されます.
  • グローバルトランザクションglobal_table
  • ブランチトランザクションbranch_table
  • グローバルロックlock_table

  • テーブル文は次のとおりです.https://github.com/seata/seata/tree/develop/script/server/db
    4.tcを起動する
    binディレクトリの下:
    nohup sh seata-server.sh -h xx.xx.xx.xx -p 8091 -m db -n 1 &
    

    ここではnohup方式でバックグラウンドで起動し、パラメータはオプションです.
    -h:登録センターに登録されているip
    -p:Server rpcリスニングポート
    -m:グローバルトランザクションセッション情報格納モード、file、db、起動パラメータの優先読み出し
    -n:Servernode,複数のServernodeの場合,競合を回避するために異なる区間のtransactionIdを生成するために,それぞれのノードを区別する必要がある.
    -e:マルチ環境構成リファレンスhttp://seata.io/en-us/docs/ops/multi-configuration-isolation.html
    2.clientエンド導入seata依存
    現在、3つの方法があり、対応するサポートの程度は異なります.
    に頼る
    yml構成のサポート
    xid転送を実現
    データ・ソースの自動エージェントのサポート
    GlobalTransactionScannerエントリの自動初期化
    seata-all
    いいえ
    いいえ
    はい
    いいえ
    seata-spring-boot-starter
    はい
    いいえ
    はい
    はい
    spring-cloud-alibaba-seata
    いいえ
    はい
    はい
    はい
    ユーザーがseata-allだけを導入することをお勧めしません.自分で実現する必要があるものが多すぎます.
    Spring-cloud-aliba-seata,2.1.0埋め込みseata-all 0.7.1,2.1.1埋め込みseata-all 0.9.0.除外して1.0を導入することをお勧めします.
    (公式文書を参照:http://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html)
    ここではspring‐cloud‐alibaba‐seata依存の導入を例に挙げ,以下ではseataに関連する依存のみを示す.
    	<properties>
    		<spring-cloud.version>Edgware.SR4</spring-cloud.version>
    		<spring-cloud-alibaba.version>1.5.1.RELEASE</spring-cloud-alibaba.version>
    		<seata-version>1.0.0</seata-version>
    	</properties>
    	<dependencies>
    		<!--seata-all-->
    		<dependency>
    			<groupId>io.seata</groupId>
    			<artifactId>seata-all</artifactId>
    			<version>${seata-version}</version>
    		</dependency>
    		<!--sca-seata-->
    		<dependency>
    			<groupId>com.alibaba.cloud</groupId>
    			<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    		</dependency>
    	</dependencies>
    
    	<dependencyManagement>
    		<dependencies>
    			<!--Spring Cloud-->
    			<dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-dependencies</artifactId>
    				<version>${spring-cloud.version}</version>
    				<type>pom</type>
    				<scope>import</scope>
    			</dependency>
    			<!--Spring Cloud Alibaba,  seata-all 0.9,1.0-->
    			<dependency>
    				<groupId>com.alibaba.cloud</groupId>
    				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
    				<version>${spring-cloud-alibaba.version}</version>
    				<type>pom</type>
    				<scope>import</scope>
    				<exclusions>
    					<exclusion>
    						<artifactId>seata-all</artifactId>
    						<groupId>io.seata</groupId>
    					</exclusion>
    				</exclusions>
    			</dependency>
    		</dependencies>
    	</dependencyManagement>
    

    3.client側導入プロファイル
    seata server側とclient側のスクリプトと構成は、ここにまとめられており、client側が統合された場合、対応するファイルを探してコピーして修正します.
    https://github.com/seata/seata/tree/develop/script
    1.bootstrapを修正する.yml
    トランザクション・グループの追加
    spring:
      cloud:
        alibaba:
          seata:
            tx-service-group: fsp_tx_group
    

    このパケット名はカスタマイズされていますが、seata server側、client側は一貫性を保つ必要があります.
    2.fileを構成する.conf
    コンフィギュレーションファイルを導入し、関連するコンフィギュレーションを変更します.多くのコンフィギュレーション項目があるため、すべてを変更する必要はありません.ここでは少数を変更するだけで、先に統合して走ることができます.他のパラメータは後で自分で調整します.
    file.conf
    //    
    service {
      #transaction service group mapping
      vgroup_mapping.default = "default"
      #only support when registry.type=file, please don't set multiple addresses
      default.grouplist = "127.0.0.1:8091"
      #degrade, current not support
      enableDegrade = false
      #disable seata
      disableGlobalTransaction = false
    }
    client {
        //    
      rm {
        report.success.enable = true //          tc,          
      }
      support {
        # auto proxy the DataSource bean //       
        spring.datasource.autoproxy = false
      }
    }
    
    

    3.registryを構成する.conf
    登録センターと配置センターは、いずれも多種をサポートし、自分の技術に従って型を選んで、対応する配置を修正します.
    registry {
      # file 、nacos 、eureka、redis、zk
      type = "eureka"
      eureka {
        serviceUrl = "http://192.xx.xx.xx:8761/eureka"
        application = "default" 
        weight = "1"
      }
        //  
    }
    
    config {
      # file、nacos 、apollo、zk
      type = "file"
      file {
        name = "file.conf"
      }
        //  
    }
    
    

    4.データソースエージェントの構成
    自動エージェントがサポートされている場合は、構成をオンにします.ここではmysqlとmybatisを使用する場合、データソースを独自にエージェントする方法を示します.
    package io.seata.sample;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import io.seata.rm.datasource.DataSourceProxy;
    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    
    /**
     *      
     * @author IT  
     */
    @Configuration
    public class DataSourceConfiguration {
    
        @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);
        }
    
        @Bean
        public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSourceProxy);
            sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources("classpath*:/mapper/*.xml"));
            sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
            return sqlSessionFactoryBean.getObject();
        }
    }
    
    

    5.xid伝達の実現
    依存性やテクノロジーの選択が導入され、xid伝達などの論理が実現されていない場合は、ソースコードintegrationフォルダの下にあるさまざまなrpcを参照してmoduleを実現する必要があります.
    https://github.com/seata/seata/tree/develop/integration
    6.scanner入口の実現
    依存とテクノロジーの選択を導入した場合、GlobalTransactionScannerロジックの初期化が実現されていない場合は、以下のように実現できます.
    1.SeataProperties.java
    @ConfigurationProperties("spring.cloud.alibaba.seata")
    public class SeataProperties {
        private String txServiceGroup;
        public SeataProperties() {
        }
        public String getTxServiceGroup() {
            return this.txServiceGroup;
        }
        public void setTxServiceGroup(String txServiceGroup) {
            this.txServiceGroup = txServiceGroup;
        }
    }
    

    2.GlobalTransactionScannerの初期化
    package com.runlion.fsp.credit.seata.config;
    
    import com.runlion.fsp.credit.seata.SeataProperties;
    import io.seata.spring.annotation.GlobalTransactionScanner;
    import org.apache.commons.lang.StringUtils;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author IT  
     */
    @Configuration
    @EnableConfigurationProperties({SeataProperties.class})
    public class GlobalTransactionAutoConfiguration {
        private static final String APPLICATION_NAME_PREFIX = "spring.application.name";
        private static final String DEFAULT_TX_SERVICE_GROUP_SUFFIX = "-seata-service-group";
        private final ApplicationContext applicationContext;
        private final SeataProperties seataProperties;
        public GlobalTransactionAutoConfiguration(
                ApplicationContext applicationContext,
                SeataProperties seataProperties) {
            this.applicationContext = applicationContext;
            this.seataProperties = seataProperties;
        }
    
        /**
         * If there is no txServiceGroup,use the default
         * @return GlobalTransactionScanner the entrance
         */
        @Bean
        public GlobalTransactionScanner globalTransactionScanner(){
            String applicationName = this.applicationContext.getEnvironment().getProperty(APPLICATION_NAME_PREFIX);
            String txServiceGroup = seataProperties.getTxServiceGroup();
            if(StringUtils.isEmpty(txServiceGroup)){
                txServiceGroup = applicationName + DEFAULT_TX_SERVICE_GROUP_SUFFIX;
                this.seataProperties.setTxServiceGroup(txServiceGroup);
            }
            return new GlobalTransactionScanner(applicationName,txServiceGroup);
        }
    }
    
    

    7.建設表
    seata分散トランザクションを使用する場合は、現在のサービスでundologテーブルを作成する必要があります.
    構築文の参照:https://github.com/seata/seata/tree/develop/script/client/at/db
    8.使用
  • 1.@GlobalTransactionグローバルトランザクション注記
  • 2.@GlobalLockは、汚れた読み取りや書き込みを防止し、グローバルトランザクション管理に組み込まれたくない場合に使用します.(rpcやxid伝達などのコストは不要)