前言:
对比了很多分布式事务的框架(LCN,TCC-transaction,等等)决定还是采用seata来写篇文章,采用的是SpringCloud微服务编码
分布式事务产生的历史和背景这边就不多叙述了,不太了解的朋友可以看我之前的文章,理论写的比较多(2PC,TCC,本地消息事务都有)。今天主要是带大家用阿里开源框架去解决微服务中的核心问题,分布式事务,以前同事公司也是用的这套框架,也因为是阿里的产品,所以比较放心。
seata介绍:
简易可扩展的自治式分布式事务管理框架。阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback, Fescar),和社区一起共建分布式事务解决方案。为了达到适用于所有的分布式事务业务场景的目标,也为了社区更中立、更开放、生态更加丰富,社区核心成员们决定进行品牌升级,改名 Seata。Seata 意为:Simple Extensible Autonomous Transaction Architecture,是一套一站式分布式事务解决方案。
seata组件:
Transaction Coordinator(TC):管理全局的分支事务的状态,用于全局性事务的提交和回滚。
Transaction Manager(TM):事务管理器,用于开启全局事务、提交或者回滚全局事务,是全局事务的开启者。
Resource Manager(RM):资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务
原理分析:
Seata的原理可以用2PC去理解,通过seata组件我们大概就能理解它嗯嗯意思,事务的最终提交或者回滚由事务管理器来监听,解释一下2PC,比如:你周末约着和两朋友去吃火锅,然后你问朋友A有时间没有,A说有时间,再问B朋友,B朋友说:我也想去呀,项目上线,周末要加班,没时间。这时候可能你就不太想去了。所有就取消活动了。这里就可以把你自己当做事务管理器TM,也是事务的发起方.你朋友可以当做RM 资源管理器。两阶段也就是指的 : 第一阶段你去问看看他们有没有时间,然后他们反馈消息给你,第二阶段就是你收到所有人的消息后,如果有不同意的,那么就取消活动。
原理图如下:
seata集成Springcloud:
1.seata服务器的搭建:大家可以去git上下载 :
https://github.com/seata/seata/releases,
国外镜像比较慢,我这边提供了CSDN地址:
https://download.csdn.net/download/zzxwx/12113503
2.进入解压包的bin目录启动服务 命令: sh seata-server.sh -9 8091 -m file 控制台输出成功启动server的字样代表启动成功
3.业务代码的集成, 我这边测试的项目结构如下:
5.rueka 作为注册中心,goods商品模块,order订单模块,这边我模拟用户下单减商品库存的操作。所以这边发起方就可以理解为订单模块,订单模块调用商品模块,订单记录表插入一条记录,商品模块扣减商品库存
6.引入seata jar包
com.alibaba.cloud
spring-cloud-alibaba-seata
2.1.0.RELEASE
7.换数据源为阿里的代理数据源,因为失败了,需要记录日志回滚
源码查看DataSourceConfig.java
8.主要是作为错误记录日志,改写原有数据源的方式
9.项目resource路径下添加 registry.conf 和 file.conf regist.conf 中的
type=file 其实也支持 redis zk等等
10.文件file.conf 文件中的server 里的属性修改为:vgroup_mappgin.自己的项目名-fesacar-service-group="default"
11.数据库添加表 undo_log 用来记录日志,事务处理失败后,用来回滚的日志
12.然后发起方的service添加主键 @GlobalTransactional
13.至此所有集成完毕,可以开始愉快地测试代码了访问 order模块 /userDownUser 可以测试下单 num为100时候为异常测试 查看order 和goods表的数据是否同时成功和失败
最后感谢大家的阅读,祝大家新年快乐,相亲的能成功~
天冷码字不易,你们的支持是我最大的动力,年后会给大家带来面试题分析,敬请期待~