二、Seata的快速开始

文章目录

  • Seata的快速开始
    • Seata简介
    • Seata术语
        • TC (Transaction Coordinator) - 事务协调者
        • TM (Transaction Manager) - 事务管理器
        • RM (Resource Manager) - 资源管理器
    • Seata-Server下载(Windows环境1.4.2版本)
    • Seata-Server配置(使用Nacos为注册和配置中心)
    • 启动(基于Windows环境)


Seata的快速开始

Seata简介

官网:https://seata.io/zh-cn/docs/overview/what-is-seata.html

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

二、Seata的快速开始_第1张图片

在我们的微服务系统中,对应业务被对应的拆分成独立模块,在上面官方提供的架构图中,我们可以看出当前是三个服务:

  • 仓储服务(Stock):对给定的商品进行增删操作记录数量
  • 订单服务(Order):根据采购者的需求创建订单
  • 账户服务(Account):从用户账户中扣除余额、积分等

在这套架构中,用户下单购买商品的业务,就需要三个服务来完成,每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题就没办法保证,Seata就是来进行解决这种问题的解决方案。

Seata术语

TC (Transaction Coordinator) - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

二、Seata的快速开始_第2张图片

Seata-Server下载(Windows环境1.4.2版本)

官方下载地址:https://github.com/seata/seata/releases

二、Seata的快速开始_第3张图片

下载完成之后,进行解压

二、Seata的快速开始_第4张图片

Seata-Server配置(使用Nacos为注册和配置中心)

(1)首先,我们打开conf目录,找到registry.conf文件

二、Seata的快速开始_第5张图片

(2)修改registry.conf配置文件,修改Seata的注册中心和配置中心为Nacos(seata默认的type为file)

二、Seata的快速开始_第6张图片

二、Seata的快速开始_第7张图片

(3)接着我们需要修改Seata的存储模式,修改file.conf文件,把Seata的默认存储模式修改为数据库"db",同时需要配置JDBC

Server端存储模式(store.mode)支持三种:

  1. file:单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高(默认)
  2. DB:高可用模式,全局事务会话信息通过DB共享,相对性能差一些
  3. redis:Seata-Server1.3及以上版本支持,性能较高,存在事务信息丢失风险,需要配合实际场景使用

二、Seata的快速开始_第8张图片

注意:
driverClassName驱动的配置需要根据mysql的版本决定:
mysql5之前使用 driverClassName = “com.mysql.jdbc.Driver
mysql5之后使用 driverClassName = “com.mysql.cj.jdbc.Driver

二、Seata的快速开始_第9张图片

找到以下对应的db配置,要注意其中涉及到了三个表,分别是global_table(全局事务会话表),branch_table(分支事务会话表),lock_table(锁数据表)

二、Seata的快速开始_第10张图片

## transaction log store, only used in seata-server
store {
  ## store mode: file、db、redis
  mode = "db"
  ## rsa decryption public key
  publicKey = ""
  ## file store property
  file {
    ## store location dir
    dir = "sessionStore"
    # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
    maxBranchSessionSize = 16384
    # globe session size , if exceeded throws exceptions
    maxGlobalSessionSize = 512
    # file buffer size , if exceeded allocate new buffer
    fileWriteBufferCacheSize = 16384
    # when recover batch read size
    sessionReloadReadSize = 100
    # async, sync
    flushDiskMode = async
  }

  ## database store property
  db {
    ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
    datasource = "druid"
    ## mysql/oracle/postgresql/h2/oceanbase etc.
    dbType = "mysql"
    driverClassName = "com.mysql.cj.jdbc.Driver"
    ## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
    url = "jdbc:mysql://127.0.0.1:3306/seata?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8"
    user = "root"
    password = "123456"
    minConn = 5
    maxConn = 100
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }

  ## redis store property
  redis {
    ## redis mode: single、sentinel
    mode = "single"
    ## single mode property
    single {
      host = "127.0.0.1"
      port = "6379"
    }
    ## sentinel mode property
    sentinel {
      masterName = ""
      ## such as "10.28.235.65:26379,10.28.235.65:26380,10.28.235.65:26381"
      sentinelHosts = ""
    }
    password = ""
    database = "0"
    minConn = 1
    maxConn = 10
    maxTotal = 100
    queryLimit = 100
  }
}

(4)最后我们需要新建一个seata数据库(名称为JDBC的连接名称),然后建表

二、Seata的快速开始_第11张图片

建表语句地址:https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql

-- -------------------------------- 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_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- 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 = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`),
    KEY `idx_xid_and_branch_id` (`xid` , `branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

其中distributed_lock为Seata新版本加的锁表,由于我们使用的版本为1.4.2版本,暂且不需要

启动(基于Windows环境)

启动步骤为,先启动Nacos,然后再启动Seata-Server

  1. Nacos启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

二、Seata的快速开始_第12张图片

  1. 启动Seata-Server的方式非常简单,直接双击此文件即可: seata-server-1.4.2\bin\seata-server.bat

二、Seata的快速开始_第13张图片

启动完成效果:

二、Seata的快速开始_第14张图片

然后在nacos控制台上就可以看到seata-server:

二、Seata的快速开始_第15张图片

你可能感兴趣的:(Seata,java,后端,spring,cloud,分布式,微服务)