0. 介绍

2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地事务的使用一样,简单和高效,并逐步解决开发者们遇到的分布式事务方面的所有难题。
Fescar 开源后,蚂蚁金服加入 Fescar 社区参与共建,并在 Fescar 0.4.0 版本中贡献了 TCC 模式。
为了打造更中立、更开放、生态更加丰富的分布式事务开源社区,经过社区核心成员的投票,大家决定对 Fescar 进行品牌升级,并更名为 Seata,意为:Simple Extensible Autonomous Transaction Architecture,是一套一站式分布式事务解决方案。
Seata 融合了阿里巴巴和蚂蚁金服在分布式事务技术上的积累,并沉淀了新零售、云计算和新金融等场景下丰富的实践经验,但要实现适用于所有的分布式事务场景的愿景,仍有很长的路要走。因此,我们决定建立一个完全中立的分布式事务组织,希望更多的企业、开发者能够加入我们,一起打造 Seata。

1. 依赖工具

Maven
Git
JDK
注意,IntelliJ IDEA 最好使用最新版本。目前使用的是 2019.1.2 ,避免出现奇怪的问题。= =~反正我是出了,所以做了升级。
MySQL
Nacos

2. 源码拉取

本小节,我们需要拉取两个项目的源码:

2.1 获取 Demo 源码

使用 IntelliJ IDEA 从 https://github.com/seata/seata-samples 拉取代码。拉取完成后,Maven 会下载依赖包,可能会花费一些时间,耐心等待下。

2.2 获取 Seata 源码

从官方仓库 https://github.com/seata/seata Fork 出属于自己的仓库。为什么要 Fork ?既然开始阅读、调试源码,我们可能会写一些注释,有了自己的仓库,可以进行自由的提交。。
如果 Fork 了 Seata 项目,注意替换成自己的仓库地址。
这么做是,方便后面 IDEA 调试 Seata 源码时,使用我们克隆的项目的源码。
3、修改 Demo 项目引用 Seata 的版本号,为克隆的 Seata 项目的版本号(例如本文为 0.6.0-SNAPSHOT)。如下图所示:

3. 启动 Seata Server 服务

比较简单,搜到 io.seata.server.Server 类,直接迅猛右键 main 方法,运行,启动完毕。可看到如下日志:

4. 启动 Demo 项目

Seata 提供了各种 Demo ,选择了 spring-boot-dubbo-seata 项目,基于 Spring Boot + Dubbo 的示例。

4.1 初始化数据库

目前 Seata 暂时只支持 MySQL 
1、创建数据库,名字为 db_gts_fescar 。
2、将 spring-boot-dubbo-seata/sql/db_seata.sql 导入到数据库中,进行表的初始化。
使用单库怎么测试分布式事务呢?即使单库,如果多个服务进行事务操作,一样会形成分布式事务。

4.2 启动 Nacos 服务

1、打开 https://github.com/alibaba/nacos/releases 网页,下载 Nacos 。目前看到的最新版本是 1.0.0 ,所以当然下载它。
2、创建数据库,名字为 nacos_devtest 。然后,将 Nacos 所在目录/conf/nacos-mysql.sql 导入数据库中。
3、编辑 Nacos 所在目录/conf/application.properties 配置文件,增加 Nacos 数据库连接。例如如下:
spring.datasource.platform=mysql
 
 
 
db.num=1
 
 
db.user=root
 
db.password=你的密码
 
 
4、执行 nohup sh bin/startup.sh -m standalone & 命令,启动 Nacos 服务。
5、浏览器打开 http://127.0.0.1:8848/nacos 网页,输入 nacos / nacos 进行登录。

4.3 启动各种项目

4.3.1 启动 samples-storage 项目

搜到 io.seata.samples.integration.storage.StorageGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。可看到如下日志:
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : NettyPool create channel to transactionRole:TMROLE,address:127.0.0.1:8091,msg:< RegisterTMRequest{applicationId='storage-gts-fescar-example', transactionServiceGroup='my_test_tx_group'} >
 
INFO 29748 --- [imeoutChecker_1] io.seata.core.rpc.netty.RmRpcClient      : will connect to 127.0.0.1:8091
 
INFO 29748 --- [imeoutChecker_1] io.seata.core.rpc.netty.RmRpcClient      : RM will register :jdbc:mysql://180.167.213.26:13306/db_gts_fescar?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
 
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : NettyPool create channel to transactionRole:RMROLE,address:127.0.0.1:8091,msg:< RegisterRMRequest{resourceIds='jdbc:mysql://180.167.213.26:13306/db_gts_fescar?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true', applicationId='storage-gts-fescar-example', transactionServiceGroup='my_test_tx_group'} >
 
INFO 29748 --- [imeoutChecker_1] io.seata.core.rpc.netty.RmRpcClient      : register RM success. server version:0.6.0,channel:[id: 0x56592a3a, L:/127.0.0.1:62656 - R:/127.0.0.1:8091]
 
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : register success, cost 32 ms, version:0.6.0,role:TMROLE,channel:[id: 0xca65c481, L:/127.0.0.1:62657 - R:/127.0.0.1:8091]
 
INFO 29748 --- [imeoutChecker_1] i.s.core.rpc.netty.NettyPoolableFactory  : register success, cost 41 ms, version:0.6.0,role:RMROLE,channel:[id: 0x56592a3a, L:/127.0.0.1:62656 - R:/127.0.0.1:8091]
 
已经成功注册到 Seata Server 服务 中。

4.3.2 启动 samples-account 项目

搜到 io.seata.samples.integration.account.AccountGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。
效果同 samples-storage 项目。

