SpringCloud Alibaba Seata 分布式事务
SpringCloud Alibaba Seata 分布式事务
- 1-SpringCloud Alibaba Seata 概述
- 1.1-是什么
- 1.2-能干嘛
- 1.3-去哪下
- 1.4-怎么玩
- 2-SpringCloud Alibaba Seata 安装
- 2.1-Seata 下载
- 2.2-Seata 安装
- 3-SpringCloud Alibaba Seata 配置
- 3.1-微服务数据库准备
- 3.2-订单服务 seata-order-service2001
- 3.3-库存服务 seata-order-service2002
- 3.4-账户服务 seata-order-service2003
- 3.5-测试 Seata 配置
- 4-SpringCloud Alibaba Seata 原理
- 4.1-Seata 组件
- 4.2-Seata AT 模式
1-SpringCloud Alibaba Seata 概述
单体应用被拆分成微服务应用,原三个模块被拆分成三个独立的应用,分别使用三个独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部的数据—致性由本地事务来保证,但是全局的数据—致性问题没法保证。
用户购买商品的业务逻辑,整个业务逻辑由三个微服务提供支持:
- 仓话服务:对给定的商品扣除仓储数量。
- 订单服务:根据洋购需求创建订单。
- 帐户服务:从用户帐户中扣除余领。
一句话:一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生。
1.1-是什么
http://seata.io/zh-cn/
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
1.2-能干嘛
典型的分布式事务过程(分布式事务处理过程的ID + 三组件模型):
- Transaction ID XID:全局唯一的事务ID
- 三组件概念
Transaction Coordinator(TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager™:控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
Resource Manager(RM):控制分支事务,负责分支注册,状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
处理过程:
- TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID
- XID 在微服务调用链路的上下文中传播。
- RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。
- TM 向 TC 发起针对 XID 的全局提交或回滚决议。
- TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。
1.3-去哪下
GitHub:
- https://github.com/seata/seata/releases
1.4-怎么玩
Spring 本地 @Transactional、全局 @GlobalTransactional。
Seata 分布式交易解决方案:
只需要使用一个 @GlobalTransactional 注解在业务方法上。
2-SpringCloud Alibaba Seata 安装
2.1-Seata 下载
http://seata.io/zh-cn/
Seata-Server安装
1.官网地址
2.下载版本
2.2-Seata 安装
3.seata-server-0.9.0.zip解压到指定目录并修改conf目录下的file.conf配置文件
先备份原始file.conf文件
主要修改:自定义事务组名称+事务日志存储模式为db+数据库连接信息
file.conf
service模块
store模块
4.mysql5.7数据库新建库seata
5.在seata库里建表
建表db_store.sql在\seata-server-0.9.0\seata\conf目录里面
db_store.sql
SQL
6.修改seata-server-0.9.0\seata\conf目录下的registry.conf配置文件
7.先启动Nacos端口号8848
8.再启动seata-server
softs\seata-server-0.9.0\seata\bin
seata-server.bat
3-SpringCloud Alibaba Seata 配置
3.1-微服务数据库准备
3.2-订单服务 seata-order-service2001
3.3-库存服务 seata-order-service2002
3.4-账户服务 seata-order-service2003
3.5-测试 Seata 配置
订单/库存/账户业务数据库准备
以下演示都需要先启动Nacos后启动Seata,保证两个都OK
Seata没启动报错no available server to connect
分布式事务业务说明
业务说明
下订单–>扣库存–>减账户(余额)
创建业务数据库
seata_order: 存储订单的数据库
seata_storage:存储库存的数据库
seata_account: 存储账户信息的数据库
建表SQL
按照上述3库分别建对应业务表
seata_order库下建t_order表
seata_storage库下建t_storage表
seata_account库下建t_account表
按照上述3库分别建对应的回滚日志表
订单-库存-账户3个库下都需要建各自的回滚日志表
\seata-server-0.9.0\seata\conf目录下的db_undo_log.sql
建表SQL
最终效果
订单/库存/账户业务微服务准备
业务需求
下订单->减库存->扣余额->改(订单)状态
新建订单Order-Module
1.seata-order-service2001
2.POM
3.YML
4.file.conf
5.registry.conf
6.domain
CommonResult
Order
7.Dao接口及实现
OrderDao
resources文件夹下新建mapper文件夹后添加
OrderMapper.xml
8.Service接口及实现
OrderService
OrderServiceImpl
StorageService
AccountService
9.Controller
10.Config配置
MyBatisConfig
DataSourceProxyConfig
11.主启动
新建库存Storage-Module
1.seata-order-service2002
2.POM
3.YML
4.file.conf
5.registry.conf
6.domain
CommonResult
Storage
7.Dao接口及实现
StorageDao
resources文件夹下新建mapper文件夹后添加
StorageMapper.xml
8.Service接口及实现
StorageService
StorageServiceImpl
9.Controller
10.Config配置
MyBatisConfig
DataSourceProxyConfig
11.主启动
新建账户Account-Module
副主题
1.seata-order-service2003
2.POM
3.YML
4.file.conf
5.registry.conf
6.domain
CommonResult
Account
7.Dao接口及实现
AccountDao
resources文件夹下新建mapper文件夹后添加
AccountMapper.xml
8.Service接口及实现
AccountService
AccountServiceImpl
9.Controller
10.Config配置
MyBatisConfig
DataSourceProxyConfig
11.主启动
Test
下订单->减库存->扣余额->改(订单)状态
数据库初始情况
正常下单
http://localhost:2001/order/create?userid=1&producrid=1&counr=10&money=100
数据库情况
超时异常,没加@GlobalTransactional
AccountServiceImpl添加超时
数据库情况
故障情况
当库存和账户余额扣减后,订单状态并没有设置为已经完成,没有从零改为1
而且由于feign的重试机制,账户余额还有可能被多次扣减
超时异常,添加@GlobalTransactional
AccountServiceImpl添加超时
OrderServiceImpl@GlobalTransactional
下单后数据库数据并没有任何改变
记录都添加不进来
4-SpringCloud Alibaba Seata 原理
4.1-Seata 组件
Seata之原理简介
Seata
2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案
Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务框架
2020起初,参加工作后用1.0以后的版本
再看TC/TM/RM三大组件
分布式事务的执行流程
TM开启分布式事务(TM向TC注册全局事务记录)
换业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)
TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)
TC汇总事务信息,决定分布式事务是提交还是回滚
TC通知所有RM提交/回滚资源,事务二阶段结束。
4.2-Seata AT 模式
AT模式如何做到对业务的无侵入
是什么
一阶段加载
二阶段提交
二阶段回滚
debug
补充
还没有评论,来说两句吧...