文章目录
- 前言
- 一、准备
- 1. 架构图
- 2. 工作机制
- 3. Seata术语
- 4. 事务模式
- 4.1 Seata AT 模式(依赖数据库)
- 4.2 Seata TCC 模式(不依赖数据库)
- 4.3 Seata Saga 模式(支持长事务)
- 4.4 Seata XA 模式(支持XA 协议)
- 二、安装
- 1. 下载
- 2. 解压
- 3. 重要属性
- 4. 修改配置
- 4.1 配置中心
- 4.2 注册中心
- 4.3 新建配置(nacos控制台)
- 5. 初始化库表
- 5.1 新建库
- 5.2 建表(仅db)
- 三、使用
- 1. 启动
- 2. 停止
- 3. 注册中心
- 4. 控制台
- 总结
前言
Seata 是阿里巴巴开源的分布式事务中间件,以高效并且对业务 0 侵入的方式,解决微服务场景下面临的分布式事务问题。
Seata 是一款易于使用、高性能、开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
一、准备
这里我们先来了解下Seata,才能在项目中更好地应用。
1. 架构图
2. 工作机制
- 一阶段
- 二阶段-回滚
- 二阶段-提交
3. Seata术语
Seata Server(TC),Seata Client(TM,RM)
术语 | 描述 |
---|---|
TC (Transaction Coordinator) - 事务协调者 | 维护全局和分支事务的状态,驱动全局事务提交或回滚。 |
TM (Transaction Manager) - 事务管理器 | 定义全局事务的范围:开始全局事务、提交或回滚全局事务。 |
RM (Resource Manager) - 资源管理器 | 管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。 |
4. 事务模式
4.1 Seata AT 模式(依赖数据库)
AT 模式是 Seata 创新的一种非侵入式的分布式事务解决方案,Seata 在内部做了对数据库操作的代理层,我们使用 Seata AT 模式时,实际上用的是 Seata 自带的数据源代理 DataSourceProxy,Seata 在这层代理中加入了很多逻辑,比如插入回滚 undo_log 日志,检查全局锁等。
4.2 Seata TCC 模式(不依赖数据库)
TCC 模式是 Seata 支持的一种由业务方细粒度控制的侵入式分布式事务解决方案,是继 AT 模式后第二种支持的事务模式,最早由蚂蚁金服贡献。其分布式事务模型直接作用于服务层,不依赖底层数据库,可以灵活选择业务资源的锁定粒度,减少资源锁持有时间,可扩展性好,可以说是为独立部署的 SOA 服务而设计的。
4.3 Seata Saga 模式(支持长事务)
Saga 模式是 SEATA 提供的长事务解决方案,在 Saga 模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。
4.4 Seata XA 模式(支持XA 协议)
XA 模式是从 1.2 版本支持的事务模式。XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。Seata XA 模式是利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种事务模式。
官方重点介绍 Seata AT 模式的使用,后面案例也使用这种模式。
二、安装
1. 下载
从 https://github.com/apache/incubator-seata/releases ,下载服务器软件包,将其解压缩。
2. 解压
tar -zxvf seata-server-2.0.0.tar.gz
3. 重要属性
server 端 | client 端 |
---|---|
registry.type | registry.type |
config.type | config.type |
#store.mode=db 需要以下配置 | service.vgroupMapping.my_test_tx_group |
store.db.driverClassName | service.default.grouplist |
store.db.url | service.disableGlobalTransaction |
store.db.user | |
store.db.password | |
#store.mode=redis 需要以下配置 | |
store.redis.host | |
store.redis.port | |
store.redis.database | |
store.redis.password | |
#store.mode=raft 需要以下配置 | |
server.raft.group | |
server.raft.server-addr | |
server.raft.snapshot-interval |
更多内容请参考参数配置
4. 修改配置
服务端配置文件位于
conf/application.yml
,我们需要调整配置中心、注册中心、存储中心等配置信息,这里使用nacos+mysql
4.1 配置中心
seata:config:# support: nacos 、 consul 、 apollo 、 zk 、 etcd3type: nacosnacos:server-addr: 127.0.0.1:8848namespace: devgroup: SEATA_GROUPusername: adminpassword: admincontext-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.properties
4.2 注册中心
seata:registry:# support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofatype: nacospreferred-networks: 30.240.*nacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace: devcluster: defaultusername: adminpassword: admincontext-path:##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:
4.3 新建配置(nacos控制台)
我们可以根据
script/config-center/config.txt
模板文件进行调整
#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
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
transport.serialization=seata
transport.compressor=none#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false#Log rule configuration, for client and server
log.exceptionRate=100#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
#store.publicKey=#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=seata
store.db.password=seata
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000#Transaction rule configuration, only for the server
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
server.distributedLockExpireTime=10000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=true
server.enableParallelHandleBranch=false#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
新建配置包含存储模式和相关配置信息
file模式为单机模式,全局事务会话信息内存中读写并异步(默认)持久化本地文件root.data,性能较高;
db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
5. 初始化库表
5.1 新建库
CREATE DATABASE seata;
CREATE USER 'seata'@'%' IDENTIFIED BY 'seata';
GRANT ALL PRIVILEGES ON seata.* TO 'seata'@'%';
FLUSH PRIVILEGES;
use seata;
5.2 建表(仅db)
找到
script/server/db/mysql.sql
,到seata
执行;
全局事务会话信息由3块内容构成,全局事务–>分支事务–>全局锁,对应表global_table、branch_table、lock_table
这里我们来给全局锁表增加一条数据,等下方便从界面观察
INSERT INTO `seata`.`lock_table`(`row_key`, `xid`, `transaction_id`, `branch_id`, `resource_id`, `table_name`, `pk`, `status`, `gmt_create`, `gmt_modified`) VALUES ('1', '1', 1, 1, NULL, NULL, NULL, 0, NULL, NULL);
三、使用
1. 启动
sh seata-server.sh
支持的启动参数:
参数 | 全写 | 作用 | 备注 |
---|---|---|---|
-h | –host | 指定在注册中心注册的 IP | 不指定时获取当前的 IP,外部访问部署在云环境和容器中的 server 建议指定 |
-p | –port | 指定 server 启动的端口 | 默认为 8091 |
-m | –storeMode | 事务日志存储方式 | 支持file,db,redis,默认为 file 注:redis需seata-server 1.3版本及以上 |
-n | –serverNode | 用于指定seata-server节点ID | 如 1,2,3…, 默认为 1 |
-e | –seataEnv | 指定 seata-server 运行环境 | 如 dev, test 等, 服务启动时会使用 registry-dev.conf 这样的配置 |
如:
seata-server.sh -h 127.0.0.1 -p 8091 -m db
2. 停止
sh seata-server.sh stop
3. 注册中心
4. 控制台
Seata 1.5.1 开始支持控制台 本地访问控制台地址:http://127.0.0.1:7091,通过 Seata 内置的控制台可以观察正在执行的事务信息和全局锁信息,事务执行结束即删除相关信息。
seata/seata
总结
回到顶部
官方网站
项目源码
参数配置
安装已经完成了,接下来会陆续介绍客户端的使用。