Spring Cloud系列—Seata部署
上篇文章:
Spring Cloud系列—Alibaba Seata分布式事务https://blog.csdn.net/sniper_fandc/article/details/149946716?fromshare=blogdetail&sharetype=blogdetail&sharerId=149946716&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link
目录
1 下载解压安装包
2 修改seata配置文件
2.1 修改配置中心
2.2 修改注册中心
2.3 修改存储模式
3 启动seata
4 微服务集成Seata
4.1 引入依赖
4.2 修改配置文件
Seata的引入将分布式事务的角色分为TC、TM、RM,它将分布式事务原来的TM拆分为TC和TM,具体功能如下:
TC(Transaction Coordinator):事务协调者,维护全局事务和分支事务的状态,驱动全局事务的提交或回滚。
TM(Transaction Manager):事务管理器,定义全局事务范围,负责全局事务的开始、提交或回滚。
RM(Resource Manager):资源管理器,管理分支事务处理的资源,负责分支事务的提交或回滚,并与TC通信来注册或汇报分支事务的状态。
1 下载解压安装包
这里采用Windows部署方式,前往seata官网下载安装包,并将安装包解压到本地:https://seata.apache.org/zh-cn/release-history/seata-server/
seata-namingserver是seata自带的注册中心。seata-server是seata的TC的服务端,负责协调和管理全局事务。
2 修改seata配置文件
2.1 修改配置中心
打开seata安装目录下的\seata-server\conf\application.yml文件,修改seata:config:type=nacos,并添加配置(输入自己的nacos部署地址):
seata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 192.168.178.150:8848namespace:group: SEATA_GROUP
上述配置可以从\seata-server\conf\application.example.yml直接复制。
2.2 修改注册中心
修改seata:registry:type=nacos,并添加配置(输入自己的nacos部署地址):
seata:registry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 192.168.178.150:8848group: SEATA_GROUP
上述配置可以从\seata-server\conf\application.example.yml直接复制。
2.3 修改存储模式
这里采用MySQL作为seata的存储,因此首先需要数据库中存在对应的库和表:
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 = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession dataCREATE 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 = 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` 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` (`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);CREATE TABLE IF NOT EXISTS `vgroup_table`(`vGroup` VARCHAR(255),`namespace` VARCHAR(255),`cluster` VARCHAR(255),UNIQUE KEY `idx_vgroup_namespace_cluster` (`vGroup`,`namespace`,`cluster`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;
上述建表语句从seata安装目录的\seata-server\script\server\db\mysql.sql复制。然后配置存储模式:
seata:store:# support: file 、 db 、 redis 、 raftmode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=trueuser: rootpassword: rootmin-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockvgroup-table: vgroup_tablequery-limit: 1000max-wait: 5000
3 启动seata
双击运行\seata-server\bin目录下的seata-server.bat,出现seata server started in 1462 millSeconds说明启动成功。访问127.0.0.1:7091即可进入seata的客户端页面:
用户名和密码是seata(默认情况下,可以在配置文件application.yml中修改),登录后可查看服务:
在nacos中可以发现注册的服务seata:
注意:在nacos中注册的服务显示的端口号是8091,而访问客户端页面时的端口号是7091。7091端口号用于客户端与seata服务端通信;8091端口号用于服务端接收事务请求和事务管理。两个端口号都需要开放。
至于Linux的部署,方式和Windows一样,只是启动时需要输入-h和-p以服务器ip+8091端口号启动。不输入-h就可能以局域网ip启动,公网无法访问。
4 微服务集成Seata
4.1 引入依赖
在需要开启全局事务的范围内的微服务中引入Seata,同时也需要引入Nacos依赖,因此这里把Nacos作为Seata的注册中心:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
4.2 修改配置文件
seata:registry: #定义Seata Server的注册中心,微服务根据配置信息去注册中心获取TC的服务地址type: nacos #指定注册中心的类型nacos:application: seata-server #Seata Server在Nacos中的应用名称server-addr: 192.168.178.150:8848 #Nacos服务器地址group: "SEATA_GROUP" #Seata Server在Nacos中的分组名称namespace: "" #Nacos的命名空间, 设置为空, 表示使用默认的命名空间publictx-service-group: default_tx_group #定义事务服务组的名称service:vgroup-mapping:default_tx_group: default #集群名称(微服务启动时将事务分组映射到集群)
微服务启动时,根据default_tx_group获取事务分组名,然后根据service:vgroup-mapping:定义的映射关系(事务服务组:集群名称)获取事务分组所在的集群名。这样微服务就可以根据Seata Server的服务名+分组名+集群名从Nacos中获取TC服务列表信息。
注意:为什么需要事务服务组映射到集群,而不是直接获取服务名?事务分组可以作为资源的逻辑隔离单位,出现某集群故障时可以快速failover,只切换对应分组,可以把故障缩减到服务级别,但前提有足够server集群。
下篇文章: