- SpringCloud Alibaba - Nacos搭建及服务注册发现
- SpringCloud Alibaba - openfeign服务间相互调用
- SpringCloud Alibaba - Seata分布式事务搭建及应用
- SpringCloud Alibaba - 整合gateway服务网关
- SpringCloud Alibaba - 搭建Sentinel监控流量控制
官网:http://seata.io
官方介绍
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。
经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。
2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。
Seata主要应用于:分布式中事务控制,在多个独立事务之上建立全局事务逻辑,利用undo_log表进行数据回滚
CSDN下载:seata-1.3.0.zip seata-server-1.3.0.zip seata-server-1.3.0.tar.gz
GitHub下载:seata-1.3.0.zip seata-server-1.3.0.zip seata-server-1.3.0.tar.gz
- 新建seata数据库(库名自定义)
- 导入sql文件:seata-1.3.0/script/server/db/mysql.sql
seata-server-1.3.0/seata/conf/registry.conf
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = ""
password = ""
}
file {
name = "file.conf"
}
}
config {
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
}
file {
name = "file.conf"
}
}
3. 配置数据库连接相关
复制txt文件至服务端的conf下
txt文件路径(源码):seata-1.3.0/script/config-center/config.txt
复制至(server端) -> seata-server-1.3.0/seata/conf/config.txt
# 修改为db模式 store.mode=db # 如mysql8.0+,则修改为:com.mysql.cj.jdbc.Driver store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true store.db.user=username store.db.password=password4. 配置sh脚本,将seata配置推送至nacos
- 复制sh执行文件至服务端的conf下
- sh文件路径(源码):seata-1.3.0/script/config-center/nacos/nacos-config.sh
- 复制至(server端) -> seata-server-1.3.0/seata/conf/nacos-config.sh
- 86行添加conf:cat ( d i r n a m e " (dirname " (dirname"PWD")/conf/config.txt
- 在conf目录下执行:sh nacos-config.sh -h 127.0.0.1 -p 8848
注:参数ip端口为nacos服务端地址,windows可安装git来执行sh命令
5. 修改conf/file.confstore {
mode = "db"
db {
datasource = "druid"
dbType = "mysql"
# 如mysql8.0+,则修改为:com.mysql.cj.jdbc.Driver
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata"
user = "mysql"
password = "mysql"
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}
Linux下搭建
单机或集群搭建,无特定区别,仅在其他机器同样配置即可
1. 准备工作# 配置并启动Nacos注册中心...此处省略 # 创建seata目录 [hyuser@jsvm-hynode-011 /]$ sudo mkdir /data/seata && cd /data/seata # 下载seata源码及server端压缩包;参考上文【资料下载】,如已下载可上传 [hyuser@jsvm-hynode-011 seata]$ wget https://github.com/seata/seata/archive/refs/tags/v1.3.0.zip [hyuser@jsvm-hynode-011 seata]$ wget https://github.com/seata/seata/releases/download/v1.3.0/seata-server-1.3.0.tar.gz # 安装zip解压工具 [hyuser@jsvm-hynode-011 seata]$ sudo yum install zip unzip -y # 解压 [hyuser@jsvm-hynode-011 seata]$ sudo unzip seata-1.3.0.zip [hyuser@jsvm-hynode-011 seata]$ sudo tar -zxvf seata-server-1.3.0.tar.gz # 进入mysql并导入sql文件 [hyuser@jsvm-hynode-011 seata]$ mysql -useatau -p mysql> use seatadata; Database changed mysql> source /data/seata/seata-1.3.0/script/server/db/mysql.sql2. 配置nacos注册中心
# 修改配置文件
[hyuser@jsvm-hynode-011 seata]$ sudo vim seata/conf/registry.conf
registry {
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "10.2.1.122:880"
group = "SEATA_GROUP"
namespace = ""
cluster = "default"
username = ""
password = ""
}
file {
name = "file.conf"
}
}
config {
type = "nacos"
nacos {
serverAddr = "10.2.1.122:880"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
}
file {
name = "file.conf"
}
}
3. 配置数据库连接相关serverAddr地址说明:本文10.2.1.122:880指向nginx且分发至不同服务器的nacos服务。
如单机nacos或未配置naginx负载均衡则指向具体nacos服务器地址
# 复制config.txt文件至server端 [hyuser@jsvm-hynode-011 seata]$ sudo cp seata-1.3.0/script/config-center/config.txt ./seata/conf/ # 修改数据库配置信息 [hyuser@jsvm-hynode-011 seata]$ sudo vim seata/conf/config.txt # 修改为db模式 store.mode=db # 如mysql8.0+,则修改为:com.mysql.cj.jdbc.Driver store.db.driverClassName=com.mysql.jdbc.Driver store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true store.db.user=username store.db.password=password4. 将seata的配置推送至nacos统一配置中心
# 复制config.sh脚本至server端下 [hyuser@jsvm-hynode-011 seata]$ sudo cp seata-1.3.0/script/config-center/nacos/nacos-config.sh ./seata/conf/ # 编辑config.sh脚本修改config.txt地址 [hyuser@jsvm-hynode-011 seata]$ sudo vim ./seata/conf/nacos-config.sh # 86行处,修改为:/conf/config.txt for line in $(cat $(dirname "$PWD")/conf/config.txt | sed s/[[:space:]]//g); do # 添加sh可执行权限 [hyuser@jsvm-hynode-011 seata]$ sudo chmod +x seata/conf/nacos-config.sh # 推送至nacos配置中心 [hyuser@jsvm-hynode-011 conf]$ cd seata/conf/ # -h nacos服务ip地址 -p nacos服务端口 [hyuser@jsvm-hynode-011 conf]$ sh nacos-config.sh -h 10.2.1.122 -p 8805. 修改file.conf
[hyuser@jsvm-hynode-011 conf]$ sudo vim file.conf
store {
mode = "db"
db {
datasource = "druid"
dbType = "mysql"
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata"
user = "mysql"
password = "mysql"
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
}
6. 启动SeataServer
# 创建log目录 [hyuser@jsvm-hynode-011 conf]$ sudo mkdir ../logs && cd ../logs [hyuser@jsvm-hynode-011 logs]$ sudo touch seata.log # 赋予所有人可读写权限 [hyuser@jsvm-hynode-011 logs]$ sudo chmod 666 seata.log [hyuser@jsvm-hynode-011 logs]$ nohup ../bin/seata-server.sh -p 8091 -n 1 > seata.log 2>&1 & # 查看控制台日志 [hyuser@jsvm-hynode-011 logs]$ tail -f seata.log
7. 搭建seata集群-p 8091:修改seata监听端口。默认端口:8091
-n 1:server node;在多个 TC Server 时,需区分各自节点,用于生成不同区间的 transactionId 事务编号,以免冲突
按上述步骤依次搭建,下列操作无需在其他节点操作
- 创建并导入seata数据库
- 将seata的配置推送至nacos统一配置中心
# 节点2 [hyuser@jsvm-hynode-012 logs]$ nohup ../bin/seata-server.sh -p 8091 -n 2 > seata.log 2>&1 & # 节点3 [hyuser@jsvm-hynode-013 logs]$ nohup ../bin/seata-server.sh -p 8091 -n 3 > seata.log 2>&1 &Coding如何使用
所有微服务业务数据库均需要导入事务表
sql文件路径(源码):seata-1.3.0/script/client/at/db/mysql.sql
pom.xml
com.alibaba.cloud spring-cloud-starter-alibaba-seata
application.yml
seata:
enabled: true
tx-service-group: ${spring.application.name}
enable-auto-data-source-proxy: true
config:
type: nacos
nacos:
namespace:
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
Java Demo
@GlobalTransactional
@PostMapping("account/save")
public Object accountSave() {
accountService.save2(new Account(954L, "123"));
accountServiceFeign.save();
return "SUCCESS";
}
@GlobalTransactional:添加此注解即可创建全局事务,遇到异常时可实现回滚



