SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

项目依赖

  • SpringBoot 2.5.5
  • SpringCloud 2020.0.4
  • Alibaba Spring Cloud 2021.1
  • Mybatis Plus 3.4.0
  • Seata 1.4.1(需要与服务器部署的Seata版本保持一致)
  • 。。。。
Seata介绍什么是Seata
  • 一个开源分布式事务框架,由阿里中间件团队发起的开源项目Fescar,后更名为Seata
  • 中文文档地址:http://seata.io/zh-cn/docs/user/quickstart.html
Seata三大组件
  • TC:Transaction Coordinator事务协调器,管理全局的分支事务的状态 , 用于全局性事务的提交和回滚
  • TM:Transaction Manager 事务管理器 , 用户开启、提交或者回滚【全局事务】
  • RM:Resource Manager资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接收TC的命令来提交或者回滚分支事务
    • 传统XA协议实现2PC方案的RM是在数据库层,RM本质上就是数据库自身
    • Seata的RM是以jar包的形式嵌入在应用程序里面
架构:TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端【SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截】
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
XID
  • TM请求TC开启一个全局事务,TC会生成一个XID作为该全局事务的编号XID,XID会在微服务的调用链路中传播 , 保证将多个微服务对的子事务关联在一起
Seata部署安装下载Seata地址http://seata.io/zh-cn/blog/download.html
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
注:我这边下载的是1.4.1,seata部署版本需要与SpringBoot依赖的版本相对应?。。。。。?
Seata部署前期准备准备好Nacos、mysql
注:nacos配置中心数据是持久化到mysql的?。。。?
部署&修改配置修改存储模式DB上传至服务器,目录为:/usr/local/software
# 1、创建目录mkdir -p /usr/local/software# 2、解压unzip seata-server-1.4.1.zip# 3、修改存储模式 DBcd seata/conf/vi file.conf
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
注:修改为自己的mysql?。。。?
## transaction log store, only used in seata-serverstore {## store mode: file、db、redismode = "file"## database store propertydb {## 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"url = "jdbc:mysql://47.116.143.16:3306/seata?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"user = "root"password = "root"minConn = 5maxConn = 100globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}}将seata需要的3张表导入数据库中,分别是:global_table、branch_table、lock_table
官网地址:http://seata.io/zh-cn/docs/user/quickstart.html
github地址:https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图

SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

文章插图
-- -------------------------------- 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 = InnoDBDEFAULT CHARSET = utf8mb4;-- 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 = InnoDBDEFAULT CHARSET = utf8mb4;-- 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` (`xid`)) ENGINE = InnoDBDEFAULT 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 = InnoDBDEFAULT 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);

推荐阅读