乐趣区

关于seata:Seata集成与部署

Seata 装置以及 Spring boot 集成

Seata 应用 docker 装置的形式
官网文档:Seata 部署指南

前提: Nacos 装置胜利,具备 docker 环境

装置的三个角色(GitHub 中的三个目录)

Github 地址: seata/script at 1.4.0 · seata/seata (github.com)

  • client: 能够了解为集成 Seata 的 Spring boot 程序。在 github 中该目录中次要寄存 undo_log.sql 文件和我的项目的配置文件,其中 undo_log.sql 文件次要在业务数据库中执行寄存。
  • config-serverd: 这里能够了解为配置核心,也就时 Nacos。在 github 中该目录次要寄存各种配置核心须要导入的配置,这里以 Nacos 为例子:config.txt时须要导入的配置,nacos-config.shnacos-config.py 是能够将 config.txt 导入 Nacos 的脚本。
  • server:这里了解为 Seata Server 部署的环境。在 github 中该目录中保留的是须要执行的数据库文件。(留神,这些脚本与 undo_log.sql 不同,它们不放在业务数据库中)

Seata Server 部署

建设 MySQL 环境

在数据库中新建 seata 的数据库,并执行一下的 SQL 文件:

seata/mysql.sql at 1.4.0 · seata/seata (github.com)

编写配置文件

  • 获取配置文件

    在 GitHub 中下载 Seat Server Release 文件(这里下载仅仅是为了获取配置文件,对于部署将应用 docker 形式),而后解压文件:

    # 下载文件
    wget -c https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip
    # 解压文件
    unzipseata-server-1.4.2.zip
  • 将配置文件报错到本人定义的目录中

    # 新建目录
    mkdir /home/{user}/seata/config
    # 将配置文件放入到自定义目录中
    cp /home/{user}/seata/seata/seata-server-1.4.2/config/file.conf /home/{user}/seata/config
    cp /home/{user}/seata/seata/seata-server-1.4.2/config/registry.conf /home/{user}/seata/config
  • 批改配置文件 file.conf

    # transaction log store, only used in seata-server
    store {
      ## store mode: file、db、redis, 
      mode = "db" # 这里批改为 db
      ## rsa decryption public key
      publicKey = ""
      ......
    ## database store property 在这里欠缺 Seata 将应用的数据库相干属性
      db {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
        datasource = "druid"
        ## mysql/oracle/postgresql/h2/oceanbase etc.
        dbType = "mysql" # 示意应用 mysql 数据库
        driverClassName = "com.mysql.cj.jdbc.Driver" 
        ## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
        url = "jdbc:mysql://192.168.1.1:3306/seata?rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false"
        user = "root"
        password = "root"
        minConn = 5
        maxConn = 100
        globalTable = "global_table"
        branchTable = "branch_table"
        lockTable = "lock_table"
        queryLimit = 100
        maxWait = 5000
      }
      ......
    }
  • 批改配置的 registry.conf 文件

    registry {
      # file、nacos、eureka、redis、zk、consul、etcd3、sofa
      type = "nacos" # 因为应用的配置核心是 Nacos,所以这里抉择 nacos
    
      # 这里填写 nacos 的相干属性
      nacos {
        application = "seata-server"
        serverAddr = "192.168.1.1:8848"
        group = "SEATA_GROUP"
        namespace = ""cluster ="default"username ="nacos"password ="nacos"
      }
      ......
    }
    config {
      # file、nacos、apollo、zk、consul、etcd3
      type = "file"
      ......
      file {
          # 这里说名一下,因为应用 docker 部署的话没有命令间接配置 file.conf
          # 文件,因而间接在 registry.conf 里生命 file.conf 文件的地位
          #(这里 file.conf 的地位是在 docker 容器内的地位,# 在执行 docker 名令时会将理论的自定义配置文件目录与 docker 环境中的目录进行映射)name = "file:/root/seata-config/file.conf"
      }
    }