4.3.3 启动 samples-order 项目

搜到 io.seata.samples.integration.order.OrderGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。
效果同 samples-storage 项目。

4.3.4 启动 samples-dubbo-business-call 项目

搜到 io.seata.samples.integration.call.DubboGtsFescarExampleApplication 类,直接迅猛右键 main 方法,运行,启动完毕。
至此,我们已经把需要启动的项目,都启动完毕。此时,我们打开 Nacos 可以看到各个服务的状况。如下图:

4.4 测试分布式事务

下面,我们将测试两种情况:
分布式事务正常提交
分布式事务异常回滚

4.4.1 正常流程

在 Postman 中,模拟请求如下图:
请求地址:127.0.0.1:8104//business/dubbo/buy
请求数据:
{
 
     "userId": "1",
 
"commodityCode": "C201901140001",
 
      "name": "水杯",
 
  "count": 1,
 
     "amount": 0.01
 
}
 
 
请求成功后,我们看看数据的变化。如下图:
t_order 表,新增了一条记录。如下图:
t_storage 表,库存减一。如下图:
t_account 表,余额减一。如下图:

4.4.2 异常流程

在 Postman 中,模拟请求如下图:
我们故意将商品编号 "commodityCode" 写错成了 "C201901140001xxxx" ,用于模拟分布式事务,因为库存不足,进行回滚。
为了更好的看过过程中的变化,我们在 BusinessServiceImpl 类的 #handleBusiness(BusinessDTO businessDTO)方法,第 XX 行,打了一个断点。如下图所示:
做好了这些准备,我们点击 Postman ,执行请求。因为我们在 BusinessServiceImpl 打了断点,所以我们看看执行到此处,数据的变化。如下图:
t_order 表,新增了一条记录。如下图:
t_storage 表,库存不变,因为我们使用了一个不存在的商品。如下图:
t_account 表,余额减一。如下图:
此时,我们放开断点,执行下去,因为扣库存失败,所以会抛出 DefaultException 异常,从而回滚全局事务。然后呢,数据又恢复:
t_order 表,如下图:
t_storage 表,如下图:
t_account 表,如下图:

seata demo的更多相关文章

  1. 分享一个seata demo,讲两个个问题

    Seata,阿里开源的分布式事务框架,多的我就不介绍了,了解详细介绍,请看官网.seata spring boot入门,可以看我上一篇博客<Spring boot微服务如何集成fescar解决分 ...

  2. spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)

    一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...

  3. 分布式事务之解决方案(XA和2PC)

    3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1. 什么是2PC 2PC即两阶段提交协议,是将整 ...

  4. [转帖]分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 3. 分布式事务解决方案之2PC(两阶段提交) 针对不同的分布式场景业界常见的解决方案 ...

  5. 【转帖】分布式事务之解决方案(XA和2PC)

    分布式事务之解决方案(XA和2PC) https://zhuanlan.zhihu.com/p/93459200 ​ 博彦信息技术有限公司 java工程师 3. 分布式事务解决方案之2PC(两阶段提交 ...

  6. 分布式事务二TCC

    分布式事务解决方案之TCC 4.1.什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try.确认Confirm.撤销Cancel ...

  7. 分布式事务一2PC

    分布式事务解决方案之2PC(两阶段提交) 前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1.什 ...

  8. 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...

  9. SEATA 分布式事务入门DEMO

    Simple Extensible Autonomous Transacation Architecture,seata是简单的.可扩展.自主性高的分布式架构 SEATA Server Configu ...

随机推荐

  1. springboot 开启缓存

    Caching Data with Spring This guide walks you through the process of enabling caching on a Spring ma ...

  2. Coding 账户与 本地 Git 客户端的配置

    1.先创建cooding账户 ,注册地址:https://coding.net/ 2.创建好账户后登陆,在个人设置中  验证邮箱 和 验证手机 (邮箱很重要配置需要用到) 3.安装git 客户端 (在 ...

  3. ES使用中的总结整理

    最近项目中使用了ES搜索,开始时自己搭建了ES环境做测试,后面申请了公司的云平台应用, 对接ES的过程中颇具波折,遇到了很多问题,在这里统一整理记录下: 1,ES的9200 及 9300端口说明 92 ...

  4. NURBS 曲线和曲面参数化

    NURBS 曲线和曲面参数化 什么是参数? 参数是曲线或曲面上点的唯一数值(类似于坐标).通过参数,可以沿曲线的长度方向引用特定点.参数值越大,点在曲线方向上的距离越远. 就像空间中的点具有三个维度( ...

  5. Flash大文件断点续传功能

    一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...

  6. [HG]走夜路 题解

    前言 整个机房就我一个人在想动态规划. 想了半天发现一堆性质,结果由于DP中出现折线挂了. 题目描述 某NOIP普及组原题加强版. \(Jim\) 非常怕黑,他有一个手电筒,设手电筒的电量上限为 \( ...

  7. k8s删除节点后再重新添加进去(踩坑)

    开启本地集群,发现一台节点出问题了,想删除再换一台节点,结果就踩坑了,还好本地有好几套环境. 再master节点执行以下命令 [root@k8s-master ~]# kubectl drain k8 ...

  8. Django日志的配置

    做开发离不开日志,以下是我在工作中写Django项目常用的logging配置.   BASE_LOG_DIR = os.path.join(BASE_DIR, "log") LOG ...

  9. Maven报错,没有有效的生命周期

    [ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a g ...

  10. leetcode-easy-listnode-141 Linked List Cycle

    mycode  98.22% # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x ...