Seata1.3+nacos+mysql8.x整合


Seata1.3+nacos+mysql8.x整合配置

1.先確定Seata版本

  • spring-cloud-alibaba使用2.2.1.RELEASE版
  • seata使用1.3版本,包括seata服務端(就是seata-server)、使用seata的各種微服務端(后面統稱seata客戶端),都使用1.3版本

2.下載Seata1.3版本的源碼和Server版

  1. https://github.com/seata/seata/releases/download/v1.3.0/seata-server-1.3.0.zip
  2. https://github.com/seata/seata/archive/v1.3.0.zip
  3. 兩個文件解壓到不含有中文、沒有空格的路徑下(如果有空格會在后面配置推送到nacos報錯)

3.配置Seata服務端的mysql數據庫

  1. 先去mysql創建數據庫seata
  2. 去源碼目錄/script/server/db找到mysql.sql,在seata數據庫下執行
  3. 執行成功,可以看到多出了3張表image-20201005151921677

4.配置Seata服務端的配置列表

  1. 到源碼目錄/script/config-center中配置config.txt

  2. config.txt列表很長,都是默認配置,不需要全部保留,只保留修改項即可。我們是用mysql進行數據存儲,所以可以保留如下配置。注意:筆者下面文件的注釋是方便讀者理解的,實際上不能保留,自己配置的時候請刪除(否則后面推送到nacos會報錯)。

    # 【重要】my_test_tx_group這個事務分組所使用的seata-server的集群名稱,要與后面seata-server中registry.conf的registry.nacos.cluster保持一致
    service.vgroupMapping.my_test_tx_group=testCluster
    # 使用db存儲
    store.mode=db
    store.db.datasource=druid
    store.db.dbType=mysql
    # 因為是mysql8.x版本,驅動位置發生了改變(有了.cj)
    store.db.driverClassName=com.mysql.cj.jdbc.Driver
    # mysql8.x版本serverTimezone需要按照下面設定(否則會報serverTimezone錯誤,一堆亂碼)。另外 這個屬性在推送到nacos之后參數可能會消失,需要手動修改以下
    store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&serverTimezone=GMT%2B8
    store.db.user=root
    store.db.password=root
    
  3. 到源碼目錄/script/config-center/nacos目錄下,執行nacos-config.sh腳本(此命令依賴於git,可能需要讀者自己安裝)

    sh nacos-config sh -h nacos的Ip地址 -p nacos的端口號 -u nacos用戶名 -w nacos密碼 -g 本配置列表的所屬分組(要與后面seata服務端config.nacos.group保持一致,默認為SEATA_GROUP)
    

    例如筆者命令為

    sh nacos-config sh -h localhost -p 1111 -u nacos -w nacos -g SEATA_GROUP
    

    推送之后,可以查看nacos的配置列表image-20201005160648140

    另外需要查看store.db.url中參數是否丟失,如果丟失要重新配置一下

5.配置Seata服務端並啟動

  1. 到seata-server目錄/conf/

  2. 配置registry.conf

    # 注冊中心
    registry {
      # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
      # 如果是file,則需要配置file.conf
      # 因為本例使用nacos,此處填寫nacos
      type = "nacos"
    
      # 【重要】此處是nacos中的服務注冊配置
      nacos {
      	# 【重要】本服務端在nacos中的微服務名稱,后面seata客戶端的application.yml中要用到
        application = "seata-server"
        # nacos地址(默認為8848,筆者此處做了負載均衡改了端口)
        serverAddr = "localhost:1111"
        # seata-server微服務的分組
        group = "SEATA_GROUP"
        # seata-server微服務的命名空間,此處省略,使用默認值public
        namespace = ""
        # 【重要】seata-server作為集群時的集群名字,與前面nacos中設定事務分組屬性(service.vgroupMapping.my_test_tx_group)保持一致
        cluster = "testCluster"
        # nacos1.2加入了鑒權,賬號密碼不可省略
        username = "nacos"
        password = "nacos"
      }
    }
    
    # 配置中心
    config {
      # file、nacos 、apollo、zk、consul、etcd3
      # 因為本例使用nacos,此處填寫nacos
      type = "nacos"
    
      nacos {
        serverAddr = "localhost:1111"
        namespace = ""
        # 【重要】本服務端的配置在nacos配置列表哪個分組下,要與上面推送到nacos的分組列表保持一致,默認是SEATA_GROUP。
        group = "SEATA_GROUP"
        username = "nacos"
        password = "nacos"
      }
    }
    
  3. 因為服務注冊和服務配置都是使用的nacos,所以讀者這里並不需要file.conf中的任何屬性,自然也不需要改動。后面需要修改配置直接在nacos中修改,SEATA_GROUP分組。

  4. 切換到/bin/文件夾下,准備啟動seata服務端,命令如下

    .\seata-server.bat -p 要使用的端口號
    

    筆者默認8091端口被占用了,所以使用了8093端口,命令如下

    .\seata-server.bat -p 8093
    
  5. 沒有報錯,則去查看nacos服務列表image-20201005161621306

    並且也要確認集群名稱是否正確image-20201005161750532

