当前位置: 首页 > news >正文

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集群。

下篇文章:

http://www.dtcms.com/a/336586.html

相关文章:

  • 照相机标定-动手学计算机视觉16
  • easya2a: 一键将 LangChain Agent 发布为 A2A 服务
  • Matlab数字图像处理——基于BM4D压缩感知的三维图像信号重构算法
  • 知识点汇集-web
  • 第三十八天(Node.JS)
  • 【LeetCode 热题 100】(八)二叉树
  • 如何使用java写一个agent
  • 说一下分离读写
  • c_str()函数的详细解析
  • 力扣438:找到字符串中所有的字母异位词
  • ACCESS/SQL SERVER保存软件版本号为整数类型,转成字符串
  • 第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记
  • Windows_Server软件定义网络架构
  • MXFP4量化:如何在80GB GPU上运行1200亿参数的GPT-OSS模型
  • 编程算法实例-阶乘
  • 天地图开发的优点
  • Steam 上传游戏包体操作步骤
  • Win11 文件资源管理器预览窗格显示 XAML 文件内容教程
  • K8S集群环境搭建(一)
  • STL 容器
  • 华东师范上海AiLab商汤!NaviMaster:学习适用于GUI和具身导航任务的统一策略
  • React学习(四)
  • 计算机视觉(一):nvidia与cuda介绍
  • 王树森深度强化学习DRL(一)RL基本概念+价值学习
  • 基于51单片机汽车自动照明灯超声波光敏远近光灯设计
  • Git安装使用
  • 【软考中级网络工程师】知识点之网络存储
  • 如何巧妙通过面试提高业务经验?
  • Spring IoC DI 终极指南:从造车模型到企业级开发实战
  • 嵌入式开发入门—电子元器件~半导体