问题 seata_架构设计 | 基于Seata中间件,微服务模式下事务管理

一、Seata简介

1、Seata组件

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

2、支持模式

AT 模式

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java应用,通过 JDBC 访问数据库。

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。

TCC模式

一个分布式的全局事务,整体是两阶段提交的模型,全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即需要每个分支事务都具备自己的:

一阶段 prepare 行为

二阶段 commit 或 rollback 行为

Saga模式

Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

XA模式

XA是一个分布式事务协议,对业务无侵入的分布式事务解决方案,XA提交协议需要事务参与者的数据库支持,XA事务具有强一致性,在两阶段提交的整个过程中,一直会持有资源的锁,性能不理想的缺点很明显。

二、服务端部署

1、下载组件包

1.2版本:seata-server-1.2.0.zip

解压目录

  • bin:存放服务端运行启动脚本;
  • lib:存放服务端依赖的资源jar包;
  • conf:配置文件目录。

2、修改配置

file.conf配置

mode:db 即使用数据库存储事务信息,这里还可以选择file存储方式。

file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

store {  ## store mode: file、db  mode = "db"  db {    datasource = "druid"    dbType = "mysql"    driverClassName = "com.mysql.jdbc.Driver"    url = "jdbc:mysql://127.0.0.1:3306/seata_server"    user = "root"    password = "123456"    minConn = 5    maxConn = 30    globalTable = "global_table"    branchTable = "branch_table"    lockTable = "lock_table"    queryLimit = 100    maxWait = 5000  }}

registry.conf配置

这里选择eureka作为注册中心,seata-server也要作为一个服务添加到注册中心,不使用配置中心所以config配置默认即可。

registry {  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa  type = "eureka"  eureka {    serviceUrl = "http://localhost:8761/eureka"    application = "default"    weight = "1"  }}

3、事务管理表

需要在seata-server即上述配置的MySQL库中建立3张事务管理表:

  • 全局事务:global_table
  • 分支事务:branch_table
  • 全局锁:lock_table
  • 事务回滚:undo_log
  • SQL脚本:mysql-script目录

4、启动命令

Linux环境:sh seata-server.sh

三、业务服务搭建

1、代码结构

fabc9c38036de151275268488d4e7897.png
  • seata-eureka:注册中心
  • seata-order:订单服务
  • seata-account:账户服务
  • seata-inventor:库存服务
  • seata-client:客户端服务
  • account-feign:账户Feign接口
  • inventory-feign:库存Feign接口
  • order-feign:订单Feign接口

请求链路:客户端->订单->账户+库存,测试整个流程的分布式事务问题。

2、数据库结构

3bc46e9f790d1e28c719b92e73ac867a.png
  • seata_server:seata组件服务端依赖库
  • seata_account:模拟账户数据库
  • seata_inventor:模拟库存数据库
  • seata_order:模拟订单数据库

各个库脚本位置:mysql-script/data-biz.sql

3、启动服务

依次启动:注册中心,库存服务,账户服务,订单服务,客户端服务;

Eureka服务列表如下:

c6dec6a0903532b8de95195d5cde45c7.png

四、Seata用法详解

1、Seata基础配置

4d3ed8e98084e7b269f721817a554d1f.png

几个基础服务的配置方式一样。

conf配置

file.conf重点关注下面内容,事务组的名称,需要在yml文件中使用。

my_test_tx_group = "default"

registry.conf:是注册中心的选择。

2、数据库配置

注意这里的事务组名称配置。

spring:  # 事务组的名称  cloud:    alibaba:      seata:        tx-service-group: my_test_tx_group  # 数据源配置  datasource:    type: com.alibaba.druid.pool.DruidDataSource    druid:      driverClassName: com.mysql.jdbc.Driver      url: jdbc:mysql://127.0.0.1:3306/seata_account      username: root      password: 123456

将数据库整体由Seata进行代理管理,核心API:DataSourceProxy。

@Configurationpublic class SeataAccountConfig {    @Value("${spring.application.name}")    private String applicationName;    @Bean    public GlobalTransactionScanner globalTransactionScanner() {        return new GlobalTransactionScanner(applicationName, "test-tx-group");    }    @Bean    @ConfigurationProperties(prefix = "spring.datasource.druid")    public DruidDataSource druidDataSource() {        return new DruidDataSource() ;    }    @Primary    @Bean("dataSource")    public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {        return new DataSourceProxy(druidDataSource);    }    @Bean    public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSourceProxy);        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()                .getResources("classpath*:/mapper/*.xml"));        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());        return sqlSessionFactoryBean.getObject();    }}

3、业务代码

核心注解:GlobalTransactional,管理整体的分布式事务。

@Servicepublic class OrderServiceImpl implements OrderService {    private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);    @Resource    private OrderMapper orderMapper ;    @Resource    private AccountFeign accountFeign ;    @Resource    private InventoryFeign inventoryFeign ;    @GlobalTransactional    @Override    public Integer createOrder(String orderNo) {        LOGGER.info("Order 生成中 "+orderNo);        // 本服务下订单库        Integer insertFlag = orderMapper.insert(orderNo) ;        // 基于feign接口处理账户和库存        accountFeign.updateAccount(10L) ;        inventoryFeign.updateInventory(10) ;        return insertFlag ;    }}

测试流程:在任意服务下抛出异常,观察整体的事务状态,观察是否有整体的事务控制效果。


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

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

相关文章

Override and Overload (重写和重载)

1)方法的重写overriding和重载overloading是java多态性的不同表现. (2)重写overriding是父类与子类之间的多态性的一种表现,重载是一个类中多态性的表现。如果子类中定义方法与其父类有相同的名称和参数,我们说该方法被…

程序员史诗级必读书单吐血整理四个维度系列80+本书(珍藏版)

互联网行业的特点是变化。若要提高互联网开发的技能,就必须跟上技术发展的步伐。埋首醉心于项目开发与实战,固然能够锤炼自己的开发技巧,却难免受限于经验与学识。 世界上并不存在速成的终南捷径,但阅读好的技术书籍,尤…

示波器1m和50欧姆示阻抗匹配_示波器输入阻抗选1MΩ还是50Ω的详细解析

熟悉示波器的朋友可能都会有过这样的困惑:输入阻抗有1MΩ和50Ω两种,我们到底该如何选择呢?一、传输线想要讲清楚50Ω的由来,我们需要先讲一下传输线。电信号实际上是以电磁波的形式在传输线中传播的。当传输线的尺寸不再远小于电…

前端学习(355):小练习

.已知两个矩形,宽高分别是200200,400400,甲矩形的坐标是x1,y1.乙矩形的坐标是x2,y2. 写出判断条件两个矩形是否相碰撞 <script>x1200;//自己随意定义坐标x2200;y1400;y2400;var boolfalse;//先定义一个布尔值为falseif(x1>x2 && x1<x2400 && y1&g…

Quartus 中快速分配器件管脚

在quartus中分配器件管脚最笨的方法是对于器件手册一个一个的敲进去&#xff0c;这样做如果用到的管脚很好还没有发觉什么不好&#xff0c;但是当用到的器件管脚很多的时候就会发现很麻烦&#xff0c;而且容易出错。接下来我来介绍一种很方便的方法。 首先在txt文档中建立管脚和…

Web前端书单从HTML到JS到AJAX到HTTP从框架到全栈

前言&#xff1a;技术书阅读方法论 一.速读一遍&#xff08;最好在1~2天内完成&#xff09; 人的大脑记忆力有限&#xff0c;在一天内快速看完一本书会在大脑里留下深刻印象&#xff0c;对于之后复习以及总结都会有特别好的作用。 对于每一章的知识&#xff0c;先阅读标题&…

自定义背景_新版快绘精选:自定义背景墙 | 吊顶 | 云渲染滤镜升级

New自定义背景墙没有合适的背景墙样板&#xff1f;你需要一个全世界独一无二&#xff0c;独属于你monent的背景墙&#xff1f;没问题&#xff01;无论是要这样↓还是这样↓快绘都能帮到你&#xff01;-- 请观看视频 --New自定义吊顶除了可以自定义背景墙&#xff0c;新版快绘也…

【C++学习详细教程目录】

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信(进微信群加)&#xff1a; LyyCoder学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交…

删除开机选择系统

在我的电脑点右键--属性--高级--系统启动,系统失败和调试信息--设置--显示操作系统列表时间,和在需要时显示恢复选项的时间,在前面的小方格里打上构或去掉构就行了. 修改引导分区里面的BOOT.INI文件s C:\boot.ini 将只读属性去掉 [boot loader] timeout30 defaultmulti(0)dis…

底层知识学习记录目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信(进微信群加)&#xff1a; LyyCoder学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交…

cdn加载vue很慢_Vue.js 项目打包优化实践

首先上结果&#xff1a;把常用的 Vue&#xff0c;router&#xff0c;vuex&#xff0c;axios 的 runtime 包拆分了出来&#xff0c;改为 cdn&#xff1b;另外就是对于自己编写的业务代码进行分包&#xff0c;根据路由进行懒加载&#xff0c;可以较好的提高首屏加载速度。添加了全…

SharePoint 2010 网站模板要求在网站集中激活功能

从别人那里将其一个站点另存为模板&#xff0c;拷贝回来&#xff0c;上传到自己环境中的解决方案库里并激活。 然后新建站点&#xff0c;选择该模板&#xff0c;报如下错误&#xff1a; 解决方案&#xff1a; 打开在首要网站&#xff0c;网站操作---网站设置--网站集管理---网站…

C语言进阶深度学习目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信(进微信群加)&#xff1a; LyyCoder学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交…

一个c++ 2d图形引擎 AGG

相关站点http://www.antigrain.com/agg_docs/doc_tutorial.html 用法&#xff0c;学习中。。。 A. 这是个不错的中文介绍http://www.cnblogs.com/Kane_zzt/archive/2009/02/15/1271793.html 转载于:https://www.cnblogs.com/vilyLei/archive/2011/12/12/2284821.html

springboot 添加允许跨域_SpringBoot添加支持CORS跨域访问

CORS(Cross-Origin Resource Sharing)"跨域资源共享"&#xff0c;是一个W3C标准&#xff0c;它允许浏览器向跨域服务器发送Ajax请求&#xff0c;打破了Ajax只能访问本站内的资源限制&#xff0c;CORS在很多地方都有被使用&#xff0c;微信支付的JS支付就是通过JS向微…

前端学习(359):svn服务器配置金和客户端安装

右键---新建仓库 下一步 写入仓库名称 下一步 下一步 点击finish 创建完成 选择user 单击右键 创建账号密码 创建完成 下载客户端 点击next 点击next 一直next安装 安装完成发现小乌龟&#xff08;需要重启电脑&#xff09;

neo4j与mysql数据库_Neo4j: 迁移MySQL的数据到Neo4j

目的: 用于社交关系的管理和维护. 社交关系是一种网状的关系图, RDBMS难于维护这样的数据.安装和配置需要满足下面几个条件安装 neo4j-apoc-procedures插件安装 APOC插件设置一下环境变量NEO4J_INSTALL_PATH/path/to/neo4j安装插件和JDBC驱动把mysql-connector-java-8.0.11.jar…

ASP.NET中TextBox控件的AutoCompleteType属性(不保存历史输入记录)

ASP.NET AutoCompleteType 属性 返回 ASP.NET TextBox 控件参考手册 定义和用法 AutoCompleteType 属性用于设置或返回 TextBox 控件的 AutoComplete 种类。 为了协助用户的数据输入&#xff0c;Microsoft Internet Explorer 5 及更高版本和 Netscape 都支持名为自动完成的功能…

前端学习(360):svn操作前期连接工作

把地址发送给所有人 checkout 单击ok 得到账号密码