马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.介绍
seata官网:Seata 是什么? | Apache Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简朴易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案
在Seata的事务管理中有三个紧张的脚色:
- TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
- TM (Transaction Manager) - 事务管理器:界说全局事务的范围、开始全局事务、提交或回滚全局事务。
- RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中,TM和RM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TM和RM就会帮忙微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。而TC服务则是事务协调中心,是一个独立的微服务,需要单独摆设。
2.摆设TC服务
2.1 导入数据库表
Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。因此需要创建一个数据库‘seata’,运行一下sql命令。
- CREATE DATABASE IF NOT EXISTS `seata`;
- USE `seata`;
- 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;
- 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;
- 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);
复制代码 2.2.准备配置文件
创建一个seata文件夹,在该文件夹下创建一个application.yml文件,写入配置信息,例:
本身更改端口号、nacos地址和数据库地址、暗码即可。将整个seata文件夹拷贝到假造机的/root目次
2.3 Docker摆设
需要注意,要确保nacos、mysql都在同一个Docker网络中。如果某个容器不在Docker网络,可以参考下面的命令将某容器加入指定网络:
- docker network connect [网络名] [容器名]
复制代码 可以使用以下命令检查某个容器在哪个网络,
例如:我使用 docker inspect mysql ,,可以看到该容器在“elk”网络中
在假造机的/root目次执行下面的命令:,将Docker网络和上面配置信息的ip地址改成本身对应的
- docker run --name seata \
- -p 8099:8099 \
- -p 7099:7099 \
- -e SEATA_IP=172.0.0.1 \
- -v ./seata:/seata-server/resources \
- --privileged=true \
- --network elk \
- -d \
- seataio/seata-server:1.5.2
复制代码
安装完成后可以通过欣赏器访问127.0.0.1:1099 进入seata界面,初次登录账号暗码都是admin
进入后可以看到事务的信息和一些锁的信息:
3.微服务集成Seata
3.1 引入依赖
为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此模块不仅仅要引入seata依赖,还要引入nacos依赖:
- <!--统一配置管理-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- </dependency>
- <!--读取bootstrap文件-->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bootstrap</artifactId>
- </dependency>
- <!--seata-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
- </dependency>
复制代码 3.2 改造配置
在nacos上添加一个共享的seata配置,命名为shared-seata.yaml
将nacos ip地址改成本身的
- seata:
- registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
- type: nacos # 注册中心类型 nacos
- nacos:
- server-addr: 127.0.0.1:8848 # nacos地址 ,ip改成自己服务器地址
- namespace: "" # namespace,默认为空
- group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
- application: seata-server # seata服务名称
- username: nacos
- password: nacos
- tx-service-group: hmall # 事务组名称
- service:
- vgroup-mapping: # 事务组与tc集群的映射关系
- hmall: "default"
复制代码 然后,改造模块,添加bootstrap.yaml
- spring:
- application:
- name: trade-service # 服务名称
- profiles:
- active: dev
- cloud:
- nacos:
- server-addr: 172.0.0.1:8848 # nacos地址
- config:
- file-extension: yaml # 文件后缀名
- shared-configs: # 共享配置
- - dataId: shared-jdbc.yaml # 共享mybatis配置
- - dataId: shared-log.yaml # 共享日志配置
- - dataId: shared-swagger.yaml # 共享日志配置
- - dataId: shared-seata.yaml # 共享seata配置
复制代码 再改造application.yaml文件,将重复的部分删掉
3.3添加数据库
在涉及分布式事务的微服务的数据库中运行下面sql语句=>创建undo_log表格
- -- for AT mode you must to init this sql for you business database. the seata server not need it.
- CREATE TABLE IF NOT EXISTS `undo_log`
- (
- `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',
- `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',
- `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
- `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
- `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
- `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
- `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
- UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
- ) ENGINE = InnoDB
- AUTO_INCREMENT = 1
- DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
复制代码 3.4实现方法:
在涉及分布式事务的业务代码上加上Seata提供的@GlobalTransactional注解即可
@GlobalTransactional
在配置文件中指定要采用的分布式事务模式。我们可以在Nacos中的共享shared-seata.yaml配置文件中设置:
- seata:
- data-source-proxy-mode: XA
复制代码
JDK17运行报错可以见:JDK17运行seata发生报错Error creating bean with name ‘globalTransactionScanner‘的解决方案-CSDN博客
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |