seata1.6.0 单机,集群搭建 基于nacos注册中心 mysql数据库

news/2024/3/29 17:08:35/文章来源:https://blog.csdn.net/liuyij3430448/article/details/130320971

seata1.6.0 单机,集群搭建 基于nacos注册中心 mysql数据库

大纲

  • 1 单机搭建
  • 2 集群搭建

由于项目中的dubbo版本为2.6.0 故客户端程序(TM RM)使用seata-all 1.4.2 ,服务端(TC)使用seata-server-1.6.0.zip
nacos版本 1.3.2

名词解释:

  • 单机: 指 seata TC服务器单机
  • 集群: 指 seata TC服务器为多个
  • nacos: 指 TC服务的配置 和 客户端程序(TM RM)配置又nacos管理
  • 数据库存储: 指事务数据(TC端)保存到数据库中

所以整体涉及两部分服务端(TC)的配置和客户端程序(TM RM)配置

单机搭建-部署流程

step1 nacos配置

nacos的作用:

  • 1 对服务端(TC)和客户端(TM RM)提供配置中心的功能
  • 2 对TC端作为注册中心,TC把自己的ip注册到nacos
  • 3 对(TM RM)端作为注册中心,TM RM可以从nacos中获取TC端的ip

nacos创建命名空间

例如创建一个命名空间  seata_config

在这里插入图片描述

创建配置信息

这个配置 TC TM RM 都会使用这个配置

在这里插入图片描述

配置 DataId 和 组名称 并预留服务端 和 客户端的配置 后面在来填充

在这里插入图片描述
到此 nacos基础配置完成

注意 seata-all 1.4.2之前每一个配置需要创建一个dataId,无法使用一个dataId保存所有配置

step2 服务端(TC)的配置

服务端(TC)的配置主要有以下操作

  • 1 数据库初始化
  • 2 application.yaml文件修改
  • 3 在nacos配置中加入服务端的配置和数据库的配置

step2-1 数据库初始化

在seata解压文件下找到 /script/server/db文件夹,这里有数据库表初始化脚本

在这里插入图片描述

使用mysql.sql脚本实现初始化数据库信息,注意需要先自己创建数据库

例如
CREATE SCHEMA `seata_db` DEFAULT CHARACTER SET utf8mb4 ;

mysql.sql脚本如下

