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 最新版本。

    1. # 创建目录
      $ 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 极简入门》文章。

    哔哔完这么多,我们开始正式部署单机 TC Server,这里艿艿使用 macOS 系统,和 Linux、Windows 是差不多的,胖友脑补翻译。

    Seata 下载页面,选择想要的 Seata 版本。这里,我们选择 v1.1.0 最新版本。

    1. # 创建目录
      $ 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 数据库。脚本内容如下:

    1. -- -------------------------------- 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 数据库,并在该库下执行该脚本。最终结果如下图:

    数据库 - MySQL 5.X

    ② 修改 conf/file 配置文件,修改使用 db 数据库,实现 Seata TC Server 的全局事务会话信息的共享。如下图所示:

    é???????

    ③ MySQL8 的支持

    如果胖友使用的 MySQL 是 8.X 版本,则需要看该步骤。否则,可以直接跳过。

    首先,需要下载 MySQL 8.X JDBC 驱动,命令行操作如下:

    1. $ 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 驱动。如下图所示: 

    ?°???o - MySQL 8.X

    《芋道 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 模式》
  • 示例:https://github.com/seata/seata-samples/blob/master/tcc
  • 《Seata 文档 —— Saga 模式》
  • 示例:https://github.com/seata/seata-samples/tree/master/saga
  • 4.4 XA 模式

    Seata 正在开发中...