分布式事务框架 Seata 入门案例

1.  Seata Server 部署
Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署 , TM和RM(Client端)由业务系统集成 。
首先,下载最新的安装包

分布式事务框架 Seata 入门案例

文章插图
也可以下载源码,然后本地编译 。最新的版本是1.5.2

分布式事务框架 Seata 入门案例

文章插图
下载后的启动包(或者源码)中有个scripts目录,里面有各种我们所需的脚本
分布式事务框架 Seata 入门案例

文章插图
Server端存储模式(store.mode)现有file、db、redis三种:
  • file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;(不推荐)
  • db模式为高可用模式,全局事务会话信息通过db共享 , 相应性能差些;
  • redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置;
修改配置文件
  • 启动包:seata-->conf-->application.yml
  • 源码包:根目录-->seata-server-->resources-->application.yml
主要修改的点是:
  • 修改store.mode="db或者redis"
  • 修改seata.config、seata.registry
  • 修改数据库连接|redis属性配置
在资源目录还有一个application.example.yml文件 , application.example.yml中附带额外配置,可以将其db|redis相关配置复制至application.yml , 进行修改store.db或store.redis相关属性 。
分布式事务框架 Seata 入门案例

文章插图
如果不使用外部配置中心,直接使用本地文件配置的话 , 那么最简单的配置可能是这样的:
server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seataseata:config:type: fileregistry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultstore:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true&useUnicode=true&serverTimezone=Asia/Shanghaiuser: rootpassword: 123456min-conn: 5max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 100max-wait: 5000security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login更多配置请参见 https://seata.io/zh-cn/docs/user/configurations.html
这里面哪些是Server端需要配置的,哪些是Client端需要配置的,以及每个参数的含义都解释得非常详细,强烈建议看一下,这里就不在赘述 。
此处注册中心用nacos
https://nacos.io/zh-cn/index.html
分布式事务框架 Seata 入门案例

文章插图
建表(默认数据库是seata)
USE `seata`;-- -------------------------------- The script used when storeMode is 'db' ---------------------------------- the table to store GlobalSession dataCREATE TABLE IF NOT EXISTS `global_table`(`xid`VARCHAR(128) NOT NULL,`transaction_id`BIGINT,`status`TINYINTNOT 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 COMMENT = '全局事务表';-- the table to store BranchSession dataCREATE TABLE IF NOT EXISTS `branch_table`(`branch_id`BIGINTNOT 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 COMMENT = '分支事务表';-- the table to store lock dataCREATE TABLE IF NOT EXISTS `lock_table`(`row_key`VARCHAR(128) NOT NULL,`xid`VARCHAR(128),`transaction_id` BIGINT,`branch_id`BIGINTNOT NULL,`resource_id`VARCHAR(256),`table_name`VARCHAR(32),`pk`VARCHAR(36),`status`TINYINTNOT 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 COMMENT = '全局锁表';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);

推荐阅读