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.sh
或nacos-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