使用nacos作為saeta的注冊中心和配置中心
1.啟動seata-server
-
下載下傳seata-server(直接下載下傳打包好的)
seata下載下傳位址
- 修改seata-server下conf/regitry.conf配置
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos" # 修改注冊中心的類型為nacos
nacos {
application = "seata-server" # seata注冊的服務名稱
serverAddr = "127.0.0.1:8848" # nacos的注冊位址
group = "SEATA_GROUP" # nacos服務分組
namespace = "" # nacos服務空間 預設為"public"
cluster = "default"
username = "nacos" # 啟用nacos密碼服務驗證需要
password = "nacos" # 啟用nacos密碼服務驗證需要
}
eureka {
serviceUrl = "http://localhost:8761/eureka"
application = "default"
weight = "1"
}
redis {
serverAddr = "localhost:6379"
db = 0
password = ""
cluster = "default"
timeout = 0
}
zk {
cluster = "default"
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
}
consul {
cluster = "default"
serverAddr = "127.0.0.1:8500"
aclToken = ""
}
etcd3 {
cluster = "default"
serverAddr = "http://localhost:2379"
}
sofa {
serverAddr = "127.0.0.1:9603"
application = "default"
region = "DEFAULT_ZONE"
datacenter = "DefaultDataCenter"
cluster = "default"
group = "SEATA_GROUP"
addressWaitTime = "3000"
}
file {
name = "file.conf"
}
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos" # 修改配置中心的類型為nacos
nacos {
serverAddr = "127.0.0.1:8848"
namespace = ""
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties" # 使用nacos的配置 後面要在nacos配置中心建立
}
consul {
serverAddr = "127.0.0.1:8500"
aclToken = ""
}
apollo {
appId = "seata-server"
## apolloConfigService will cover apolloMeta
apolloMeta = "http://192.168.1.204:8801"
apolloConfigService = "http://192.168.1.204:8080"
namespace = "application"
apolloAccesskeySecret = ""
cluster = "seata"
}
zk {
serverAddr = "127.0.0.1:2181"
sessionTimeout = 6000
connectTimeout = 2000
username = ""
password = ""
nodePath = "/seata/seata.properties"
}
etcd3 {
serverAddr = "http://localhost:2379"
}
file {
name = "file.conf"
}
}
- 啟動seata-server
直接啟動seata-server-1.4.2\bin下的bat或sh,看到nacos服務清單裡面有seata-server則表示seata服務啟動成功
spring cloud alibaba整合分布式事務seata1.4.2
2.seata配置
- 建立data-id為seataServer.properties的配置,與seata-server conf裡面的data-id保持一緻
spring cloud alibaba整合分布式事務seata1.4.2 配置内容:主要修改注釋的内容
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.my_test_tx_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.tableMetaCheckerInterval=60000 client.rm.sqlParserType=druid client.rm.reportSuccessEnable=false client.rm.sagaBranchRegisterEnable=false client.tm.commitRetryCount=5 client.tm.rollbackRetryCount=5 client.tm.defaultGlobalTransactionTimeout=60000 client.tm.degradeCheck=false client.tm.degradeCheckAllowTimes=10 client.tm.degradeCheckPeriod=2000 store.mode=db # 改成db模式 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 store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=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 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 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 client.undo.onlyCareUpdateColumns=true server.undo.logSaveDays=7 server.undo.logDeletePeriod=86400000 client.undo.logTable=undo_log client.undo.compress.enable=true client.undo.compress.type=zip client.undo.compress.threshold=64k log.exceptionRate=100 transport.serialization=seata transport.compressor=none metrics.enabled=false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898
提示:添加完配置之後要重新開機seata-server使配置生效
3.添加seata需要的mysql表
seata需要的資料庫表
需要将seata需要的表導入到資料庫當中,由于seata與業務共用一套事務,最好把seata的資料庫表放到業務表裡面。我測試如果不需要記錄的話可以選擇不添加seata表也是可以復原事務的。
4.服務端配置
每個服務都需要添加這些配置
- maven配置
<!-- seata分布式事務 --> <!--seata begin--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <exclusion> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.4.2</version> </dependency>
- 配置檔案
# ** seata的配置 **# seata.config.type=nacos # 防止瘋狂打日志 seata.config.nacos.namespace= seata.config.nacos.data-id=seataServer.properties seata.config.nacos.server-addr=localhost:8848 seata.config.nacos.group=SEATA_GROUP seata.config.nacos.username=nacos seata.config.nacos.password=nacos # ** seata配置 **# seata.enabled=true seata.application-id=seata-server # ** 用戶端和服務端在同一個事務組 **# seata.tx-service-group=my_test_tx_group #**at模式下資料源自動代理**# seata.enable-auto-data-source-proxy=true seata.service.vgroup-mapping.my_test_tx_group=default #***seata服務注冊到nacos***# seata.registry.type=nacos # 防止瘋狂打日志 seata.registry.nacos.namespace= # seata的服務名稱 seata.registry.nacos.application=seata-server seata.registry.nacos.group=SEATA_GROUP seata.registry.nacos.server-addr=localhost:8848 seata.registry.nacos.cluster=default seata.registry.nacos.username=nacos seata.registry.nacos.password=nacos
[email protected]全局事務
使用@GlobalTransactional全局事務注解,注解在需要分布式事務的業務上面
@GetMapping("/pay")
@GlobalTransactional(name="seata-server")
@Transactional
public Result userPay(){
SysUser sysUser = new SysUser();
sysUser.setUserName("123");
sysUserService.save(sysUser);
// 擷取全局的xid
String xid = GlobalTransactionContext.getCurrentOrCreate().getXid();
log.info("xid:{}",xid);
// openfeign遠端調用的事務
testService.test();
// 異常測試 出現異常後test資料復原
int i = 1/0;
// 使用者支付
return Result.success("ok");
}
預設使用的是at模式不侵入業務代碼,tcc和xa模式需要根據業務調整代碼具有較強的侵入性但更靈活,也具有更高的性能。