springcloud第4季 分布式事务seata作用服务搭建1

一  seata作用

1.1 seata简介

1.seata是一款解决分布式事务的解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

1.2 seata的术语

一个中心:全局事务id,xid,在调用服务链路的上下文中进行传播。TC(Transaction Coordinator):事务协调者。其中seata服务器就是TC角色,负责维护全局和分支事务的状态,驱动全局事务的提交或回滚TC只有1个;

TM(Transaction Manager):事务管理者。标注了@GlobalTransaction注解的微服务模块(如订单模块);它是事物的发起者,负责定义事务的全局范围,根据TC维护全局事务和分支事务的状态,做出开启事务,提交事务,回滚事物的决议。TM只有1个

RM(Resource Manager): 资源管理器。Mysql数据库本身就是,负责管理分支事务的资源,向TC注册分支事务,汇报分支事务的状态,驱动分支事务的提交或者回滚。可以多个RM。

Tc以seata服务器形式独立部署。TM,RM是以seata client的形式集成在微服务中运行。

1.3 seata的工作流程

1.简述版

1.TM向TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的xid。

2.xid在微服务调用链路的上下文张工传播

3.RM向TC注册分支事务,将其纳入到xid对应的全局事务的管辖范围

4.TM向TC发起针对xid的全局提交或回滚决议。

5.TC调度xid管辖的全部分支事务,完成提交或回滚请求。

2.详情版:

1.服务A中的TM向TC申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID。

2.服务A中的RM向TC注册分支事务,然后将这个分支事务纳入XID对应的全局事务管辖中。

3.服务A开始执行分支事务。

4.服务A开始远程调用B服务,此时XID会根据调用链传播

5.服务B中的RM也向TC注册分支事务,然后将这个分支事务纳入XID对应的全局事务管辖中。

6.服务B开始执行分支事务。

7.全局事务调用处理结束后,TM会根据有无异常情况,向TC发起全局事务的提交或回滚。

8.TC协调其管辖之下的所有分支事务,决定是提交还是回滚。

 二  seata服务端搭建 

2.1 seata搭建

2.2.1 seata 服务端下载安装

下载地址: Seata-Server下载 | Apache Seata

截图如下:

2.2.2 使用mysql初始化seata所需表

1.下载脚本地址: 

incubator-seata/script/server/db/mysql.sql at 2.x · apache/incubator-seata · GitHub

2.脚本内容

--
-- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements.  See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License.  You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
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;

-- the table to store BranchSession data
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;

