转载自 Spring Boot之基于Dubbo和Seata的分布式事务解决方案

1. 分布式事务初探

一般来说,目前市面上的数据库都支持本地事务,也就是在你的应用程序中,在一个数据库连接下的操作,可以很容易的实现事务的操作。但是目前,基于SOA的思想,大部分项目都采用微服务架构后,就会出现了跨服务间的事务需求,这就称为分布式事务。本文假设你已经了解了事务的运行机制,如果你不了解事务,那么我建议先去看下事务相关的文章,再来阅读本文。

1.1 什么是分布式事务

对于传统的单体应用而言,实现本地事务可以依赖Spring的@Transactional注解标识方法,实现事务非常简单。

我们以最常见的电商系统为例,简单拆分为用户客户端、订单服务、库存服务、商品服务等等,在用户下单过程中,需要同时调用各个服务,但是,每个服务都是独立部署的,数据库连接是不共享的,因此要保证这些操作全部执行,或者全部不执行,就需要分布式事务的支持。

1.2 分布式事务解决方案

  • 全局事务,基于DTP模型实现,需要三种角色即Application 应用系统,Transaction Manager 事务管理器,Resource Manager资源管理器;

  • 基于可靠消息服务的分布式事务,通过消息队列实现事务的一致性;

  • TCC,即Try、Confirm、Cancel,属于补偿型分布式事务,Try:尝试待执行的事务,Confirm:执行事务,Cancel:取消执行的事务;

1.3 Seata介绍

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata 于2019.1正式对外开源,前身是阿里巴巴2014年诞生的 TXC(Taobao Transaction Constructor)。以下是Seata官网介绍的特色服务:

Seata 将为用户提供了 AT、TCC 和 XA 事务模式,为用户打造一站式的分布式解决方案。更多关于Seata的介绍,可参考其官网。

2. Spring Boot,Dubbo和Seata实现分布式事务案例

2.1 环境准备

运行本测试,需要你提前准备如下的软件运行环境:

运行环境 版本要求
jdk 1.8+
Spring Boot 1.5+
MySQL 5.7+
ZooKeeper 3.4+
Seata 0.6.1
Dubbo 2.6.5

本案例,主要模仿简单的下单扣减库存的过程,架构图如下:

2.2 Seata管理端

下载Seata的最新版本,并解压后,进入seata/bin目录,启动:

sh seata-server.sh 8091 file

观察8091端口是否启动。

2.3 数据存储

本测试服务,需要创建两张表,分别是订单表和库存表:

CREATE TABLE `t_order` (`id` int(11) NOT NULL AUTO_INCREMENT,`order_no` varchar(255) DEFAULT NULL,`user_id` varchar(255) DEFAULT NULL,`commodity_code` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT '0',`amount` double(14,2) DEFAULT '0.00',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;CREATE TABLE `t_storage` (`id` int(11) NOT NULL AUTO_INCREMENT,`commodity_code` varchar(255) DEFAULT NULL,`name` varchar(255) DEFAULT NULL,`count` int(11) DEFAULT '0',PRIMARY KEY (`id`),UNIQUE KEY `commodity_code` (`commodity_code`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.4 构建Spring Boot服务

示例代码可参考Github仓库,仓库的目录结构如下:

  • springboot-base:存储公共调用的基类接口,mapper接口,Model层的类等,可mvn install后,供另外三个module调用。

  • springboot-dubbo-storage:库存服务;

  • springboot-dubbo-order:订单服务;

  • springboot-dubbo-client:RPC消费者,提供对外接口;

基于Spring Boot构建Dubbo服务可参考之前的博文《Spring Boot(五)之集成Dubbo部署RPC服务》,构建本项目的过程就不再赘述了。

加入Seata组件后,与普通Dubbo项目的不同之处在于

1,配置Seata数据源

/*** seata数据源** init datasource proxy* @Param: druidDataSource  datasource bean instance* @Return: DataSourceProxy  datasource proxy*/
@Bean
public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource){return new DataSourceProxy(druidDataSource);
}

2,Seata初始化

/*** 配置全局事务扫描器。有两个参数,一个是应用名称,一个是事务分组** @return*/
@Bean
public GlobalTransactionScanner globalTransactionScanner() {return new GlobalTransactionScanner("springboot-dubbo-storage", "my_test_tx_group");
}

3,配置注册中心,目前可用的配置中心有file、nacos 、apollo、zk、consul,file类型本身不具备注册中心的动态发现和动态配置功能,官方的初衷是在不依赖第三方配置注册中心的基础上快速集成测试seata功能。配置内容在file.conf和registry.conf。

4,注解标记事务方法,在需要分布式事务的方法上,加上@GlobalTransactional注解即可。

2.5 测试

依次启动Seata、springboot-dubbo-storage、springboot-dubbo-order、springboot-dubbo-client后,打开postman测试,配置测试参数为:

可以看到,在addOrder报错后,会有全局事务的rollback过程。

3. 参考资料

  • Seata

  • 如何使用Seata保证Dubbo微服务间的一致性

  • SpringBoot+Dubbo+Seata分布式事务实战

  • 分布式事务选型的取舍

  • 常用的分布式事务解决方案

Spring Boot之基于Dubbo和Seata的分布式事务解决方案相关推荐

  1. 基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战

    基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战 参考文章: (1)基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战 (2)https:// ...

  2. base cap 分布式_干货分享:基于本地消息表的分布式事务解决方案总结

    前段时间学习了分布式事务的几种方案,下面主要总结下基于本地消息表实现可靠消息最终一致性的分布式事务方案. 1,什么是分布式事务? 在传统架构中往往是一个单体架构,一个系统就对应一个war包,然后这个系 ...

  3. seata实现分布式事务解决方案

    1.什么是TCC事务 TCC是Try.Confirm.Cancel三个词语的缩写 TCC要求每个分支事务(即多个不同的数据库实例)实现三个操作:预处理Try.确认 Confirm.撤销Cancel. ...

  4. 分布式事务解决方案 - SpringCloud Alibaba Seata

    目录 github代码:GitHub - 18409489244/seata: 基于springcloud alibaba seata 的分布式事务demo 一.常见分布式事务解决方案 二.分布式事务 ...

  5. 四种基于MQ的分布式事务解决方案

    在微服务的时代,分布式事务是绕不开的话题,尽管在大多数场景下,我们并不需要使用分布式事务,但是 不需要使用 不代表 可以不会使用,万一哪天真需要用到了呢?分布式事务是一个比较大的话题,今天我们来看看基 ...

  6. 使用Seata解决分布式事务以及Seata的安装、配置和使用

    目录 事务的介绍 什么是本地事务? 分布式事务 分布式事务解决方案之seata Seata介绍 Seata是什么 Seata的分布式事务解决方案 Seata的核心组件 AT模式的工作流程 一阶段 二阶 ...

  7. dubbo调用超时回滚_微服务痛点基于Dubbo + Seata的分布式事务(AT模式)

    前言 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案. ...

  8. Spring Boot之基于Redis实现MyBatis查询缓存解决方案

    转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...

  9. Spring Cloud Eureka整合 Seata 实现分布式事务

    一.Seata 介绍 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的 ...

最新文章

  1. LeetCode刷题宝典 V1.0 PDF下载
  2. R语言vtreat包的mkCrossFrameCExperiment函数交叉验证构建数据处理计划并进行模型训练、通过显著性进行变量筛选(删除相关性较强的变量)、构建多变量模型、转化为分类模型、模型评估
  3. php如何一篇文章替换敏感字,php实现的替换敏感字符串类实例
  4. 前端学习---html基础知识
  5. python有什么用处案例_为什么大家都推荐你学python?看完这5个例子就明白了!...
  6. python3调用c语言数组,使用Python中的ctypes访问数组
  7. 计算机一级实训报告册,计算机一级实验报告8.doc
  8. altera fpga sdi输出方案_高段位攻城狮是这样解决SI分析、DDR、FPGA国产化问题的! | 电巢直播答疑汇总...
  9. Codeblocks 中文乱码解决方法
  10. Android studio SweetAlert for Android
  11. Unity5 Survival Shooter开发笔记2
  12. FB新应用可借助人工智能回答照片内容提问
  13. 初学STM32之使用STM32CubeMX编写跑马灯程序
  14. Andorid moudle中的activity跳转到主项目的activity
  15. 产业分析:智能巡检机器人行业
  16. 解决电脑网络图标消失,电脑连接不上网络的问题总结。
  17. 学习并行计算(CUDA Python)-1-初尝试
  18. C Primer Plus 第5章 运算符、表达式和语句 5.3 其他运算符
  19. 小米2s android7.0秋大,老炮儿?小米2s升级MIUI 7流畅一逼!
  20. JVM(二十二) -- 性能监控与调优(三) -- JVM监控及诊断工具--GUI篇

热门文章

  1. [数据结构]二叉树的性质
  2. 网络原理往期考试题+部分详解+最终版
  3. JAVA Java多线程与并发库
  4. ad中电容用什么封装_二极管在电路中到底做什么用的
  5. Leetcode 35.搜索插入位置 二分
  6. Hibernate基础
  7. CodeCraft-21 and Codeforces Round #711 (Div. 2) D. Bananas in a Microwave 优化暴力
  8. LIS最长上升子序列
  9. 10.27模拟 总结
  10. YbtOJ#493-最大分数【斜率优化dp,分治】