微服务分布式事务解决方案Seata

微服务分布式事务解决方案Seata文章目录一 pandas 是什么 二 使用步骤 1 引入库 2 读入数据 总结一 什么是 Seata Seata 是一款开源的分布式事务解决方案 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 为用户打造一站式的分布式解决方案 AT 模式是阿里首推的模式 阿里云上有商用版本的 GTS GlobalTransa 全局事务服务 提示 业务场景 角色划分

一、什么是Seata? 

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用 的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事 务模式,为用户打造一站式的分布式解决方案(AT模式是阿里首推的模式, 阿里云上有商用版本的GTS[Global Transaction service 全局事务服务] ) 。

提示: 业务场景:

微服务分布式事务解决方案Seata

角色划分:

RM(ResourceManager 资源管理者)理解为我们的一个一个的微服务,也叫做事务的参与者. TM(TranactionManager 事务管理者) 也是我们的一个微服务,但是该微服务是 一个带头大哥,充当全局事务的发起者(决定了全局事务的开启,回滚,提交等) *凡是我们的微服务中标注了@GlobalTransactional ,那么该微服务就会被看出 一个TM。我们业务场景中订单微服务就是一个事务发起者,同时也是一个RM

TC(全局事务的协调者):这里就是我们的Seata-server,用来保存全局事务,分支 事务,全局锁等记录,然后会通知各个RM进行回滚或者提交. 二:整体机制(两阶段提交协议的演变) 

工作原理

微服务分布式事务解决方案Seata

执行业务SQL update product set name = ‘GTS’ where name = ‘TXC’;

第一阶段:

1:解析 SQL:得到 SQL 的类型(UPDATE),表(product),条件(where id= ‘1’)等相关的信息。

2:查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据。

select id, name, since from product where name = ‘TXC’; 

微服务分布式事务解决方案Seata

3:执行业务 SQL:更新这条记录的 name 为 ‘GTS’。

update product set name = ‘GTS’ where name = ‘TXC’;

4:查询后镜像:根据前镜像的结果,通过 主键 定位数据