在 Nacos 中增加 Seata 相干配置

  • 批改 config.txt 文件

    transport.type=TCP
    transport.server=NIO
    transport.heartbeat=true
    transport.enableClientBatchSendRequest=false
    transport.threadFactory.bossThreadPrefix=NettyBoss
    transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
    transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
    transport.threadFactory.shareBossWorker=false
    transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
    transport.threadFactory.clientSelectorThreadSize=1
    transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
    transport.threadFactory.bossThreadSize=1
    transport.threadFactory.workerThreadSize=default
    transport.shutdown.wait=3
    # 批改下一行,记住批改的东东,前面要用
    # service.vgroupMapping.my_test_tx_group=default
    service.vgroupMapping.default_tx_group=default
    # 这里须要批改为 Seata 的网络拜访地址
    # service.default.grouplist=127.0.0.1:8091
    service.default.grouplist=192.168.1.1:8091
    service.enableDegrade=false
    service.disableGlobalTransaction=false
    client.rm.asyncCommitBufferLimit=10000
    client.rm.lock.retryInterval=10
    client.rm.lock.retryTimes=30
    client.rm.lock.retryPolicyBranchRollbackOnConflict=true
    client.rm.reportRetryCount=5
    client.rm.tableMetaCheckEnable=false
    client.rm.sqlParserType=druid
    client.rm.reportSuccessEnable=false
    client.rm.sagaBranchRegisterEnable=false
    client.tm.commitRetryCount=5
    client.tm.rollbackRetryCount=5
    client.tm.defaultGlobalTransactionTimeout=60000
    client.tm.degradeCheck=false
    client.tm.degradeCheckAllowTimes=10
    client.tm.degradeCheckPeriod=2000
    # 这里须要批改成 db
    # store.mode=file
    store.mode=db
    store.file.dir=file_store/data
    store.file.maxBranchSessionSize=16384
    store.file.maxGlobalSessionSize=512
    store.file.fileWriteBufferCacheSize=16384
    store.file.flushDiskMode=async
    store.file.sessionReloadReadSize=100
    # 接下来批改为本人数据库的信息
    store.db.datasource=druid
    store.db.dbType=mysql
    store.db.driverClassName=com.mysql.cj.jdbc.Driver
    store.db.url=jdbc:mysql://192.168.1.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
    store.db.user=root
    store.db.password=root
    store.db.minConn=5
    store.db.maxConn=30
    store.db.globalTable=global_table
    store.db.branchTable=branch_table
    store.db.queryLimit=100
    store.db.lockTable=lock_table
    store.db.maxWait=5000
    store.redis.host=127.0.0.1
    store.redis.port=6379
    store.redis.maxConn=10
    store.redis.minConn=1
    store.redis.database=0
    store.redis.password=null
    store.redis.queryLimit=100
    server.recovery.committingRetryPeriod=1000
    server.recovery.asynCommittingRetryPeriod=1000
    server.recovery.rollbackingRetryPeriod=1000
    server.recovery.timeoutRetryPeriod=1000
    server.maxCommitRetryTimeout=-1
    server.maxRollbackRetryTimeout=-1
    server.rollbackRetryTimeoutUnlockEnable=false
    client.undo.dataValidation=true
    client.undo.logSerialization=jackson
    client.undo.onlyCareUpdateColumns=true
    server.undo.logSaveDays=7
    server.undo.logDeletePeriod=86400000
    client.undo.logTable=undo_log
    client.log.exceptionRate=100
    transport.serialization=seata
    transport.compressor=none
    metrics.enabled=false
    metrics.registryType=compact
    metrics.exporterList=prometheus
    metrics.exporterPrometheusPort=9898
  • 将配置文件上传到 Nacos 配置核心中

    # 获取 nacos-config.sh 文件: https://github.com/seata/seata/blob/1.4.0/script/config-center/nacos/nacos-config.sh
    # 为文件授予执行权限
    sudo chmod +x nacos-config.sh
    # 执行下述命令, 其中 - u 后是 nacos 的用户名, - w 是 nacos 的明码
    ./nacos-config.sh -h 192.168.1.1 -p 8848 -g SEATA_GROUP -u nacos -w nacos

docker 启动 Seata Server 环境

docker run --name seata-server -p 8091:8091 -e SEATA_IP=192.168.1.1 -e STORE_MODE=db -e SEATA_CONFIG_NAME=file:/root/seata-config/registry -v /home/{user}/seate/config:/root/seata-config -d seataio/seata-server:1.4.2

其中 SEATA_CONFIG_NAME获取的是 docker 容器中 registry.conf 配置文件的地位

-v /home/{user}/seate/config:/root/seata-config是将本地的 /home/{user}/seate/config 的目录挂载到 /root/seata-config 目录中。

Spring Boot 集成 Seata 环境

前提: 数据库和 Mybatis plus 曾经集成上了,我的项目独自可能失常的运行。

业务数据库建表

-- for AT mode you must to init this sql for you business database. the seata server not need it.
CREATE TABLE IF NOT EXISTS `undo_log`
(`branch_id`     BIGINT(20)   NOT NULL COMMENT 'branch transaction id',
    `xid`           VARCHAR(100) NOT NULL COMMENT 'global transaction id',
    `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
    `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
    `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
    `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
    `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
    UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

援用 pom 依赖

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>${seata-boot.version}</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>${seata-cloud.version}</version>
    <exclusions>
        <exclusion>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
        </exclusion>
    </exclusions>
</dependency>

yml 配置文件


## seata 配置
seata:
  enabled: true
  application-id: ${spring.application.name}
  # 上面这个须要跟刚刚 config.txt 上传到 nacos 配置核心的雷同
  # config.txt 中:service.vgroupMapping.default_tx_group=default(本人看,本人了解)tx-service-group: default_tx_group 
  # 这里开启主动的数据源配置,否则后秒要本人手动配置
  enable-auto-data-source-proxy: true
  data-source-proxy-mode: AT
  use-jdk-proxy: false
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.1.1:8848
      group : "SEATA_GROUP"
      namespace: ""username:"nacos"password:"nacos"
  config:
    type: nacos
    nacos:
      server-addr: 192.168.1.1:8848
      namespace: ""group:"SEATA_GROUP"username:"nacos"password:"nacos"
  log:
    exception-rate: 100
  tcc-fence:
    enable: true
    config:
      log-table-name: tcc_fence_log
      clean-mode: hour
      clean-period: 1
退出移动版