6.配置Seata客戶端並啟動

  1. 引入POM依賴,因為spring-cloud-starter-alibaba-seata集成的1.1版本的seata,所以需要排除之后引入1.3版本的。筆者此處只寫了spring-cloud-alibaba下的seata的依賴,其余依賴請讀者自己配置。

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        <exclusions>
            <exclusion>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-spring-boot-starter</artifactId>
        <version>1.3.0</version>
    </dependency>
    
  2. 配置application.yml。同樣筆者只寫了seata配置,其余配置請讀者自己寫。

    seata:
      # 開啟自動裝配
      enabled: true
      # 本客戶端的微服務名稱
      application-id: seata-order-service
      # 讀取哪個事務分組
      # 例如此時會讀取 SEATA_GROUP 這個分組下的 service.vgroupMapping.my_test_tx_group 這個屬性的值。從上面的配置可以知道筆者此處的最終值為 testCluster。后面程序運行會找到 testCluster 這個集群的seata服務端,進行通訊。
      tx-service-group: my_test_tx_group
      # 配置中心設置
      config:
        type: nacos
        nacos:
          username: nacos
          password: nacos
          server-addr: localhost:1111
          # 讀取的配置分組
          group: SEATA_GROUP
      # 注冊中心設置
      registry:
        type: nacos
        nacos:
          # SEATA服務中心的微服務名,此處與服務端保持一致
          application: seata-server
          server-addr: localhost:1111
          username: nacos
          password: nacos
    
  3. 因為筆者的seata客戶端配置也是使用的nacos,所以項目中並不需要file.conf這個文件。后面需要修改配置直接在nacos中修改,SEATA_GROUP分組。

  4. 增加seata代理數據源的配置

    1. 添加DataSourceProxyConfig類

      package com.zhoushiya.springcloud.alibaba.config;
      
      import com.alibaba.druid.pool.DruidDataSource;
      import io.seata.rm.datasource.DataSourceProxy;
      import org.apache.ibatis.session.SqlSessionFactory;
      import org.mybatis.spring.SqlSessionFactoryBean;
      import org.mybatis.spring.transaction.SpringManagedTransactionFactory;
      import org.springframework.beans.factory.annotation.Value;
      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;
      
      import javax.sql.DataSource;
      
      
      /**
       * 使用seata對數據源進行代理
       * @author zhoushiya
       * @date 2020/10/4 16:12
       */
      @Configuration
      public class DataSourceProxyConfig {
      
          // mybatis的mapper文件夾地址
          @Value("${mybatis.mapper-locations}")
          private String mapperLocations;
      
          @Bean
          @ConfigurationProperties(prefix = "spring.datasource.druid")
          public DataSource druidDataSource() {
              DruidDataSource druidDataSource = new DruidDataSource();
              return druidDataSource;
          }
      
          @Bean
          public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
              SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
              factoryBean.setDataSource(dataSource);
              factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                      .getResources(mapperLocations));
              return factoryBean.getObject();
          }
      }
      
    2. 修改主啟動類

      @EnableDiscoveryClient
      @EnableFeignClients
      // 取消數據源的自動創建,使用Seata對數據源進行代理
      @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
      // 導入自定義數據源配置
      @Import({DataSourceProxyConfig.class})
      public class OrderServiceMain2001 {
          public static void main(String[] args) {
              SpringApplication.run(OrderServiceMain2001.class,args);
          }
      }
      
  5. 啟動seata客戶端,檢查狀態是否成功

    1. 控制台輸出連上服務端image-20201005165520969

    2. seata服務端顯示已連上image-20201005165620467

    3. nacos中服務已注冊image-20201005165710293


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM