开源分布式事务中间件Seata使用指南
admin
2023-04-02 04:41:45
0

介绍


Seata 是阿里巴巴开源的分布式事务中间件,一种分布式事务解决方案,具有高性能和易于使用的微服务架构。


初衷

  • 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入

  • 高性能:减少分布式事务解决方案所带来的性能消耗


分布式事务定义

分布式事务是一个全局事务,由一批分支事务组成,通常分支事务只是本地事务。


开源分布式事务中间件Seata使用指南



设计


Seata中有两种分布式事务实现方案,AT和TCC。


AT

AT模式是基于XA事务演进而来,核心是对业务无侵入,是一种改进后的两阶段提交,需要数据库支持。


开源分布式事务中间件Seata使用指南

基本组件:

  • 事务协调器(TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。

  • Transaction Manager(TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。

  • 资源管理器(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。


处理流程:

  1. TM要求TC开始新的全局事务。TC生成表示全局事务的XID。

  2. XID通过微服务的调用链传播。

  3. RM将本地事务注册为XID到TC的相应全局事务的分支。

  4. TM要求TC提交或回滚XID的相应全局事务。

  5. TC在XID的相应全局事务下驱动所有分支事务以完成分支提交或回滚。


开源分布式事务中间件Seata使用指南


TCC

Seata要求每个接口实现prepare、commit、rollback。


与 AT 模式一样,在运行时,该切面会拦截所有对 TCC 接口的调用。每调用一次 Try 接口,切面会先向 TC 注册一个分支事务,然后才去执行原来的 RPC 调用。当请求链路调用完成后,TC 通过分支事务的资源 ID 回调到正确的参与者去执行对应 TCC 资源的 Confirm 或 Cancel 方法。


  1. 初步操作 Try:完成所有业务检查,预留必须的业务资源。

  2. 确认操作 Confirm:真正执行的业务逻辑,不做任何业务检查,只使用 Try 阶段预留的业务资源。因此,只要 Try 操作成功,Confirm 必须能成功。另外,Confirm 操作需满足幂等性,保证一笔分布式事务能且只能成功一次。

  3. 取消操作 Cancel:释放 Try 阶段预留的业务资源。同样的,Cancel 操作也需要满足幂等性。


Seata Server安装


1.下载最新版本的 Seata Sever

https://github.com/seata/seata/releases


2. 解压并启动 Seata server


unzip seata-server-xxx.zip
cd distribution
sh ./bin/seata-server.sh 8091 file



示例

场景:

把数据库zeroa中proxy表的一条数据转移到数据库zerob中proxy表里面。


模块:

zero-discovery-server:注册中心

zero-gateway-server:服务网关

zero-consumer:服务消费者

zero-provider-a:服务提供者A

zero-provider-b:服务提供者B


架构及版本:

Spring-cloud:Finchley.BUILD-SNAPSHOT

spring-cloud-starter-netflix-eureka-server:2.0.4.BUILD-SNAPSHOT

spring-cloud-starter-netflix-eureka-client:2.0.4.BUILD-SNAPSHOT

spring-cloud-starter-gateway:2.0.4.BUILD-SNAPSHOT

spring-cloud-starter-openfeign:2.0.0.RELEASE

spring-boot:2.0.0.RELEASE

spring-boot-starter-data-jpa:2.0.0.RELEASE

spring-cloud-alibaba-seata:0.9.1.BUILD-SNAPSHOT

seata-all:0.6.1

mysql-connector-java:8.0.11

druid-spring-boot-starter:1.1.18


mysql:5.7

seata-server-0.6.1


实现:

zero-gateway-server

  • 配置application.yml

开源分布式事务中间件Seata使用指南



zero-provider-a:

  • 配置application.yml

开源分布式事务中间件Seata使用指南


  • File.conf

主要配置应用名称和seata server地址

vgroup_mapping.${spring.application.name}-fescar-service-group="default"

default.grouplist = "127.0.0.1:8091"


开源分布式事务中间件Seata使用指南


  • Registry.conf

开源分布式事务中间件Seata使用指南


  • 编写Entity

开源分布式事务中间件Seata使用指南


  • 编写Repository

开源分布式事务中间件Seata使用指南


  • 编写Service

开源分布式事务中间件Seata使用指南


  • 编写代码Controller

开源分布式事务中间件Seata使用指南


  • DataSource

开源分布式事务中间件Seata使用指南


zero-provider-b

配置同zero-provider-a工程,编写相应的业务逻辑。

在处理添加业务时,抛出异常。

开源分布式事务中间件Seata使用指南



zero-consumer

配置同zero-provider-a工程,编写相应的业务逻辑。


  • feignClient

开源分布式事务中间件Seata使用指南


  • feignclient

开源分布式事务中间件Seata使用指南


  • Service

开源分布式事务中间件Seata使用指南


  • Controller

开源分布式事务中间件Seata使用指南


测试

启动Seata Server

启动Mysql,并初始化(每个库都要创建undo_log表)


DROP SCHEMA IF EXISTS zeroa;

CREATE SCHEMA zeroa;

USE zeroa;



CREATE TABLE `undo_log` (

  `id` bigint(20NOT NULL AUTO_INCREMENT,

  `branch_id` bigint(20NOT NULL,

  `xid` varchar(100NOT NULL,

  `context` varchar(128NOT NULL,

  `rollback_info` longblob NOT NULL,

  `log_status` int(11NOT NULL,

  `log_created` datetime NOT NULL,

  `log_modified` datetime NOT NULL,

  `ext` varchar(100DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)

ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;



DROP SCHEMA IF EXISTS zerob;

CREATE SCHEMA zerob;

USE zerob;



CREATE TABLE `undo_log` (

  `id` bigint(20NOT NULL AUTO_INCREMENT,

  `branch_id` bigint(20NOT NULL,

  `xid` varchar(100NOT NULL,

  `context` varchar(128NOT NULL,

  `rollback_info` longblob NOT NULL,

  `log_status` int(11NOT NULL,

  `log_created` datetime NOT NULL,

  `log_modified` datetime NOT NULL,

  `ext` varchar(100DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)

ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


启动

zero-discovery-server

zero-gateway-server

zero-provider-a

zero-provider-b

zero-consumer


添加数据

开源分布式事务中间件Seata使用指南


正常执行事务

开源分布式事务中间件Seata使用指南


可在两张表中查看数据(a库中删除id=2的数据,b库中添加了一条数据)。


执行事务回滚

开源分布式事务中间件Seata使用指南

查看数据库数据(没有变化)。


相关内容

热门资讯

涉及文物归还,马克龙:这一进程... 据法新社报道,法国总统马克龙当地时间5月11日在肯尼亚内罗毕举行的经济峰会上表示,归还殖民时期掠夺的...
对话郑永年:中美关系已走到历史... 编者按2026.05.11特朗普要来了。5月13日至15日,美国元首时隔9年再度访华,也是特朗普本人...
他信入狱8个月后获释,还能冲击... 澎湃新闻记者 黄粤涵据央视新闻报道,当地时间5月11日上午,泰国前总理他信假释出狱。尽管代表他信家族...
成龙赠台故宫“兽首”被政治化,... 中国台湾网5月11日讯 据台媒“中时新闻网”报道, 近日,关于台北故宫博物院南院受赠的“十二生肖兽首...
急需解答墙砖600mm地砖30... 其实无论您家在墙砖与地砖上使用的是多大的尺寸,在衔接的位置上用上压下的做法去连接即可。也就是我们平时...
卫生间水龙头的水发黄怎么办 如果卫生间水龙头的水发黄,可以尝试以下方法解决:1. 检查水源:确定是否整个家庭的水源都有问题。2....
电视机待机开关故障 电视机待机开关故障是指在待机(或休眠、关机)状态下,电视机的电源开关无法正常地控制电视机的开启或关闭...
我的装修目前在瓦工阶段,水电视... 只要大家通过齐家网找装修公司,那能够享受的服务都是非常齐全的,齐家能够提供保单服务,而且也会有第三方...
按了电视上的待机键打不开电视了 1、可能是电视机未接通电来源或未打开机身的电源开关导致开不了机。2、可能是电视机处于待机自状态开不了...
5A景区不该连基本的环境卫生都... 澎湃特约评论员 熊志5月11日,澎湃新闻正式推出《给5A体个检》系列报道,首期聚焦邯郸广府古城景区,...