seata快速入门
1. 概述
Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 目标打造一站式的分布事务的解决方案,最终会提供四种事务模式:
- AT 模式:参见《Seata AT 模式》文档
- TCC 模式:参见《Seata TCC 模式》文档
- Saga 模式:参见《SEATA Saga 模式》文档
- XA 模式:正在开发中...
目前使用的流行度情况是:AT > TCC > Saga。因此,我们在学习 Seata 的时候,可以花更多精力在 AT 模式上,最好搞懂背后的实现原理,毕竟分布式事务涉及到数据的正确性,出问题需要快速排查定位并解决。
友情提示:具体的流行度,胖友可以选择看看 Wanted: who's using Seata 每个公司登记的使用方式。
seata-dubbo
集成
SOFA-RPC
通过
seata-sofa-rpc
集成
Motan
通过
seata-motan
集成
gRPC
通过
seata-grpc
集成
Apache HttpClient
通过
seata-http
集成
Spring Cloud OpenFeign
通过
spring-cloud-starter-alibaba-seata
的feign
模块
Spring RestTemplate
通过
spring-cloud-starter-alibaba-seata
的rest
模块
同时方便我们集成到 Java 项目当中,Seata 也提供了相应的 Starter 库:
seata-spring-boot-starter
spring-cloud-starter-alibaba-seata
因为 Seata 是基于 DataSource 数据源进行代理来拓展,所以天然对主流的 ORM 框架提供了非常好的支持:
- MyBatis、MyBatis-Plus
- JPA、Hibernate
Wanted: who's using Seata 的登记情况,Seata 已经在国内很多团队开始落地,其中不乏有滴滴、韵达等大型公司。可汇总如下图:
另外,在 awesome-seata 仓库中,艿艿看到了滴滴等等公司的落地时的技术分享,还是非常真实可靠的。如下图所示:
从案例的情况来说,Seata 可能给是目前已知最可靠的分布式事务解决方案,至少对它进行技术投入是非常不错的选择。
Seata 下载页面,选择想要的 Seata 版本。这里,我们选择 v1.1.0 最新版本。
-
# 创建目录
$ mkdir -p /Users/yunai/Seata
$ cd /Users/yunai/Seata
# 下载
$ wget https://github.com/seata/seata/releases/download/v1.1.0/seata-server-1.1.0.tar.gz
# 解压
$ tar -zxvf seata-server-1.1.0.tar.gz
# 查看目录
$ cd seata
$ ls -ls
24 -rw-r--r-- 1 yunai staff 11365 May 13 2019 LICENSE
0 drwxr-xr-x 4 yunai staff 128 Apr 2 07:46 bin # 执行脚本
0 drwxr-xr-x 9 yunai staff 288 Feb 19 23:49 conf # 配置文件
0 drwxr-xr-x 138 yunai staff 4416 Apr 2 07:46 lib # seata-*.jar + 依赖库
「4. 接入 Java 应用」小节,开始使用 Seata 实现分布式事务。
discovery 目录。考虑到国内使用 Nacos 作为注册中心越来越流行,这里我们就采用它。
友情提示:如果对 Nacos 不了解的胖友,可以参考《Nacos 极简入门》文章。
# 创建目录 $ mkdir -p /Users/yunai/Seata $ cd /Users/yunai/Seata # 下载 $ wget https://github.com/seata/seata/releases/download/v1.1.0/seata-server-1.1.0.tar.gz # 解压 $ tar -zxvf seata-server-1.1.0.tar.gz # 查看目录 $ cd seata $ ls -ls 24 -rw-r--r-- 1 yunai staff 11365 May 13 2019 LICENSE 0 drwxr-xr-x 4 yunai staff 128 Apr 2 07:46 bin # 执行脚本 0 drwxr-xr-x 9 yunai staff 288 Feb 19 23:49 conf # 配置文件 0 drwxr-xr-x 138 yunai staff 4416 Apr 2 07:46 lib # seata-*.jar + 依赖库
discovery 目录。考虑到国内使用 Nacos 作为注册中心越来越流行,这里我们就采用它。
友情提示:如果对 Nacos 不了解的胖友,可以参考《Nacos 极简入门》文章。
友情提示:如果对 Nacos 不了解的胖友,可以参考《Nacos 极简入门》文章。
哔哔完这么多,我们开始正式部署单机 TC Server,这里艿艿使用 macOS 系统,和 Linux、Windows 是差不多的,胖友脑补翻译。
Seata 下载页面,选择想要的 Seata 版本。这里,我们选择 v1.1.0 最新版本。
-
# 创建目录
$ mkdir -p /Users/yunai/Seata
$ cd /Users/yunai/Seata
# 下载
$ wget https://github.com/seata/seata/releases/download/v1.1.0/seata-server-1.1.0.tar.gz
# 解压
$ tar -zxvf seata-server-1.1.0.tar.gz
# 查看目录
$ cd seata
$ ls -ls
24 -rw-r--r-- 1 yunai staff 11365 May 13 2019 LICENSE
0 drwxr-xr-x 4 yunai staff 128 Apr 2 07:46 bin # 执行脚本
0 drwxr-xr-x 9 yunai staff 288 Feb 19 23:49 conf # 配置文件
0 drwxr-xr-x 138 yunai staff 4416 Apr 2 07:46 lib # seata-*.jar + 依赖库
mysql.sql
脚本,初始化 Seata TC Server 的 db 数据库。脚本内容如下:
-
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(96),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
# 创建目录 $ mkdir -p /Users/yunai/Seata $ cd /Users/yunai/Seata # 下载 $ wget https://github.com/seata/seata/releases/download/v1.1.0/seata-server-1.1.0.tar.gz # 解压 $ tar -zxvf seata-server-1.1.0.tar.gz # 查看目录 $ cd seata $ ls -ls 24 -rw-r--r-- 1 yunai staff 11365 May 13 2019 LICENSE 0 drwxr-xr-x 4 yunai staff 128 Apr 2 07:46 bin # 执行脚本 0 drwxr-xr-x 9 yunai staff 288 Feb 19 23:49 conf # 配置文件 0 drwxr-xr-x 138 yunai staff 4416 Apr 2 07:46 lib # seata-*.jar + 依赖库
mysql.sql
脚本,初始化 Seata TC Server 的 db 数据库。脚本内容如下:
-
-- -------------------------------- The script used when storeMode is 'db' -------------------------------- -- the table to store GlobalSession data CREATE TABLE IF NOT EXISTS `global_table` ( `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `status` TINYINT NOT NULL, `application_id` VARCHAR(32), `transaction_service_group` VARCHAR(32), `transaction_name` VARCHAR(128), `timeout` INT, `begin_time` BIGINT, `application_data` VARCHAR(2000), `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`xid`), KEY `idx_gmt_modified_status` (`gmt_modified`, `status`), KEY `idx_transaction_id` (`transaction_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; -- the table to store BranchSession data CREATE TABLE IF NOT EXISTS `branch_table` ( `branch_id` BIGINT NOT NULL, `xid` VARCHAR(128) NOT NULL, `transaction_id` BIGINT, `resource_group_id` VARCHAR(32), `resource_id` VARCHAR(256), `branch_type` VARCHAR(8), `status` TINYINT, `client_id` VARCHAR(64), `application_data` VARCHAR(2000), `gmt_create` DATETIME(6), `gmt_modified` DATETIME(6), PRIMARY KEY (`branch_id`), KEY `idx_xid` (`xid`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8; -- the table to store lock data CREATE TABLE IF NOT EXISTS `lock_table` ( `row_key` VARCHAR(128) NOT NULL, `xid` VARCHAR(96), `transaction_id` BIGINT, `branch_id` BIGINT NOT NULL, `resource_id` VARCHAR(256), `table_name` VARCHAR(32), `pk` VARCHAR(36), `gmt_create` DATETIME, `gmt_modified` DATETIME, PRIMARY KEY (`row_key`), KEY `idx_branch_id` (`branch_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
在 MySQL 中,创建 seata
数据库,并在该库下执行该脚本。最终结果如下图:
② 修改 conf/file
配置文件,修改使用 db 数据库,实现 Seata TC Server 的全局事务会话信息的共享。如下图所示:
③ MySQL8 的支持
如果胖友使用的 MySQL 是 8.X 版本,则需要看该步骤。否则,可以直接跳过。
首先,需要下载 MySQL 8.X JDBC 驱动,命令行操作如下:
-
$ cd lib $ wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.19/mysql-connector-java-8.0.19.jar
然后,修改 conf/file
配置文件,使用该 MySQL 8.X JDBC 驱动。如下图所示:
《芋道 Spring Boot 分布式事务 Seata 入门》的「2. AT 模式 + 多数据源」小节,实现单体 Spring Boot 项目在多数据源下的分布式事务。
2、《芋道 Spring Boot 分布式事务 Seata 入门》的「AT 模式 + HttpClient 远程调用」小节,实现多个 Spring Boot 项目的分布事务。
② Dubbo
《Dubbo 分布式事务 Seata 入门》的「2. AT 模式」小节,实现多个 Dubbo 服务下的分布式事务。
③ Spring Cloud
《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》的「3. AT 模式 + Feign」小节,实现多个 Spring Cloud 服务下的分布式事务。
《Seata 文档 —— TCC 模式》
《Seata 文档 —— Saga 模式》
4.4 XA 模式
Seata 正在开发中...