微服务 SpringCloud Alibaba Seata处理分布式事务

微服务 SpringCloud Alibaba Seata处理分布式事务

  • 1. Seata概述
    • 1.1 分布式事务问题
    • 1.2 Seata简介
    • 1.3 Seata主要功能
    • 1.4 Seata特色功能
    • 1.5 Seata下载
    • 1.6 Seata使用教程
  • 2. Seata-Server安装
    • 2.1 Seata下载
    • 2.2 Seata配置
    • 2.3 mysql5.7数据库新建库seata。
    • 2.4 seata库里建表。
    • 2.5 registry.conf配置文件
    • 2.6 先启动Nacos端口号8848。
    • 2.7 启动seata-server。
  • 3. 订单/库存/账户业务数据库准备
    • 3.1 准备nacos与seata环境
    • 3.2 分布式事务业务说明
    • 3.3 创建数据库
    • 3.4 按照上述3库分别建对应业务表
    • 3.5 按照上述3库分别建对应的回滚日志表
    • 3.6 最终效果
  • 4. 订单/库存/账户业务微服务准备
    • 4.1 业务需求
    • 4.2 新建订单Order-Module
    • 4.3 新建库存Storage-Module
    • 4.4 新建账户Account-Module
  • 5. 测试验证
    • 5.1 启动服务
    • 5.2 正常下单
    • 5.3 异常情况
  • 6. Seata原理分析
    • 6.1 Seata概述
    • 6.2 分布式事务的执行流程
    • 6.3 Seata四大模式
    • 6.4 AT模式
      • AT模式是什么
      • 一阶段加载
      • 二阶段提交
      • 二阶段回滚

1. Seata概述

1.1 分布式事务问题

分布式事务就是 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题。

例如,在微服务分布式架构中,一次网上购买操作涉及到,订单系统,支付系统,积分系统,库存系统,物流系统。
一个业务逻辑,分别对应不同的系统,不同的数据源,其中一环出现问题,需要全部回退,这就是分布式事务要解决的问题。

1.2 Seata简介

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
官网地址:http://seata.io/zh-cn/
微服务 SpringCloud Alibaba Seata处理分布式事务_第1张图片

1.3 Seata主要功能

一个典型的分布式事务过程
分布式事务处理过程:一ID+三组件模型
在这里插入图片描述TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
可以理解为seata-server那个服务

TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
可以理解为事务的发起者带有@GlobalTransactional的服务。

RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
可以理解为不同的服务对应不同数据库,如订单服务,库存服务,账户金额服务。

1.4 Seata特色功能

微服务 SpringCloud Alibaba Seata处理分布式事务_第2张图片

1.5 Seata下载

发布说明:https://github.com/seata/seata/releases

1.6 Seata使用教程

Spring:本地@Transactional
SpringCloud Alibaba Seata:全局@GlobalTransactional,SEATA的分布式交易解决方案

2. Seata-Server安装

2.1 Seata下载

Seata官网地址:http://seata.io/zh-cn/
Seata下载地址:http://seata.io/zh-cn/blog/download.html

2.2 Seata配置

seata-server-0.9.0.zip解压到指定目录并修改conf目录下的file.conf配置文件
先备份原始file.conf文件
主要修改:自定义事务组名称+事务日志存储模式为db+数据库连接信息
file.conf,service模块:vgroup_mapping.my_test_tx_group = “fsp_tx_group”
file.conf,store模块:mode = “db”,url = “jdbc:mysql://127.0.0.1:3306/seata”, user = “root”, password = “123456”

微服务 SpringCloud Alibaba Seata处理分布式事务_第3张图片微服务 SpringCloud Alibaba Seata处理分布式事务_第4张图片

2.3 mysql5.7数据库新建库seata。

2.4 seata库里建表。

建表db_store.sql在\seata-server-0.9.0\seata\conf目录里面,执行db_store.sql。

微服务 SpringCloud Alibaba Seata处理分布式事务_第5张图片

2.5 registry.conf配置文件

修改seata-server-0.9.0\seata\conf目录下的registry.conf配置文件。
微服务 SpringCloud Alibaba Seata处理分布式事务_第6张图片

2.6 先启动Nacos端口号8848。

2.7 启动seata-server。

路径:softs\seata-server-0.9.0\seata\bin
命令:seata-server.bat

微服务 SpringCloud Alibaba Seata处理分布式事务_第7张图片

3. 订单/库存/账户业务数据库准备

3.1 准备nacos与seata环境

以下演示都需要先启动Nacos后启动Seata,保证两个都OK,先启动nacos否则Seata没启动报错no available server to connect。

3.2 分布式事务业务说明

业务说明:下订单–>扣库存–>减账户(余额)
微服务 SpringCloud Alibaba Seata处理分布式事务_第8张图片

3.3 创建数据库

seata_order: 存储订单的数据库。
seata_storage:存储库存的数据库。
seata_account: 存储账户信息的数据库。

CREATE DATABASE seata_order;
CREATE DATABASE seata_storage;
CREATE DATABASE seata_account;

