一 .简介
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
- 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
- 高性能:减少分布式事务解决方案所带来的性能消耗
官方站点:
Seata术语
TC (Transaction Coordinator) 事务协调者 :维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
UNDO_LOG表: 回滚日志
UNDO_LOG必须在每个业务数据库中创建,用于保存回滚操作数据- 当全局提交时,
UNDO_LOG记录直接删除 - 当全局回滚时,将现有数据撤销,还原至操作前的状态,详见beforeImage和afterImage
AT模式运行机制
AT模式的特点就是对业务无入侵式,整体机制分二阶段提交
-
两阶段提交协议的演变:
-
一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
-
二阶段:
- 提交异步化,非常快速地完成。
- 回滚通过一阶段的回滚日志进行反向补偿。
-
在 AT 模式下,用户只需关注自己的业务SQL,用户的业务SQL 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
搭建步骤:
下载地址: seata.io/zh-cn/blog/…\
1.下载并解压
2.修改conf/file.conf文件
将mode="file"改为mode="db"\
db部分配置mysql修改为自己的数据库链接,及账号密码\
在数据库中创建seata数据库,分配权限,并执行脚本创建数据库\
seata创表语句:github.com/seata/seata…
修改registry.conf文件
这个文件内容分为registry和config 2部分,为了方便,我们使用之前学过的nacos注册中心,你也可以采用默认的file方式
- 将
registry和config部分的由type="file"都换成type="nacos"(注意是2处地方) - 将2处的
nacos配置根据实际情况需要调整参数,本机启动nacos则不需要调整
-
双击启动
bin/seata-server.bat文件启动服务(有可能出现闪退) -
为了方便查看更加清晰的日志,建议使用
cmd的方式启动- 打开CMD窗口,使用cd命令切换到
seata的bin目录 - 输入
seata-server.bat回车
- 打开CMD窗口,使用cd命令切换到
使用Nacos作为Seata的配置中心
- 保证你的
Nacos服务已经启动,且可正常连接,对Nacos不熟悉的同学,可以点击此处进入学习 - 添加命名空间seata,获取到
namespace的id,我这里是f46bbdaa-f11e-414f-9530-e6a18cbf91f63.修改registry.conf文件中的registry部分type = "nacos",同时修改nacos部分的配置 4.修改registry.conf文件中的config部分type = "nacos",同时修改nacos部分的配置 5.下载nacos-config.脚本和config.txt,点击进入下载页
- nacos-config.sh和nacos-config.py选择一个:在seata目录下新建 script 目录,将
nacos-config.sh放入script目录下 config.txt:该文件存放在将seata目录下,与conf、lib目录同级,seata的非常全的配置内容,可通过nacos-config.sh脚本推送到nacos配置中心- 修改
config.txt的内容,下述1处暂时无需修改,2处需要换成你的DB连接路径 打开git bash或linux类命令行,执行sh脚本(注意脚本是否有执行的权限)
$ cd script
# -h 主机,你可以使用localhost,-p 端口号 你可以使用8848,-t 命名空间ID,-u 用户名,-p 密码
$ sh nacos-config.sh -h nacos.it235.com -p 80 -g SEATA_GROUP -t f46bbdaa-f11e-414f-9530-e6a18cbf91f6 -u nacos -w nacos
配置文件yml
server:
port: 2002
spring:
application:
name: seata-storage-service
cloud:
alibaba:
seata:
application-id: ${spring.application.name}
tx-service-group: my_test_tx_group #nacos文件中需存在service.vgroupMapping.my_test_tx_group(自定义的需添加)
service:
vgroupMapping:
default: default
grouplist:
default: 127.0.0.1:8091
nacos:
discovery:
server-addr: localhost:8848
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://8.129.213.58:3306/storage?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
jpa:
properties:
hibernate:
show_sql: true
# feign组件超时设置,用于查看seata数据库中的临时数据内容
feign:
client:
config:
default:
connect-timeout: 30000
read-timeout: 30000
logging:
level:
io:
seata: info
数据源代理
@Configuration
public class SeataConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
return new DruidDataSource();
}
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DataSource druidDataSource){
return new DataSourceProxy(druidDataSource);
}
}