select id, name, since from product where id = 1`; 

微服务分布式事务解决方案Seata

5:插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记 录,插入到 UNDO_LOG 表中。

6:提交前,向 TC 注册分支:申请 product 表中,主键值等于 1 的记录的 全局 锁 。

7:本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。

8:将本地事务提交的结果上报给 TC。

二阶段-回滚

1:收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作

2:通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。

3:数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数 据被当前全局事务之外的动作做了修改

4:根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句:

5:提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC。

二阶段-提交

1:收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成 功的结果给 TC。

2:异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。

三:快速开始搭建Seata环境 3.1)Seata-server环境搭建 

二、快速开始搭建Seata环境

1.Seata-server环境搭建

第一步:https://github.com/seata/seata/releases 下载seata-server包

第二步: 解压我们的下载包seata-server包,解压的路径结构

微服务分布式事务解决方案Seata

第三步: 进入conf目录下 拿到db_store.sql脚本 ,然后再本地数据库创建一个 seata的数据库,执行脚本db_store.sql。

微服务分布式事务解决方案Seata

第四步: 修改conf目录下的file.conf文件

微服务分布式事务解决方案Seata

修改的节点: service节点

service { #vgroup‐>rgroup //修改全局事务分组 vgroup_mapping.prex_tx_group = "default" #only support single node #seata‐server的连接地址 default.grouplist = "127.0.0.1:8091" #degrade current not support enableDegrade = false #disable disable = false #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent max.commit.retry.timeout = "‐1" max.rollback.retry.timeout = "‐1" }

 修改store节点:

 第五步:修改conf目录下的register.conf文件

微服务分布式事务解决方案Seata

修改registry节点的type类型为nacos 

registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa type = "nacos" nacos { serverAddr = "localhost:8848" namespace = "" cluster = "default" }  。。。。  。。。。  。。。。  } 

修改config节点的type改为nacos

 第六步:修改conf文件下的nacos-config.txt文件

微服务分布式事务解决方案Seata

 第六步: 使用git的控制台 执行sh脚本 sh nacos-config.sh localhost 把seata的配置导入到nacos的配置中心上去

微服务分布式事务解决方案Seata

 微服务分布式事务解决方案Seata

 第七步:启动 seata-server服务 进入seata的bin目录点击执行seata-server.bat

微服务分布式事务解决方案Seata

微服务搭建步骤

第一步:添加pom依赖

<!‐‐seata‐‐> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring‐cloud‐starter‐alibaba‐seata</artifactId> <exclusions> <exclusion> <artifactId>seata‐all</artifactId> <groupId>io.seata</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata‐all</artifactId> <version>${seata.version}</version> </dependency>

第二步:写注解 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class Tulingvip06MsAlibabaOrderApplication { public static void main(String[] args) { SpringApplication.run(Tulingvip06MsAlibabaOrderApplication.class, args); } } 

微服务发起者需要写全局事务注解(这里是order服务为发起者)

@GlobalTransactional(name = “prex-create-order”,rollbackFor = Exception.class)

@GlobalTransactional(name = "prex‐create‐order",rollbackFor = Exception.class) @Override public void createOrder(Order order) { log.info("当前 XID: {}", RootContext.getXID()); log.info("下单开始,用户:{},商品:{},数量:{},金额:{}", order.getUserId(), order.getProductId(), order.getCount(), order.getPayMoney()); //创建订单 order.setStatus(0); orderMapper.saveOrder(order); log.info("保存订单{}", order); //远程调用库存服务扣减库存 log.info("扣减库存开始"); remoteStorageService.reduceCount(order.getProductId(), order.getCount()); log.info("扣减库存结束"); //远程调用账户服务扣减余额 log.info("扣减余额开始"); remoteAccountService.reduceBalance(order.getUserId(), order.getPayMoney()); log.info("扣减余额结束"); //修改订单状态为已完成 log.info("修改订单状态开始"); orderMapper.updateOrderStatusById(order.getId(),1); log.info("修改订单状态结束"); log.info("下单结束"); }

 第三步:写配置添加代理数据源配置

@Configuration @MapperScan(basePackages = {"com.demo.seata.mapper"}) public class MyBatisConfig { / * 从配置文件获取属性构造datasource,注意前缀,这里用的是hikari,根据自己情况配置, * 原生datasource前缀取"spring.datasource" * * @return */ @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public DataSource hikariDataSource() { return new HikariDataSource(); } / * 构造datasource代理对象,替换原来的datasource * * @param hikariDataSource * @return */ @Primary @Bean("dataSource") public DataSourceProxy dataSourceProxy(DataSource hikariDataSource) { return new DataSourceProxy(hikariDataSource); } @Bean public SqlSessionFactoryBean sqlSessionFactory(DataSourceProxy dataSourcePr oxy) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternRes olver() .getResources("classpath:/mybatis/mapper//*.xml")); sqlSessionFactoryBean.setConfigLocation(new PathMatchingResourcePatternReso lver().getResource("classpath:/mybatis/mybatis‐config.xml")); sqlSessionFactoryBean.setTypeAliasesPackage("com.tuling.seata.domin"); sqlSessionFactoryBean.setDataSource(dataSourceProxy); return sqlSessionFactoryBean; } }

第四步:修改配置文件 yml中添加配置文件

#seata配置(配置事务组 需要和seata‐server的配置一样) spring.cloud.alibaba.seata.tx‐service‐group=prex_tx_group

 修改file.conf 和register.conf文件(跟seata-server的改动一样)

微服务分布式事务解决方案Seata

 4:微服务测试

http://localhost:8081/order/create?userId=1&productId=1&count=1&payMoney=50

4.1)正常情况 

微服务分布式事务解决方案Seata

 微服务分布式事务解决方案Seata

库存库 

微服务分布式事务解决方案Seata

 微服务分布式事务解决方案Seata

4.2)异常情况,我们把支付服务人工模拟抛出异常。 

微服务分布式事务解决方案Seata

微服务分布式事务解决方案Seata

微服务分布式事务解决方案Seata

 库存库:

微服务分布式事务解决方案Seata

微服务分布式事务解决方案Seata

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232112.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ureport 显示html,UReport2 与业务结合

    ureport 显示html,UReport2 与业务结合本小节中我们将介绍如何在业务页面中展示报表、导出报表文件、引用报表内容等操作。报表相关URL在配置好一个包含UReport2的项目后,就可以运行我们的项目,打开UReport2的基于网页的报表设计器,它的地址如下:UReport2报表设计器URLhttp://host[:port][/context-path]/ureport/designer如果我们是在本地启动项目,并且服务器端口号为8080,…

    2025年7月3日
    8
  • 射频资料型号:RC522_RFID射频模块资料原厂代码PCB相关参考资料

    射频资料型号:RC522_RFID射频模块资料原厂代码PCB相关参考资料

    2022年7月14日
    15
  • base64编码图片数据存储服务器

    base64编码图片数据存储服务器如果直接提交base64编码图片数据,过大的话后台会出现转发错误问题。我在刚开始接触base64编码图片数据时,就是把base64编码图片数据传到后台来解码生成图片。导致生成的图片无法打开,后来才发现其实传到后台的base64编码根本就不完整,导致解码出现问题,无法显示图片。所以,base64编码只能在前端处理。后来查阅资料,看见一个不错的解决方式就是

    2022年4月13日
    52
  • WinRAR去广告心得

    WinRAR去广告心得学习winAPI函数CreateWindow函数 软件创建窗口分为1首先注册2开始创建3显示分别有各自函数形成 还要有消息传递机制每个窗口有自己的类注意类函数参数问题   Winrar5.4去广告首先下断创建窗口函数进而多次运行暂停知道找到广告出现的窗口class追踪函数入口ret掉注意堆栈平衡

    2022年5月23日
    31
  • 推荐书籍:FFmpeg从入门到精通

    推荐书籍:FFmpeg从入门到精通本书是一本介绍FFmpeg的实战技术指南,全书共10章,分为两个部分。第一部分部分(第1~7章)为FFmpeg的命令行使用篇,介绍了FFmpeg的基础组成部分、FFmpeg工具使用、FFmpeg的封装操作、FFmpeg的转码操作、FFmpeg的流媒体操作、FFmpeg的滤镜操作、FFmpeg的设备操作。第二部分(第8~10章)为FFmpeg的API使用篇,介绍了FFmpeg封装部分的API使用操作、FFmpeg编解码部分的API使用操作,FFmpeg滤镜部分的API使用操作,相关操作均以实例方式进行

    2022年6月26日
    25
  • veryCD 不能下载了,我们该怎么办?

    veryCD 不能下载了,我们该怎么办?程序员一般都是看教学视频,自己学习,想要大牛手把手教你,估计是不可能的,原来大家都喜欢veryCD这个免费分享平台,可是近期它关掉了,没办法,所有免费的软件资源都下载不了,笔者最近也想下载国嵌的视频,觉得讲的不错,可惜,哎。不过,这些也难不倒学计算机的同学们,veryCD关闭了ed2k的服务,不代表我们迅雷不可以下载ed2k的东西,于是我们要利用百度的力量:我们下载国嵌的usb描述符一类

    2022年8月10日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号