首页 > 其他分享 >开源分布式事务中间件Seata使用指南

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

时间:2022-11-30 22:33:08浏览次数:73  
标签:事务 NULL Seata 中间件 server zero 使用指南 id log


介绍

 

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

 

初衷

  • 对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
  • 高性能:减少分布式事务解决方案所带来的性能消耗

 

分布式事务定义

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

 

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

 

 

设计

 

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

 

AT

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

 

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

基本组件:

  • 事务协调器(TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
  • Transaction Manager(TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
  • 资源管理器(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。

 

处理流程:

  1. TM要求TC开始新的全局事务。TC生成表示全局事务的XID。
  2. XID通过微服务的调用链传播。
  3. RM将本地事务注册为XID到TC的相应全局事务的分支。
  4. TM要求TC提交或回滚XID的相应全局事务。
  5. TC在XID的相应全局事务下驱动所有分支事务以完成分支提交或回滚。

 

开源分布式事务中间件Seata使用指南_全局事务_03

 

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使用指南_微服务架构_04

 

 

zero-provider-a:

  • 配置application.yml

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

 

  • File.conf

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

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

default.grouplist = "127.0.0.1:8091"

 

开源分布式事务中间件Seata使用指南_微服务架构_06

 

  • Registry.conf

开源分布式事务中间件Seata使用指南_微服务架构_07

 

  • 编写Entity

开源分布式事务中间件Seata使用指南_微服务架构_08

 

  • 编写Repository

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

 

  • 编写Service

开源分布式事务中间件Seata使用指南_全局事务_10

 

  • 编写代码Controller

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

 

  • DataSource

开源分布式事务中间件Seata使用指南_微服务架构_12

 

zero-provider-b

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

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

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

 

 

zero-consumer

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

 

  • feignClient

开源分布式事务中间件Seata使用指南_微服务架构_14

 

  • feignclient

开源分布式事务中间件Seata使用指南_微服务架构_15

 

  • Service

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

 

  • Controller

开源分布式事务中间件Seata使用指南_全局事务_17

 

测试

启动Seata Server

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

 

DROP SCHEMA IF EXISTS zeroa;

CREATE SCHEMA zeroa;

USE zeroa;



CREATE TABLE `undo_log` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`branch_id` bigint(20) NOT NULL,

`xid` varchar(100) NOT NULL,

`context` varchar(128) NOT NULL,

`rollback_info` longblob NOT NULL,

`log_status` int(11) NOT NULL,

`log_created` datetime NOT NULL,

`log_modified` datetime NOT NULL,

`ext` varchar(100) DEFAULT 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(20) NOT NULL AUTO_INCREMENT,

`branch_id` bigint(20) NOT NULL,

`xid` varchar(100) NOT NULL,

`context` varchar(128) NOT NULL,

`rollback_info` longblob NOT NULL,

`log_status` int(11) NOT NULL,

`log_created` datetime NOT NULL,

`log_modified` datetime NOT NULL,

`ext` varchar(100) DEFAULT 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使用指南_spring_18

 

正常执行事务

开源分布式事务中间件Seata使用指南_微服务架构_19

 

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

 

执行事务回滚

开源分布式事务中间件Seata使用指南_全局事务_20

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

标签:事务,NULL,Seata,中间件,server,zero,使用指南,id,log
From: https://blog.51cto.com/u_11976981/5900678

相关文章

  • 中间件笔记
    “中间件”的概念会经常遇到,那么什么是中间件呢?在分布式系统中也遇到了中间件:是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中......
  • Mysql使用指南
    创建数据库createdatabasedatabase_name;查看已有数据库showdatabases;支持汉字ALTERDATABASEdatabase_nameCHARACTERSETUTF8;切换进入数据库usedataba......
  • rocketmq-spring-boot-starter使用指南
    ​​https://github.com/javahongxi/whatsmars.git​​针对官方starter修改点​​官方​​支持连接多个集群(订阅)(官方一个应用只能连接一个集群)顺序消息消费失败,可配重......
  • 京东消息中间件JMQ
    [京东技术]京东的MQ经历了JQ->AMQ->JMQ的发展,其中JQ的基于关系数据库,严格意义上讲称不上消息中间件,JMQ的存储是JFS和HBase,AMQ即ActiveMQ,本文说说JMQ。JMQ是京东自主研发的一......
  • 京东消息中间件的演进
    本文将简单介绍下京东消息中间件的演进历程。以及作为消息中间件在每一代产品中我们是如何解决MQ面临的一些通用问题,比如:如何处理IO,消息如何存储,消息如何路由等等。......
  • 【架构】中间件架构
    zookeeper:Leader、follower、Observerhttps://developer.aliyun.com/article/687903zaxb原子广播协议,保证了各个Server之间的同步。数据一致性与paxos算法为了保证事......
  • 普元中间件Primeton AppServer6.5安装(Windows)
    本文在Windows环境下安装普元中间件PrimetonAppServer6.5(以下简称PAS)一、安装前准备1.1使用软件版本Primeton_AppServer_6.5_Enterprise_Editio(Windows)1.2安装前注意......
  • 关于Seata(1.4.2)环境搭建
    转载一:https://blog.csdn.net/xiaoguo1001/article/details/126812465?ops_request_misc=&request_id=&biz_id=102&utm_term=Seata-1.4.2%E7%89%88%E6%9C%AC%E5%AE%89%E8%A......
  • git使用指南
    Git配置ssh:一、设置Git的username和email:$gitconfig--globaluser.name"用户名"$gitconfig--globaluser.email"用户邮箱"二、生成SSH密钥过程:1.查看是否已......
  • BurpSuite使用指南-使用Burp Sequencer
    BurpSequencerBurpSequencer作为BurpSuite中一款用于检测数据样本随机性质量的工具,通常用于检测访问令牌是否可预测、密码重置令牌是否可预测等场景,通过Sequencer的数据......