spring cloud alibaba和spring cloud和spring boot和seata的版本对应关系:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
说明nacos配置不难,此处不予介绍,spring cloud alibaba同理。主要介绍seata1.3.0的联合配置。
Seata下载Releases · seata/seata · GitHub
解压包下conf/file.conf配置修改,使数据存于数据库中。主要是改mode为db,再修改对应db的链接用户密码。
store {
## store mode: file、db、redis
## mode = "file"
mode = "db" ##改成用数据库存储。
## rsa decryption public key
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.
datasource = "druid"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.cj.jdbc.Driver" #mysql8以上,添加cj
## if using mysql to store the data, recommend add rewriteBatchedStatements=true in jdbc connection param
url = "jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true" #需要建立名为seata的数据库
user = "root"
password = "**********" #(账号密码仅为示意,使用自己的。)
minConn = 5
maxConn = 100
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
maxWait = 5000
}
对应数据库建立,这里使用mysql
create database seata;
use seata;
-- -------------------------------- 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_gmt_modified_status` (`gmt_modified`, `status`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
-- 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 = utf8;
-- 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),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
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);
解压包下registry.conf配置修改
配置注册中心和配置中心。这里注册和配置都是在nacos中。
特别注意:seata的奇葩之处在于,namespace, 在registry里面是id,即32位随机数,不是名字,config里面是名字,如dev,public等,不是id.
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
# type = "file"
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "60331b85-f8f6-47b1-9bbe-04c86086da8f" # 此处是id,不是名字。
cluster = "default"
username = ""
password = ""
# dataId = "seataServer.properties" # 添加dataId,配置项,这里不需要。
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
# application = "seata-server" # 配置中心不需要。
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "dev" # 此处不是id,是名字。
cluster = "default"
username = ""
password = ""
# 在nacos中定义的配置名
# dataId = "seataServer.properties" #搞不定,不要了。
}
}
配置中心配置项
配置内容参考https://github.com/seata/seata/tree/develop/script/config-center 的config.txt并按需修改保存
将config.txt配置放在安装seata的安装目录下
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=true
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
# server
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
# store
#model改为db
store.mode=db
store.lock.mode=file
store.session.mode=file
# store.publicKey=""
store.file.dir=file_store/data
store.file.maxBranchSessionSize=16384
store.file.maxGlobalSessionSize=512
store.file.fileWriteBufferCacheSize=16384
store.file.flushDiskMode=async
store.file.sessionReloadReadSize=100
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
# 改为上面创建的seata服务数据库
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
# 改为自己的数据库用户名
store.db.user=
# 改为自己的数据库密码
store.db.password=
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
store.redis.mode=single
store.redis.single.host=127.0.0.1
store.redis.single.port=6379
# store.redis.sentinel.masterName=""
# store.redis.sentinel.sentinelHosts=""
store.redis.maxConn=10
store.redis.minConn=1
store.redis.maxTotal=100
store.redis.database=0
# store.redis.password=""
store.redis.queryLimit=100
# log
log.exceptionRate=100
# metrics
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
# service
# 自己命名一个vgroupMapping,非常重要,关系到spring cloud+nacos+seata的整合。
#分布式事务组名称my_test_tx_group名字无所谓,default名字也无所谓,该配置注册到nacos后。spring cloud中的名字和他们一致就可以了
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
# client
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackonConflict=true
client.rm.reportRetryCount=5
client.rm.tablemetaCheckEnable=false
client.rm.tablemetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
接下来用nacos-config.sh将上述配置写入注册中心。
网址:https://github.com/seata/seata/blob/develop/script/config-center/nacos/nacos-config.sh 。将nacos-config.sh 复制到解压包下/conf/nacos-config.sh,在当前文件夹下,进入git.bash,输入如下命令。
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 0af6e97b-a684-4647-b696-7c6d42aecce7 -u nacos -w nacos
命令解析:-h -p 指定nacos的端口地址;-g 指定配置的分组,注意,是配置的分组;-t 指定命名空间id; -u -w指定nacos的用户名和密码,同样,这里开启了nacos注册和配置认证的才需要指定。
注意:这里的命名空间id一定要有,由于nacos的命名空间public没有对应id,所以配置项不能放在public下。
启动seata,nacosnacos启动略去,seata启动要进入解压包下/bin,点击seata-server.bat,启动seata.(seata启动的端口是8091)
http://localhost:8848/nacos 可以看到seata已经注册进了nacos。
spring cloud alibaba配置。 pom中引入seata的部分。com.alibaba.cloud spring-cloud-starter-alibaba-seataio.seata seata-spring-boot-starterio.seata seata-spring-boot-starter1.3.0
yml。
tx-service-group填my_test_tx_group。根据这个key拿到集群名称fsp_tx_group,并且上面的config.txt中的中的server.vgroupMapping的集群也要是这个名字。
注意: 下面seata.registry.nacos.cluster要和seata.service.vgruopMapping.my_test_tx_group一致。否则报错。
server:
port: 2001
spring:
application:
name: nacos-payment-provider
cloud:
nacos: #学习nacos时添加。
discovery:
group: SEATA_GROUP #分组
#namespace: 6c990727-93b2-4081-a8c6-6b015c56eda2 #不指定命名空间。默认public
#username: nacos #nacos账号密码,没设置就不要了
#password: *****
server-addr: localhost:8848 #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)
datasource:
# 当前数据源操作类型,要用的是 seata的
#type: com.alibaba.druid.pool.DruidDataSource
# mysql驱动类
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/seata_order?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: 123456
seata: # seata 1.4.2使用
enabled: true
enable-auto-data-source-proxy: true #是否开启数据源自动代理,默认为true
tx-service-group: my_test_tx_group #要与配置文件中的vgroupMapping一致
registry: #registry根据seata服务端的registry配置
type: nacos #默认为file
nacos:
#application: seata-server #配置自己的seata服务
#server-addr: localhost:8848 #根据自己的seata服务配置
server-addr: ${spring.cloud.nacos.discovery.server-addr}
#username: #根据自己的seata服务配置
#password: #根据自己的seata服务配置
namespace: 60331b85-f8f6-47b1-9bbe-04c86086da8f #根据自己的seata服务配置
cluster: default # 配置自己的seata服务cluster, 默认为 default,这里要和service.vgroupMapping.my_test_tx_group: default保持一致,否则报错service not found.
group: ${spring.cloud.nacos.discovery.group} #根据自己的seata服务配置
config:
#type: nacos #默认file,如果使用file不配置下面的nacos,直接配置seata.service,可不要
nacos:
#server-addr: localhost:8848 #根据自己的seata服务配置
server-addr: ${spring.cloud.nacos.discovery.server-addr}
group: ${spring.cloud.nacos.discovery.group} #配置自己的dev
username: ***** #配置自己的username
password: ***** #配置自己的password
namespace: 60331b85-f8f6-47b1-9bbe-04c86086da8f #配置自己的namespace
cluster: default # 配置自己的seata服务cluster, 默认为 default
#dataId: seataServer.properties #配置自己的dataId,由于搭建服务端时把客户端的配置也写在了seataServer.properties,所以这里用了和服务端一样的配置文件,实际客户端和服务端的配置文件分离出来更好
service: #指定事务组名,nacos的seata配置中心内部已经配置了。
#vgroup-mapping: # seata1.0以后改成vgroupMapping
vgroupMapping:
my_test_tx_group: default # 这里my_test_tx_group要特别注意和nacos配置中心中配置的要保持一直;值default要和seata.registry.cluster的值保持一致。
feign:
hystrix:
enabled: false
logging:
level: #日志打印级别。
io:
seata: info
mybatis: #指名mapper地址。
mapperLocations: classpath*:mapper/*.xml
#type-aliases-package: com.atguigu.springcloud.entities #所有Entity别名类所在包
最后启动,齐活。



