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 here

3. git命令行输入如下命令
```shell
sh 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: nacos
nacos:
server-addr: 8.142.132.135:8848
group : "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: nacos
nacos:
application: seata-server
server-addr: 8.142.132.135:8848
group : "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-seata
service.vgroupMapping.service-item-group=store-seata
service.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/bin
command=sh seata-server.sh -h 8.142.132.135 -p 8091 -m db
autorestart=true
redirect_stderr=true
stdout_logfile=/data/seata/logs/seata-server.log
其中包括以下几点
- sh命令后面,如果说具体项目部署不是在内网的话,-h参数一定要是外网IP!!!!!!!。不然项目启动后,无法连接到内网IP。
- 最好指定日志文件路径
执行如下命令更新supervisor:supervisorctl update
如图:项目启动成功