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

转载自 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 环境准备

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

运行环境版本要求
jdk1.8+
Spring Boot1.5+
MySQL5.7+
ZooKeeper3.4+
Seata0.6.1
Dubbo2.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分布式事务实战

  • 分布式事务选型的取舍

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ocelot监控

网关的作用之一,就是有统一的数据出入口,基于这个功能,我们可以在网关上配置监控,从而把所有web服务的请求应答基本数据捕获并展显出来。 关于web的监控,一般的做法是采集数据并保存,然后通过图表的方式展示…

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

转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis。本文主要介绍了MyBatis的缓存策略、以及基于SpringBoot和Redis实现MyBatis的二级缓存的过程。实现本…

数据库架构演变概要

一.背景为了适应业务增长,数据库数据量快速增长,性能日趋下降,稳定性不佳的实际情况,急需架构逐步演变适应未来的业务发展。二.现状【稳定性】数据库为单点,没有高可用和稳定性方案。【数据量大】数据库目前…

面试请不要再问我Spring Cloud底层原理

转载自 面试请不要再问我Spring Cloud底层原理 概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并…

nginx配置前端反向代理

本地这里有两个端口: 8080:前端页面 80:后端接口 在nginx配置 listen 8888;server_name 127.0.0.1;location / {root html;proxy_pass http://127.0.0.1:8080;# try_files $uri $uri/ /index.php$is_args$args;index index.html…

Visual Studio 2017的第五个更新包扩展了调试工具

Visual Studio 2017近日收到了最新的完整更新包,版本号为15.5。跟随前几次更新的步伐,这次发布提供了一系列几乎会让所有用户从中受益的特性。此次发布的一个重点是IDE的性能,尤其是减少C#/Visual Basic项目的加载时间。在.NET Core项目中进行…

深港澳大湾区第三次.NET技术交流会圆满成功

2017年12月10日,一场以云、devops、微服务、容器是现在这个发展阶段的软件形态, 本次活动我们围绕这些话题介绍.NET生态下的发展本地社区活动,这次活动还得到如鹏网杨中科老师的大力支持开通网上直播,网上有229位参与活动&#xf…

基于消息中间件RabbitMQ实现简单的RPC服务

转载自 基于消息中间件RabbitMQ实现简单的RPC服务 RPC(Remote Procedure Call,远程过程调用),是一种计算机通信协议。对于两台机器而言,就是A服务器上的应用程序调用B服务器上的函数或者方法,由于不在同一个内存空间或机器上运行&#xff0c…

开源纯C#工控网关+组态软件(七)数据采集与归档

一、 引子在当前自动化、信息化、智能化的时代背景下,数据的作用日渐凸显。而工业发展到如今,科技含量和自动化水平均显著提高,但对数据的采集、利用才开始起步。对工业企业而言,数据采集日益受到重视,主要应用场景包…

实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例

转载自 实践出真知之Spring Cloud之基于Eureka、Ribbon、Feign的真实案例 Eureka是Spring Cloud Eureka的简称,是Netflix提供的组件之一。通过Eureka可以提供服务注册、发现、负载均衡、降级、熔断等功能。本篇主要介绍Eureka作为服务注册中心,以及实现…

从零开发一个laravel项目的增删改查、详情

环境要求: wampcomposer 创建laravel项目: composer create-project --prefer-dist laravel/laravel person快速完成person注册登录开发 1、migration php artisan make:migration create_people_table$table->increments(id);$table->string…

使用Api分析器与Windows兼容包来编写智能的跨平台.NET Core应用

本文翻译自Scott Hanselman博客:https://www.hanselman.com/blog/WritingSmarterCrossplatformNETCoreAppsWithTheAPIAnalyzerAndWindowsCompatibilityPack.aspx正文:这是最近这几周你应该知道的一对.Net Core界的优秀工具。我们在编写或者移植跨平台代码…

实验进行中:.NET WebAssembly支持

目前四大主流浏览器都默认支持WebAssembly,而.NET社区也在继续推动为.NET开发者提供相关能力,来将他们的代码编译成WebAssembly,然后在浏览器上运行。WebAssembly是一种二进制web格式,旨在以接近原生的性能运行不是用JavaScript语…

Js对象如何添加方法、查看Api

js万物皆对象,要带着观察对象的眼观去看待每一个函数、变量。 为什么要用到原型? Es6以前,js中没有如ooa编程当中的class,但是要用到类,怎么办呢,构造函数就应运而生,但是构造函数里面添加方法…

微软人工智能和对话平台--知识商城体验

前言微软最新发布 知识商城了!这是一个人工智能和对话平台应用的场景。他可以让开发者带着想法 出做天马行空的创造性工作!你只需要稍微动动手,如:拖拽板块,就可以做到极致对答、代码自动生成!想象一下&…

Spring @Import注解配置类方法内部调用没有注入属性值的坑

一、场景复现 application.yaml spring:application:name: config-testprofiles:active: devconfig:config-01:name: zhansancode: 001config-02:name: lisicode: 002导入配置类 Configuration Import(ImportConfig.class) public class Config {BeanConfigurationPropertie…

使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)

如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微软收购…

Spring Boot 数据库连接池入门

转载自 芋道 Spring Boot 数据库连接池入门 本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-19 目录。 原创不易,给点个 Star 嘿,一起冲鸭! 1. 概述 在我们的项目中,数据库连接池基…

.net core 实现简单爬虫—抓取博客园的博文列表

一.介绍一个Http请求框架HttpCode.CoreHttpCode.Core 源自于HttpCode(传送门),不同的是 HttpCode.Core是基于.net standard 2.0实现的,移除了HttpCode与windows相耦合的api,且修改了异步实现,其余特性完全与…

SpringBoot2.1.9 Mybatis由于@Mapper注解多数据源配置不生效问题

一、场景复现 (1)项目 目录 配置文件 spring:application:name: multi-datasourceprofiles:active: dev1datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/base?…