-- the table to store lock data
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` (`xid`)
) 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);

  3.附加mysql数据库

 2.2.3 nacos的信息配置

1.创建namespace

2.创建dataid,groupid

3.具体seata-server.properties的内容 

# socket通信方式, 公共部分
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
transport.serialization=seata
transport.compressor=none
# 首先应用程序(客户端)中配置了事务分组,若应用程序是SpringBoot则通过配置seata.tx-service-group=[事务分组配置项]
# 事务群组,service.vgroupMapping.[事务分组配置项]=TC集群的名称
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false

# undo配置
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k

#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h
# You can choose from the following options: fastjson, jackson, gson
tcc.contextJsonParserType=fastjson
#Log rule configuration, for client and server
log.exceptionRate=100
#事务会话信息存储方式
store.mode=db
#事务锁信息存储方式
store.lock.mode=db
#事务回话信息存储方式
store.session.mode=db
#db或redis存储密码解密公钥
#store.publicKey=
#存储方式为db
## druid数据源
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=cloudiip
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
# 事务规则配置
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=true
server.enableParallelHandleBranch=false
server.raft.cluster=127.0.0.1:7091,127.0.0.1:7092,127.0.0.1:7093
server.raft.snapshotInterval=600
server.raft.applyBatch=32
server.raft.maxAppendBufferSize=262144
server.raft.maxReplicatorInflightMsgs=256
server.raft.disruptorBufferSize=16384
server.raft.electionTimeoutMs=2000
server.raft.reporterEnabled=false
server.raft.reporterInitialDelay=60
server.raft.serialization=jackson
server.raft.compressor=none
server.raft.sync=true
#Metrics配置
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

2.2.4 seata 服务端进行配置

1.application的配置,打开config/application.yml文件,我们主要关注以下几个模块的配置。

1)server端配置中心指定,seata.config.type

2)server端注册中心指定,seata.registry.type

3)server端存储模式指定,seata.store.mode

修改config/application.yml文件,指定nacos为配置中心、注册中心,并将seata.store.mode屏蔽,后续中配置中心中进行配置。

详情代码:

#  Copyright 1999-2019 Seata.io Group.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.
 
server:
  port: 7091
 
spring:
  application:
    name: seata-server-zdy
 
logging:
  config: classpath:logback-spring.xml
  file:
    path: ${log.home:${user.home}/logs/seata}
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash
 
console:
  user:
    username: seata
    password: seata
 
 
seata:
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace: c364e76c-e133-4bc0-951e-205cf732a19f
      group: LJF_GROUP #后续自己在nacos里面新建,不想新建SEATA_GROUP,就写DEFAULT_GROUP
      username: nacos
      password: nacos
      data-id: seata-server.properties
  registry:
    type: nacos
    nacos:
      application: seata-server-zdy
      server-addr: 127.0.0.1:8848
      group: LJF_GROUP #后续自己在nacos里面新建,不想新建SEATA_GROUP,就写DEFAULT_GROUP
      namespace: c364e76c-e133-4bc0-951e-205cf732a19f
      cluster: default
      username: nacos
      password: nacos    
  store:
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/seata?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
      user: root
      password: cloudiip
      min-conn: 10
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      query-limit: 1000
      max-wait: 5000
 
 
 
  #  server:
  #    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/**

2.2.5 启动服务

1.启动nacos

E:\nacos-server2.2.3\bin>startup.cmd -m standlone

2.启动seata

F:\seata\bin>seata-server.bat

 2.2.6 查看服务

1.查看nacos

2.查看seata

http://localhost:7901

看到nacos中,seata服务完成了注册,以及能够登录到seata的查询页面。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/752508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iPhone怎么恢复删除的数据?几款顶级iPhone数据恢复软件

从iOS设备恢复数据。 对于任何数据恢复软件来说,从iOS设备恢复数据都是一项复杂的任务,因为Apple已将众多数据保护技术集成到现代iPhone和iPad中。其中包括硬件加密和文件级加密。iOS 上已删除的数据只能通过取证文件工件搜索来找到,例如分析…

最新扣子(Coze)实战案例:图像流工具之空间风格化,完全免费教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》,完全免费学习。 👀 关注斜杠君,可获取完整版教程。👍&#x1f3f…

EHS,制造业安全绿色生产的隐形守护神

当我们提到EHS,可能很多人会稍感陌生,毕竟它不是一个日常生活中经常提及的词汇。但实际上,EHS在我们的生活和工作中扮演着极其重要的角色,尤其对制造业而言更是可持续发展经营管理的重中之重。 一、EHS是什么意思? E…

vue项目内网部署流程

由于第一次部署,也是第一次自己用 Nginx , 百度了很久,没有看到想看的步骤,所以作此文以记录,也是给像我一样的人一个大概方向。 注:windows系统 1、首先要弄好jar包的运行环境。 安装jdk 详细安装过程引用 jdk的完整…

码农:如何快速融入团队

问题: 码农如何快速融入团队? 记住一个标准:能干事、能抗事。 总结一个字: 靠谱。 适用范围:新手码农、老司机码农、测试、DBA、运维、产品经理、项目经理、架构师、技术专家、。。。。适用于任何行业的打工者。 下面要…

伙伴活动推荐丨当 RTC 遇上 AI ,大模型创新应用星城论道

近年来,音视频技术已成为推动在线新经济和企业数字化转型的重要力量。作为中部互联网产业高地,湖南长沙亦将音视频产业视为战略性新兴产业重点布局。 2024年7月6日,声网联合 CSDN 在湖南长沙举办声网城市沙龙,以“当 RTC 遇上 AI…

VMware Workstation环境下,DHCP服务的安装配置,用ubuntu来测试

需求说明: 某企业信息中心计划使用IP地址17216.11.0用于虚拟网络测试,注册域名为xyz.net.cn.并将172.16.11.2作为主域名的服务器(DNS服务器)的IP地址,将172.16.11.3分配给虚拟网络测试的DHCP服务器,将172.16.11.4分配给虚拟网络测试的web服务器,将172.16.11.5分配给FTP服务器…

Matlab/simulink三段式电流保护

电流1段仿真波形如下所示 电流2段仿真波形如下所示 电流3段仿真波形如下所示

SSL证书在网站访问中的核心作用及快速申请指南

在当今的互联网时代,数据安全与用户隐私保护成为了网站运营不可或缺的一部分。SSL证书作为一种重要的网络安全协议,它在网站访问中扮演着至关重要的角色,主要体现在以下几个方面: 一、加密通信内容:SSL证书通过建立安…

系统进程与计划任务

目录 系统进程 ps命令 top命令 pgrep命令 pstree命令 jobs命令 计划任务 一次性计划任务at 周期性计划任务crontab 系统进程 我们系统在打开的一瞬间就会加载很多进程,那么我们该如何查看这些进程和管理这些进程呢? ps命令 常用的参数 -a&am…

Linux创建目录——mkdir命令,du命令,touch用法,创建tree拓扑图

1. mkdir 命令 格式 mkdir - 参数 路径 / 目录名 参数 -p :快速创建多级目录(递归目录) -v :显示创建目录的详细过程 例: [rootserver ~] # mkdir t1 [rootserver ~] # mkdir t2 t3 t4 [rootserver ~] # mk…

计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

测试过程及结果 本次对于医生推荐系统测试通过手动测试的方式共进行了两轮测试。 (1)第一轮测试中执行了个20个测试用例,通过16个,失败4个,其中属于严重缺陷的1个,属于一般缺陷的3个。 (2&am…

百元蓝牙耳机推荐2024哪个好?蓝牙耳机性价比之王推荐

现在的百元价位的蓝牙耳机成为了许多消费者入门级的选择,它不仅需要满足基础的通话需求,更要在音质、舒适度、续航能力等多方面达到一定的标准,随着技术的发展和市场的竞争激烈,各大品牌在这一价格区间推出了极具竞争力的产品&…

万能自定义预约小程序源码系统 适合任何行业在线预约报名 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代,线上预约已成为各行各业不可或缺的一部分。为满足广大企业和个人对在线预约系统的需求,我们特别推出了这款“万能自定义预约小程序源码系统”。该系统以其高度的灵活性和可扩展性,为各行各业提供了完美的在线预约…

vue+fineReport 使用前端搜索+报表显示数据

--fineReprot 将需要搜索的参数添加到模版参数 sql: --前端传递参数 注:因为每次点击搜索的结果需要不一样,还要传递一个时间戳的参数: let timesamp new Date().getTime()

Python爬取中国天气网天气数据.

一、主题式网络爬虫设计方案 1.主题式网络爬虫名称 名称:Python爬取中国天气网天气数据 2.主题式网络爬虫爬取的内容与数据特征分析 本次爬虫主要爬取中国天气网天气数据 3.主题式网络爬虫设计方案概述(包括实现思路与技术难点) reques…

2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(上)

目录 前言: 一、试题 A:阶乘求和(填空) 二、试题 B:幸运数字(填空) 三、试题 C:数组分割 四、试题 D:矩阵总面积 五、试题 E:蜗牛 六、试题 F&#xff…

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)

简介 在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现。MultiAction是多点触控的类,可以模拟用户多点操作。主要包含加载add()和执行perform()两个方法. 问题思考 在使用地图App中,我们…

PPT怎么录制视频?这里有你想要的答案!

“有人知道ppt怎么录制视频吗?我正在准备一个关于新产品功能介绍的演示文稿,希望能将我的ppt转化为一个专业且生动的视频讲解。我尝试了一些方法,但不知道从哪里开始。有没有哪位朋友能分享一下自己录制ppt视频的经验吗?” 在数字…

问题解决:python安装依赖时网络问题报错

进行 pip install 时,安装轮子访问过慢而造成安装失败,有时候配置镜像源仍会出现莫名其妙的问题,包括网络代理问题等。看了一些解决方案,找出了一个最适合的方式,如下所示: pip install -i https://pypi.t…