1.下载seata
下载地址:https://github.com/seata/seata/releases
如图,可选择对应版本进行下载。需要注意的是,我们需要下载两个内容
server.zip
seata服务端,需要进行对应的配置修改以及服务端启动
- bin:用于存放 Seata Server 可执行命令。
- conf:用于存放 Seata Server 的配置文件。
- lib:用于存放 Seata Server 依赖的各种 Jar 包。
- logs:用于存放 Seata Server 的日志。
source code
seata源码,需要获取script\config-center\config.txt配置文件内的内容,进行配置文件上传,以便seata整合第三方配置中心例如nacos等
2.seata配置中心
为什么需要配置中心
对于seata的服务端以及客户端来说,都需要进行一些参数配置。
而对于这些配置的存储,seata提供了6种方案支持。具体可通过查看sertver.zip下seata\conf\registry.conf文件中的config项进行查看
如图,默认为file类型,然而在具体使用中,我们通常会使用第三方配置中心来存储seata的配置,因为毕竟本地文件的存储形式不利于实时配置,配置性太弱,无法应对各种突发情况整合nacos
配置上传到nacos
seata提供了很多配置参数,具体参考这里。因为需要整合第三方配置中心,所以我们需要先将参数上传到对应的配置中心。seata为我们提供了配置上传的方式
- 打开source code\script\config-center\config.txt文件,里面包括了seata所需的所有参数,我们可以根据具体业务情况进行删减,以DB作为存储模式的配置文件如下,需要注意的是,如果连接的mysql版本低于8.0.0,需要将driverClassName改为com.mysql.jdbc.Driver ``` store.mode=db
store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.cj.jdbc.Driver store.db.url=jdbc:mysql://8.142.132.135:3306/seata_test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true 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
2. 在source code\script\config-center\nacos目录下,右键打开git bush here3. git命令行输入如下命令```shellsh nacos-config.sh -h 8.142.132.135 -p 8848 -g SEATA_GROUP -u nacos -w nacos
- -h:Nacos 的 host,默认取值为 localhost
- -p:端口号,默认取值为 8848
- -g:Nacos 配置的分组,默认取值为 SEATA_GROUP
- -u:Nacos 用户名
- -w:Nacos 密码
- 出现如图所示,代表配置上传成功