-- -------------------------------- 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`                    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 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 = InnoDBDEFAULT 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 = 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);

step2-2 application.yml文件修改

在seata解压文件下找到 /conf文件夹,这里seata服务端启动配置文件application.yml

在这里插入图片描述

注释掉默认的type:file 替换为nacos相关配置

在这里插入图片描述

seata:config:# support: nacos, consul, apollo, zk, etcd3#type: filetype: nacosnacos:server-addr: 192.168.0.206:8248namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4group: DEFAULT_GROUPdata-id: seata.properties#username:#password:        registry:# support: nacos, eureka, redis, zk, consul, etcd3, sofa#type: filetype: nacosnacos:application: seata-serverserver-addr: 192.168.0.206:8248namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4group: DEFAULT_GROUPcluster: default

修改完成后保存 服务端(TC)配置完成

step2-3 在nacos配置中加入TC服务端的配置和数据库的配置

再次打开nacos 修改配置

添加如下内容(这是服务的最小配置,如果有其他配置需求可以参考 https://seata.io/zh-cn/docs/user/configurations.html 再添加)

store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
# 需要根据mysql的版本调整driverClassName
# mysql8及以上版本对应的driver:com.mysql.cj.jdbc.Driver
# mysql8以下版本的driver:com.mysql.jdbc.Driver
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://192.168.0.206:3306/seata_db?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
store.db.user=root
store.db.password=123456

在这里插入图片描述

修改完成后点击发布,此时可以启动服务端了

./seata-server.sh -h 192.168.0.160 -p 5959 

在这里插入图片描述

注意 如果主机有多个网卡需要使用 -h 指定注册ip

nacos 中可以看到seata已经成功注册

在这里插入图片描述

step3 客户端(TM RM)的配置

step3-1 程序依赖调整

由于历史原因程序是使用dubbo2.6.0 故seata-all版本这里使用1.4.2

<dependency><groupId>io.seata</groupId><artifactId>seata-all</artifactId><version>1.4.2</version>
</dependency>

由于是使用nacos作为 注册中心 和 配置中心 所以在程序的pom.xml先加入nacos相关依赖

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.7</version>
</dependency>

代码中调整

  • 1 DataSourceProxy来代理dataSource
  • 2 创建GlobalTransactionScanner注意指定applicationId 和 txServiceGroup
	/*** 数据源代理配置* Seata提供的DataSourceProxy 用来统一提交 或者 回滚*/@Beanpublic DataSourceProxy dataSourceProxy(@Qualifier("dataSource1") DataSource dataSource){return new DataSourceProxy(dataSource);}/*** 分布式事务管理器* 需要配置* applicationId  任意最好是当前项目的名称* txServiceGroup 组名称  相关的分布式服务使用同一个组名称* * 注意registry.conf 配置文件 需要修改为zk 或者 nacos*/	 @Beanpublic GlobalTransactionScanner globalTransactionScanner(){String applicationId = "order-service"; //本地服务名称 服务idString txServiceGroup = "my_dubbo_tx_group"; //指定事务服务组的名称 相关的业务应该在同一个组中return new GlobalTransactionScanner(applicationId, txServiceGroup);}/*** 注意这里变成了DataSourceProxy* @param dataSourceProxy* @return*/@Bean(name="transactionManager")public PlatformTransactionManager annotationDrivenTransactionManager(DataSourceProxy dataSourceProxy) {return new DataSourceTransactionManager(dataSourceProxy);}

step2-2 程序中修改registry.conf配置

seata-all1.5.1使用的registry.conf来管理配置

registry.conf内容如下

# 此配置为客户端最小可以配置
registry {#使用nacos注册中心 type="nacos"#以下配置对应相关的type类型 nacos {#seata-server名称application = "seata-server"cluster = "default"# 指定nacos注册中心地址serverAddr = "192.168.0.206:8248"# 指定组名 (seata TC服务端配置 可以在nacos 服务列表中查看对应的seata tc 服务组名)group = "DEFAULT_GROUP"# 指定 seata TC服务名字空间的idnamespace = "8422b4bf-8b04-406e-8295-39d4968b2ec4"#username = ""#password = ""}}config {#使用nacos配置中心 type="nacos"nacos {# 指定nacos配置中心地址serverAddr = "192.168.0.206:8248"#使用一个dataId 保存所有客户端配置容器 dataId="seata.properties"# 指定组名 (seata TC服务端配置 可以在nacos 服务列表中查看对应的seata tc 服务组名)group = "DEFAULT_GROUP"# 指定 seata TC服务名字空间的idnamespace = "8422b4bf-8b04-406e-8295-39d4968b2ec4"#username = ""#password = ""}}

项目结构如图

在这里插入图片描述

step2-3 在nacos配置中加入客户端的配置

再次打开nacos 修改配置

添加如下内容(这是客户的最小配置,如果有其他配置需求可以参考 https://seata.io/zh-cn/docs/user/configurations.html 再添加)

service.vgroupMapping.my_dubbo_tx_group=default

在这里插入图片描述

启动客户端程序在seata-server端日志中可以看到 客户端已经注册成功

在这里插入图片描述

集群搭建-部署流程

集群版和 单机+nacos+数据库存储配置都是一致,只是集群版会启动多个TC服务端

启动多个TC服务端 注意使用-n 配置节点id

机器IP 192.168.0.160
./seata-server.sh -h 192.168.0.160 -p 5959  -n 1
机器IP 192.168.0.124
./seata-server.sh -h 192.168.0.124 -p 5959  -n 2

在这里插入图片描述

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

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

相关文章

MIT6.S081操作系统实验2021(xv6系统)——lab1 Xv6 and Unix utilities

MIT6.S081操作系统实验2021——lab1 参考文章 sleep 要求为xv6实现UNIX 程序sleep&#xff1b;其应该暂停用户指定的ticks number。tick是 xv6 内核定义的时间概念&#xff0c;即计时器芯片的两次中断之间的时间&#xff08;两次时钟中断之间的时间&#xff09;。您的解决方…

关于函数栈帧的创建与销毁和可变参数列表

目录 1. 深刻理解函数调用过程1.1 基本概念1.2 函数栈帧的创建于销毁1.2.1 栈帧创建1.2.2 栈帧销毁1.2.3 有趣的现象 2. 了解可变参数列表的使用与原理2.1 可变参数列表与函数栈帧的关系2.2 宏的工作过程2.3 宏的具体实现原理 1. 深刻理解函数调用过程 1.1 基本概念 关于函数…

【MySQL】(7)复合查询

文章目录 单表查询回顾与练习多表查询自连接多行子查询&#xff08;单列&#xff09;in 运算符all 关键字any 关键字 多列子查询from 子句中的子查询合并查询 单表查询回顾与练习 注&#xff1a;下面的依旧基于 scott 数据库 MariaDB [scott]> select * from emp; -------…

ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7

编辑&#xff1a;ll ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7 型号&#xff1a;ADG736BRMZ-REEL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;MSOP-10 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;10 类型&#xff1…

Mybatis框架超详解及运用总结

Mybatis 一、什么是Mybatils&#xff1f;二、第一个Mybatils程序2.1、创建springboot工程2.2、准备数据2.3、配置MyBatis2.4、编写SQL语句2.5、单元测试 三、JDBC四、数据库连接池五、lombok六、Mybatis基础操作6.1、删除6.2、新增6.2.1、主键返回 6.3、修改6.4、查询6.4.1、数…

推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别

随着电子商务的迅猛发展&#xff0c;物流配送服务已然成为企业竞争最为核心的环节&#xff0c;一个全面、完善的物流配送方案&#xff0c;能够帮助企业满足客户交期、节约运输和库存成本&#xff0c;促进各环节沟通&#xff0c;提高生产稳定性。同时&#xff0c;物流配送的许多…

垃圾回收概述

什么是垃圾 垃圾收集&#xff0c;不是Java语言的伴生产物。早在1960年&#xff0c;第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题&#xff1a; 哪些内存需要回收&#xff1f;什么时候回收&#xff1f;如何回收&#xff1f; 垃圾收…

9.7 字符串的指针和指向字符串的指针变量

9.7 字符串的指针和指向字符串的指针变量 一.字符串表示形式二.字符串指针做函数参数1.数组名做函数参数2.数组指针做函数参数 三.字符指针变量与字符数组&#xff08;1&#xff09;字符数组是由若干个元素组成&#xff0c;每个元素中存放一个字符。&#xff08;2&#xff09;赋…

[HBZ分享] 小米手机如何解BL锁

第一步&#xff1a; 进入【设置—>我的设备–>全部参数–>连续疯狂的点MIUI版本那一行】 第二步&#xff1a;进入【更多设置–>开发者模式】&#xff0c;打开USB调试 与 USB安装 第三步&#xff1a;进入【更多设置–>开发者模式】&#xff0c;进入【设别解锁状…

人工神经网络

1. 单个神经元 &#x1f351; 神经网络 即 模型 &#x1f364; 输入 四个参数 --> 结果 &#x1f351; 模型训练(学习) 例子 &#x1f351; 模型的输入x 乘 权值ω 减去阈值θ --> 激活函数 f &#x1f351; 输出 yi &#xff08;向下传递 或 直接输出&#xff09; …

JVM性能监测工具-JConsole

JVM性能监测工具-JConsole JConsole工具是JDK自带的图形化性能监控工具。并通过JConsole工具&#xff0c; 可以查看Java应用程序的运行概况&#xff0c; 监控堆信息、 元空间使用情况及类的加载情况等。 JConsole程序在%JAVA_HOM E%/bin目录下 或者你可以直接在命令行对他进…

【致敬未来的攻城狮计划】— 连续打卡第十天:FSP固件库开发及FSP配置详解。

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

手势语言识别模型训练及应用

使用训练集训练模型&#xff0c;使模型能够识别不同手势。 OpenCV-Python环境使用训练集训练模型&#xff0c;使模型能够识别不同手势。系统测试 本项目基于卷积神经网络&#xff0c;通过Python的翻转功能沿垂直轴翻转每个图像&#xff0c;实现手势语言识别的功能。系统流程如图…

数据治理与数据中台架构

随着工业 4.0 时代的到来&#xff0c;传统行业的数字化转型是大势所趋&#xff1b;将数据提高到数据要素层面&#xff0c;让传统的技术在新的场景下发挥出新的作用&#xff0c;是近期研究和探讨的焦点话题。数语科技支持和服务传统行业多年&#xff0c;聚焦于传统数据建模和数据…

catkin_make_workspace

ERROR1 : CMake Error at /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake:113 (message): Project ‘cv_bridge’ specifies ‘/usr/include/opencv’ as an include dir, which is not found. It does neither exist as an absolute directory nor in ‘${{pr…

.net6 core web项目发布部署到Linux,以守护进程服务的形式部署启动,nginx实现转发

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台&#xff08;Linux-x64&#xff09; 3、文件夹选项&#xff1a;在发布前删除所有现有文件 二、部署项目&#xff08;安装.net6环境&#xff1a;参考Linux安装 dotnet sdk 6.0&#xff09; &#xff08;1&#xff09;…

网络基础,InetAddress,Socket,TCP,UDP

概念&#xff1a;两台设备之间通过网络实现数据运输网络通信&#xff1a;将数据通过网络从一台设备传输到另一台设备java.net包下提供了一系列的类或接口&#xff0c;供程序员使用&#xff0c;完成网络通信网络&#xff1a;两台或多台设备通过一定物理设备连接起来构成了网络根…

Scala中的Map 集合详解

目录 一、不可变长Map集合 1.map的声明与遍历 2.map的常用方法&#xff1a;get、getOrElse、keys、values、、&#xff1a; 二、可变长Map集合 三、Map的其他方法 key -> value 的语法形式实际上是用库中的隐式转换实现的&#xff0c;实际调用了 Map.apply 方法。Map.a…

盘点并发编程的12种业务场景,面试别再说你不会并发了

前言 并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。 并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f; 答&#xff1a;不一定&#xff0c;要看具体业务场景。 毕竟如果使用了多线程&…

力扣sql中等篇练习(十一)

力扣sql中等篇练习(十一) 1 好友申请|| :谁有最多的好友 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 出现数字次数越多,就代表它的好友越多 # 对两列数据合并时 不取出合并数据,采用UNION ALL SELECT t1.id,count(*) num FROM (SELECT request…