dynamic-datasource 多数据源 seata 分布式事务 dubbo微服务框架环境配置
在开发中dubbo需要引入seata来进行分布式事务管理,查了很多文章,都是seata版本比较老旧等文章环境配起来很麻烦,踩了不少坑,浪费了不少时间,记录一下。
一.安装seata服务端
百度很多文章都是seata版本老旧等文章,有的还需要自己手动添加zookeeper节点。
因此我们使用“seata官方提供的最新版本1.4.0(https://seata.io/zh-cn/blog/download.html)
1.下载完成后修改conf目录下的
file.conf文件
transport {
# tcp udt unix-domain-socket
type = "TCP"
#NIO NATIVE
server = "NIO"
#enable heartbeat
heartbeat = true
# the client batch send request enable
enableClientBatchSendRequest = true
#thread factory for netty
threadFactory {
bossThreadPrefix = "NettyBoss"
workerThreadPrefix = "NettyServerNIOWorker"
serverExecutorThread-prefix = "NettyServerBizHandler"
shareBossWorker = false
clientSelectorThreadPrefix = "NettyClientSelector"
clientSelectorThreadSize = 1
clientWorkerThreadPrefix = "NettyClientWorkerThread"
# netty boss thread size,will not be used for UDT
bossThreadSize = 1
#auto default pin or 8
workerThreadSize = "default"
}
shutdown {
# when destroy server, wait seconds
wait = 3
}
serialization = "seata"
compressor = "none"
}
service {
#transaction service group mapping
vgroupMapping.my_test_tx_group = "default"
#only support when registry.type=file, please don't set multiple addresses
default.grouplist = "127.0.0.1:8091"
#degrade, current not support
enableDegrade = false
#disable seata
disableGlobalTransaction = false
}
client {
rm {
asyncCommitBufferLimit = 10000
lock {
retryInterval = 10
retryTimes = 30
retryPolicyBranchRollbackOnConflict = true
}
reportRetryCount = 5
tableMetaCheckEnable = false
reportSuccessEnable = false
}
tm {
commitRetryCount = 5
rollbackRetryCount = 5
}
undo {
dataValidation = true
logSerialization = "jackson"
logTable = "undo_log"
}
log {
exceptionRate = 100
}
}
2.然后修改registry.conf文件
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "zk"
nacos {
application = "seata-server"
serverAddr = "localhost"
namespace = ""
username = ""
password = ""
}
eureka {
serviceUrl = "http://localhost:8761/eureka"
weight = "1"
}
redis {
serverAddr = "localhost:6379"
db = "0"
password = ""
timeout = "0"
}
zk {
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
consul {
serverAddr = "127.0.0.1:8500"
}
etcd3 {
serverAddr = "http://localhost:2379"
}
sofa {
serverAddr = "127.0.0.1:9603"
region = "DEFAULT_ZONE"
datacenter = "DefaultDataCenter"
group = "SEATA_GROUP"
addressWaitTime = "3000"
}
file {
name = "file.conf"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3、springCloudConfig
type = "file"
nacos {
serverAddr = "localhost"
namespace = ""
group = "SEATA_GROUP"
username = ""
password = ""
}
consul {
serverAddr = "127.0.0.1:8500"
}
apollo {
appId = "seata-server"
apolloMeta = "http://192.168.1.204:8801"
namespace = "application"
}
zk {
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
etcd3 {
serverAddr = "http://localhost:2379"
}
file {
name = "file.conf"
}
}
type修改为你是用的注册中心(我这边用的zookeeper就修改为zk)
3.切换bin目录直接命令运行seata-server.sh(.bat)可执行文件,运行时保证注册中心已启动
4.新增seata所需的数据库表
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
二.在pom文件中引入seata包
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
这里引入seata和springboot的整合包。
dynamic-datasource
我这里已经引入过dynamic-datasource多数据源的等依赖了,这些百度有详细配置自行引入
三.修改Springboot的yml配置
spring:
boot:
admin:
client:
url: http://127.0.0.1:8180
instance:
prefer-ip: true
service-base-url: http://127.0.0.1:${server.port}
datasource:
dynamic:
primary: db1 #设置默认的数据源或者数据源组,默认值即为master
strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候会抛出异常,不启动则使用默认数据源.
seata: true #seata1.0之后支持自动代理 这里直接配置true
seata-mode: at #seata模式使用的at
datasource:
db1: # 数据源1配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test1
username: root
password: root
db2: # 数据源2配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test2
username: root
password: root
seata:
service:
grouplist:
default: 127.0.0.1:8091
vgroup-mapping:
my_test_tx_group: default
enable-degrade: false
disable-global-transaction: false
enabled: true
application-id: ${dubbo.application.id} #这里填你服务的id
tx-service-group: my_test_tx_group #这里填seata服务端 file.conf里 service vgroupMapping.{分组名}
client:
tm:
commit-retry-count: 3
rollback-retry-count: 3
enable-auto-data-source-proxy: false
rm:
report-success-enable: true
table-meta-check-enable: true
report-retry-count: 5
async-commit-buffer-limit: 1000
transport:
type: TCP
server: NIO
heartbeat: true
serialization: seata
compressor: none
enable-auto-data-source-proxy: true
shutdown:
wait: 3
thread-factory:
boss-thread-prefix: NettyBoss
client-worker-thread-prefix: NettyServerNIOWorker
server-executor-thread-prefix: NettyServerBizHandler
client-selector-thread-size: 1
client-selector-thread-prefix: NettyClientWorkerThread
新版本的seata只需要把上面的yml文件复制到相应位置就可以了
四.开启分布式事务
@GlobalTransactional 开启分布式事务
@DS(“db2") 切换数据源名称“db2”的数据源
在开启的每个分布式事务的方法上标记的数据源,对应的每个数据库中里都需要有一张seata用于回滚的undo_log表,他会记录事务的信息到对应数据源的表中