前言:

     对比了很多分布式事务的框架(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. 1.seata服务器的搭建:大家可以去git上下载 :
  2. https://github.com/seata/seata/releases,国外镜像比较慢,我这边提供了CSDN地址: 
  3. 2.进入解压包的bin目录启动服务 命令: sh seata-server.sh -9 8091 -m file 控制台输出成功启动server的字样代表启动成功
  4. 3.业务代码的集成, 我这边测试的项目结构如下:

5.rueka 作为注册中心,goods商品模块,order订单模块,这边我模拟用户下单减商品库存的操作。所以这边发起方就可以理解为订单模块,订单模块调用商品模块,订单记录表插入一条记录,商品模块扣减商品库存

 

6.引入seata jar包

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-alibaba-seata</artifactId>
   <version>2.1.0.RELEASE</version>
</dependency>

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表的数据是否同时成功和失败