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 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);
step2-2 application.yml文件修改
在seata解压文件下找到 /conf文件夹,这里seata服务端启动配置文件application.yml
注释掉默认的type:file 替换为nacos相关配置
seata:
config:
# support: nacos, consul, apollo, zk, etcd3
#type: file
type: nacos
nacos:
server-addr: 192.168.0.206:8248
namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4
group: DEFAULT_GROUP
data-id: seata.properties
#username:
#password:
registry:
# support: nacos, eureka, redis, zk, consul, etcd3, sofa
#type: file
type: nacos
nacos:
application: seata-server
server-addr: 192.168.0.206:8248
namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4
group: DEFAULT_GROUP
cluster: 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 用来统一提交 或者 回滚
*/
@Bean
public DataSourceProxy dataSourceProxy(@Qualifier("dataSource1") DataSource dataSource){
return new DataSourceProxy(dataSource);
}
/**
* 分布式事务管理器
* 需要配置
* applicationId 任意最好是当前项目的名称
* txServiceGroup 组名称 相关的分布式服务使用同一个组名称
*
* 注意registry.conf 配置文件 需要修改为zk 或者 nacos
*/
@Bean
public GlobalTransactionScanner globalTransactionScanner(){
String applicationId = "order-service"; //本地服务名称 服务id
String 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服务名字空间的id
namespace = "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服务名字空间的id
namespace = "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