一、nacos
1. 创建nacos数据库
创建nacos数据库,运行nacos-mysql.sql
2. 修改 nacos下conf的application.properties文件
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
3. 运行nacos下bin的shartup.cmd文件
修改cmd文件的 MODE = "standalone"
(单机模式)
然后启动cmd文件
访问:localhost:8848/nacos
默认账号密码为:nacos
二、 seata
1. 创建数据库
创建seata数据库,运行db_store.sql
文件。0.9以下包含db_store.sql
文件
在业务库中运行db_undo_log.sql
(管理事物日志表)
2. 对seta进行配置并推送到nacos
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableClientBatchSendRequest=false
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
service.vgroupMapping.service-goods-group=default
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false
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.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
store.mode=db
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
store.db.url=jdbc:mysql://localhost:3306/seata?useUnicode=true
store.db.user=root
store.db.password=root
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
client.undo.dataValidation=true
client.undo.logSerialization=jackson
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898
-
配置文件注意:
(a)file.conf
和registry.conf
两个配置文件中的格式统一转换为驼峰格式
(b)service.vgroupMapping.service-goods-group=default
(service-goods-group为自定义与后期项目中seata配置保持一致) -
将配置文件推送到nacos
sh nacos-config.sh localhost
3. 修改registry.conf
并启动seata
因为seata的配置已经推送到nacos,所以我们用nacos方式启动seata
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "localhost"
namespace = "public"
cluster = "default"
username = ""
password = ""
}
file {
name = "file.conf"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "localhost"
namespace = "public"
group = "SEATA_GROUP"
username = ""
password = ""
}
file {
name = "file.conf"
}
}
启动seata下bin的seata-server.bat
文件
三、启动项目测试全局事务回滚
1. 搭建微服务项目包含用户服务、订单服务。订单服务yml配置seata时,tx-service-group
与之前seata向nacos推送的配置保持一致
配置seata数据源代理
import com.alibaba.druid.pool.DruidDataSource;
import io.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class SeataConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
}
在启动类上配置排除自动加载数据源
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
配置seata的yml
为下方代码说明
${spring.application.name} = service-goods
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: ${spring.application.name}-group
enable-auto-data-source-proxy: true
config:
type: nacos
nacos:
namespace: public
server-addr: ${spring.cloud.nacos.discovery.server-addr}
group: SEATA_GROUP
registry:
type: nacos
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: public
cluster: default
2. 启动项目测试回滚效果
可以观察到数据库进行了回滚,没有脏数据生成。
注意事项
- 如果没有按照上述在nacos创建
service.vgroupMapping.service-goods-group=default
配置,项目启动后会报
- 如果设置全局异常,异常被手动捕获时,
seata
获取不到异常不会进行回滚操作。