3.4 按照上述3库分别建对应业务表

seata_order库下建t_order表

CREATE TABLE t_order (
	`id` BIGINT ( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`user_id` BIGINT ( 11 ) DEFAULT NULL COMMENT '用户id',
	`product_id` BIGINT ( 11 ) DEFAULT NULL COMMENT '产品id',
	`count` INT ( 11 ) DEFAULT NULL COMMENT '数量',
	`money` DECIMAL ( 11, 0 ) DEFAULT NULL COMMENT '金额',
	`status` INT ( 1 ) DEFAULT NULL COMMENT '订单状态:0:创建中; 1:已完结' 
) ENGINE = INNODB AUTO_INCREMENT = 7 DEFAULT CHARSET = utf8;

SELECT 	* FROM t_order;

seata_storage库下建t_storage表

CREATE TABLE t_storage (
	`id` BIGINT ( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY,
	`product_id` BIGINT ( 11 ) DEFAULT NULL COMMENT '产品id',
	`total` INT ( 11 ) DEFAULT NULL COMMENT '总库存',
	`used` INT ( 11 ) DEFAULT NULL COMMENT '已用库存',
	`residue` INT ( 11 ) DEFAULT NULL COMMENT '剩余库存' 
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8;

INSERT INTO t_storage ( `id`, `product_id`,`total` , `used`, `residue`)
VALUES ('1','1','100','0','100');

SELECT * from t_storage;

seata_account库下建t_account表

CREATE TABLE t_account (
	`id` BIGINT ( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'id',
	`user_id` BIGINT ( 11 ) DEFAULT NULL COMMENT '用户id',
	`total` DECIMAL ( 10, 0 ) DEFAULT NULL COMMENT '总额度',
	`used` DECIMAL ( 10, 0 ) DEFAULT NULL COMMENT '已用余额',
	`residue` DECIMAL ( 10, 0 ) DEFAULT '0' COMMENT '剩余可用额度' 
) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8;

INSERT INTO seata_account.t_account ( `id`, `user_id`, `total`, `used`, `residue` )
VALUES	( '1', '1', '1000', '0', '1000' );

SELECT * from t_account;

3.5 按照上述3库分别建对应的回滚日志表

订单-库存-账户3个库下都需要建各自的回滚日志表
\seata-server-0.9.0\seata\conf目录下的db_undo_log.sql

-- the table to store seata xid data
-- 0.7.0+ add context
-- you must to init this sql for you business databese. the seata server not need it.
-- 此脚本必须初始化在你当前的业务数据库中,用于AT 模式XID记录。与server端无关(注:业务数据库)
-- 注意此处0.3.0+ 增加唯一索引 ux_undo_log
drop table `undo_log`;
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;

3.6 最终效果

微服务 SpringCloud Alibaba Seata处理分布式事务_第9张图片

4. 订单/库存/账户业务微服务准备

4.1 业务需求

下订单->减库存->扣余额->改(订单)状态

4.2 新建订单Order-Module

详解git项目:seata-order-service2001

4.3 新建库存Storage-Module

详解git项目:seata-storage-service2002

4.4 新建账户Account-Module

详解git项目:seata-account-service2003

5. 测试验证

5.1 启动服务

1.启动nacos
2.启动seata
3.启动订单服务
4.启动账户服务
5.启动库存服务

5.2 正常下单

http://localhost:2001/order/create?userid=1&producrid=1&counr=10&money=100
数据库订单表正常,库存正常扣减,账户金额正常扣减。

5.3 异常情况

超时异常,没加@GlobalTransactional,当库存和账户余额扣减后,订单状态并没有设置为已经完成,没有从零改为1。
超时异常,添加@GlobalTransactional,订单,账户,库存全部回滚,数据正常。

6. Seata原理分析

6.1 Seata概述

2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案
Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务框架

6.2 分布式事务的执行流程

TM开启分布式事务(TM向TC注册全局事务记录)
换业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)
TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)
TC汇总事务信息,决定分布式事务是提交还是回滚
TC通知所有RM提交/回滚资源,事务二阶段结束。

6.3 Seata四大模式

AT 模式------默认模式,比较常用
提供无侵入自动补偿的事务模式,目前已支持 MySQL、 Oracle 、PostgreSQL和 TiDB的AT模式,H2 开发中

TCC 模式
支持 TCC 模式并可与 AT 混用,灵活度更高

SAGA 模式
为长事务提供有效的解决方案

XA 模式
支持已实现 XA 接口的数据库的 XA 模式

6.4 AT模式

AT模式是什么

这个官网写的很清楚,http://seata.io/zh-cn/docs/overview/what-is-seata.html
微服务 SpringCloud Alibaba Seata处理分布式事务_第10张图片

一阶段加载

微服务 SpringCloud Alibaba Seata处理分布式事务_第11张图片

二阶段提交

微服务 SpringCloud Alibaba Seata处理分布式事务_第12张图片

二阶段回滚

微服务 SpringCloud Alibaba Seata处理分布式事务_第13张图片

你可能感兴趣的:(微服务,seata,分布式事务)