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

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

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

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

在这里插入图片描述

道德经全文