- nacos查看,配置已上传成功
seata服务端
配置已经上传到了nacos,接下来需要配置seata服务端,改为nacos作为配置中心
修改配置文件sertver.zip下seata\conf\registry.conf文件中的config项
config {type = "nacos"nacos {serverAddr = "8.142.132.135:8848"namespace = ""group = "SEATA_GROUP"username = "nacos"password = "nacos"dataId = "seataServer.properties"}}
seata客户端
配置已经上传到了nacos,接下来需要配置seata客户端,改为nacos作为配置中心
添加pom文件
<!--引入 seata 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
yml文件添加如下配置,通常来说客户端配置与服务端配置是一致的
seata:config:type: nacosnacos:server-addr: 8.142.132.135:8848group : "SEATA_GROUP"namespace: ""username: "nacos"password: "nacos"
3.seata注册中心
为什么需要注册中心
因为在具体seata分布式事务的执行过程中,RM(参与事务的微服务)需要接收TC(seata服务端)发出的调度指令,并且TC也需要获取RM的反馈。那么TC也需要将自己的服务信息注册到注册中心上,才方便上述机制的实现
对于配置中心,seata支持8种方案,具体可通过查看sertver.zip下seata\conf\registry.conf文件中的registry项进行查看。
如图,默认为file。在实际应用中,通常需要结合第三方注册中心来实现整合nacos
seata服务端
修改配置文件sertver.zip下seata\conf\registry.conf文件中的registry项
registry {type = "nacos"nacos {application = "seata-server"serverAddr = "8.142.132.135:8848"group = "SEATA_GROUP"namespace = ""cluster = "default"username = "nacos"password = "nacos"}}
seata客户端
添加pom文件
<!--引入 seata 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
yml文件添加如下配置,客户端配置与服务端配置必须一致,不然找不到对应服务。注意其中的application项,必须与服务端保持一致
seata:registry:type: nacosnacos:application: seata-serverserver-addr: 8.142.132.135:8848group : "SEATA_GROUP"namespace: ""username: "nacos"password: "nacos"
4.Seata事务分组
为什么需要事务分组
事务分组是 Seata 提供的一种 TC(Seata Server) 服务查找机制。具体参考这里
因为seata服务端是需要依赖于注册中心去运行的,因此对于seata服务端来说,需要一个服务名声明自己的服务
而事务分组在服务名上又多加了一个层级,这样设计后,事务分组可以作为资源的逻辑隔离单位,出现某集群故障时可以快速failover,只切换对应分组,可以把故障缩减到服务级别客户端查找TC集群原理
通过事务分组获取服务名,共需要以下 3 步:
客户端服务启动时,从配置文件中获取服务分组的名称;
- 从配置中心,通过事务分组名获取 TC 集群名;
根据 TC 群组名以及其他信息构建服务名,获取真实的 TC 服务列表。
事务分组架构理解
操作步骤
定义事务分组以及应用集群名称配置
在source code\script\config-center\config.txt文件中,输入如下内容
如下图,指定了service-order-group、service-item-group3个分组对应的集群名为store-seataservice.vgroupMapping.service-order-group=store-seataservice.vgroupMapping.service-item-group=store-seataservice.vgroupMapping.service-account-group=store-seata
上传配置到nacos配置中心
seata服务端声明服务集群名称
修改配置文件sertver.zip下seata\conf\registry.conf文件中的registry.cluster字段
registry {type = "nacos"nacos {application = "seata-server"serverAddr = "8.142.132.135:8848"group = "SEATA_GROUP"namespace = ""cluster = "store-seata"username = "nacos"password = "nacos"}}
seata客户端声明事务分组
添加pom文件
<!--引入 seata 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
yml文件添加如下配置,客户端配置与服务端配置必须一致,不然找不到对应服务
spring:cloud:alibaba:seata:tx-service-group: service-order-group
5.启动seata server/client的前提
在上述阶段,我们完成了以下步骤
seata server相关配置上传到配置中心
- seata server配置中心配置
- seata server注册中心配置
- 声明了事务分组与集群名称的对应关系
- seata server配置集群名称
接下来就需要启动seata server了,启动seata server,我们还需要在对应的存储中心创建相关存储结构,通常来讲以数据库为例
打开README文件
文件路径:seata.zip\conf\README-zh.md
其中第1项即为seata server保存模式为DB时,客户端启动所需的建表语句
其中第2项即为seata server保存模式为DB时,服务端启动所需的建表语句
客户端启动sql文件
-- 回滚日志表CREATE TABLE IF NOT EXISTS `undo_log`(`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',`xid` VARCHAR(128) 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 = utf8mb4 COMMENT ='AT transaction mode undo table';
服务端启动sql文件
-- 全局事务表CREATE TABLE IF NOT EXISTS `global_table`(`xid` VARCHAR(128) NOT NULL,`transaction_id` BIGINT,`status` TINYINT NOT NULL,`application_id` VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name` VARCHAR(128),`timeout` INT,`begin_time` BIGINT,`application_data` VARCHAR(2000),`gmt_create` DATETIME,`gmt_modified` DATETIME,PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;-- 分支事务表CREATE TABLE IF NOT EXISTS `branch_table`(`branch_id` BIGINT NOT NULL,`xid` VARCHAR(128) NOT NULL,`transaction_id` BIGINT,`resource_group_id` VARCHAR(32),`resource_id` VARCHAR(256),`branch_type` VARCHAR(8),`status` TINYINT,`client_id` VARCHAR(64),`application_data` VARCHAR(2000),`gmt_create` DATETIME(6),`gmt_modified` DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;-- 全局锁表CREATE TABLE IF NOT EXISTS `lock_table`(`row_key` VARCHAR(128) NOT NULL,`xid` VARCHAR(128),`transaction_id` BIGINT,`branch_id` BIGINT NOT NULL,`resource_id` VARCHAR(256),`table_name` VARCHAR(32),`pk` VARCHAR(36),`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create` DATETIME,`gmt_modified` DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;-- 分布式锁表CREATE TABLE IF NOT EXISTS `distributed_lock`(`lock_key` CHAR(20) NOT NULL,`lock_value` VARCHAR(20) NOT NULL,`expire` BIGINT,primary key (`lock_key`)) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
6.seata server启动
以下两种情况都是基于按步骤走完以上流程的情况下去部署的!!!!!!!!!
windows
经过配置上传,修改配置中心,修改注册中心,修改集群名称,建立sql表以后,seata server就可以运行了
进入server.zip/bin目录下,运行seata-server.bat即可
如图,seata服务端启动成功,默认端口8091
linux
新建文件夹
- cd /data
- mkdir seata
-
下载对应jar包,具体下载参考标题1
参考:wget https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.tar.gz
解压缩
tar -zxvf seata-server-1.4.2.tar.gz
- rm -rf seata-server-1.4.2.tar.gz
- mkdir logs
- ls
修改配置文件
执行如下命令:vim seata-server-1.4.2/conf/registry.conf
输入如下内容,具体参考上述2,3标题
config {type = "nacos"nacos {serverAddr = "8.142.132.135:8848"namespace = ""group = "SEATA_GROUP"username = "nacos"password = "nacos"dataId = "seataServer.properties"}}registry {type = "nacos"nacos {application = "linux-seata-server"serverAddr = "8.142.132.135:8848"group = "SEATA_GROUP"namespace = ""cluster = "default"username = "nacos"password = "nacos"}}
内存不足情况下修改sh文件
seata-server服务器启动的默认虚拟机参数对内存要求是比较高的。有时候我们的服务器内存不足,这时候需要我们去修改启动.sh文件
执行如下命令:vim /data/seata/seata-server-1.4.2/bin/seata-server.sh
之后修改如下部分内容
编写supervisor文件管理seata-server进程
执行如下命令:touch /etc/supervisord.d/seata-server.ini
文件内容如下
[program:seata-server]directory=/data/seata/seata-server-1.4.2/bincommand=sh seata-server.sh -h 8.142.132.135 -p 8091 -m dbautorestart=trueredirect_stderr=truestdout_logfile=/data/seata/logs/seata-server.log
其中包括以下几点
- sh命令后面,如果说具体项目部署不是在内网的话,-h参数一定要是外网IP!!!!!!!。不然项目启动后,无法连接到内网IP。
- 最好指定日志文件路径
执行如下命令更新supervisor:supervisorctl update
如图:项目启动成功
连接测试
7.seata的全局架构理解(DB模式)

