irpas技术客

Seata安装与配置、SpringCloud集成分布式事务_jun864954425_seata springcloud配置

大大的周 715

Seata下载地址:Releases · seata/seata · GitHub

?

这里用的是目前最新的版本1.4.2

解压后进入config目录,目录下有file.confog、registry.conf文件,这里用的是nacos做配置与注册

file.confi文件配置稍等直接导入到nacos中先不配置,这里主要配置

Seata服务端配置

registry.conf 修改如下

registry { ? # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa ? type = "nacos"? #这里选择注册中心

? nacos { ? ? application = "seata-server" ? ? serverAddr = "127.0.0.1:8848" ? ? group = "SEATA_GROUP" ? ? namespace = "" ? ? cluster = "default" ? ? username = "nacos" ? ? password = "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 { ? ? serverAddr = "127.0.0.1:8848" ? ? namespace = "" ? ? group = "SEATA_GROUP" ? ? username = "nacos" ? ? password = "nacos" ? ? dataId = "seataServer.properties" ? } ? 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" ? } } ?

以上就是修改注册中心与配置中心

在config下有REAMD_zh.md文件

# 脚本说明

## [client](https://github.com/seata/seata/tree/develop/script/client)?

> 存放用于客户端的配置和SQL

- at: AT模式下的 `undo_log` 建表语句 - conf: 客户端的配置文件 - saga: SAGA 模式下所需表的建表语句 - spring: SpringBoot 应用支持的配置文件

## [server](https://github.com/seata/seata/tree/develop/script/server)

> 存放server侧所需SQL和部署脚本

- db: server 侧的保存模式为 `db` 时所需表的建表语句 - docker-compose: server 侧通过 docker-compose 部署的脚本 - helm: server 侧通过 Helm 部署的脚本 - kubernetes: server 侧通过 Kubernetes 部署的脚本

## [config-center](https://github.com/seata/seata/tree/develop/script/config-center)

> 用于存放各种配置中心的初始化脚本,执行时都会读取 `config.txt`配置文件,并写入配置中心

- nacos: 用于向 Nacos 中添加配置 - zk: 用于向 Zookeeper 中添加配置,脚本依赖 Zookeeper 的相关脚本,需要手动下载;ZooKeeper相关的配置可以写在 `zk-params.txt` 中,也可以在执行的时候输入 - apollo: 向 Apollo 中添加配置,Apollo 的地址端口等可以写在 `apollo-params.txt`,也可以在执行的时候输入 - etcd3: 用于向 Etcd3 中添加配置 - consul: 用于向 consul 中添加配置

undo_log表的脚本存放在与业务表一个库中

-- for AT mode you must to init this sql for you business database. the seata server not need it. CREATE TABLE IF NOT EXISTS `undo_log` ( `branch_id` BIGINT NOT NULL COMMENT 'branch transaction id', `xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id', `context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization', `rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info', `log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status', `log_created` DATETIME(6) NOT NULL COMMENT 'create datetime', `log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime', UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';

seata服务端脚本 这里库就是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), `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`) ) 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);

seata配置文件导入到nacos中把文件中config.txt复制到与config同一级目录下?

config.txt? 其中修改部分 其中default_tx_group可以自定义,后面在项目配置文件中要与之对应否则集成不了seata,剩下的是mysql配置 这里用的是8.0以上mysql 对应驱动com.mysql.cj.jdbc.Driver 8.0版本以下的com.mysql.jdbc.Driver

transport.type=TCP transport.server=NIO transport.heartbeat=true transport.enableTmClientBatchSendRequest=false transport.enableRmClientBatchSendRequest=true transport.rpcRmRequestTimeout=5000 transport.rpcTmRequestTimeout=10000 transport.rpcTcRequestTimeout=10000 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.default_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.rm.sagaJsonParser=fastjson 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 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.cj.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.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 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 server.distributedLockExpireTime=10000 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 tcc.fence.logTableName=tcc_fence_log tcc.fence.cleanPeriod=1h server.session.branchAsyncQueueSize=5000 server.session.enableBranchAsyncRemove=true

配置文件中添加nacos-config.sh的脚本

#!/bin/sh # Copyright 1999-2019 Seata.io Group. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at、 # # http://·mon.exception.FrameworkException: No available service

出现这个原因是因为在客户端依赖低阶版本中初始化时,application的值serverAddr 且是在代码中写的是的,非常难查询。需要更升级高阶版本!

客户端报错情况一

no available service null found, please make sure registry config correct

这里用的是nacos做的配置中心所以在读取的时候如下返回null

这个时候去nacos配置中心找service.vgroupMapping.default_tx_group的值 default? 不应该返回null,然后把这个编辑这个重新发布一下。发现上面的代码返回的是default(坑呀)

?

?

客户端报错情况二

然后重新项目发现还是又出现一个错误

no available service 'default' found, please make sure registry config correct

一个错接着一个错,然后继续排查发现下面的地址为null

?

不应该呀,seata的服务肯定注册上去了。分析刚才虽然改了nacos的值,重启了客户端,但是没有重启服务端。这个时候重启服务端,发现事务生效了。

依赖这里用的版本是spring.cloud.alibaba的版本 ?

<spring.cloud.alibaba.version>2.2.3.RELEASE</spring.cloud.alibaba.version> <!-- 分布式事务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <version>${spring.cloud.alibaba.version}</version> </dependency>

在配置文件中配置如下

logging: level: io: seata: info seata: application-id: order-service tx-service-group: default_tx_group #需要格注意要与nacos对应的一样 registry: type: nacos nacos: application: seata-server namespace: server-addr: localhost:8848 username: nacos password: nacos group: SEATA_GROUP config: type: nacos nacos: namespace: server-addr: localhost:8848 username: nacos password: nacos group: SEATA_GROUP # namespace: 0af6e97b-a684-4647-b696-7c6d42aecce7 #2.2中配置所在命名空间ID,入未配置 默认public空间 service: vgroup-mapping: default_tx_group: default # default 这里要特别注意和nacos中配置的要保持一直

开启事务非常简单 在实现的方法添加

注解@GlobalTransactional @GlobalTransactional @Override public Boolean placeAnOrder(JSONObject jsonObject) { Orders orders = new Orders(); orders.setPid(jsonObject.getLong("pid")); orders.setUid(jsonObject.getString("uid")); // try { //下单 ordersRepository.saveOrUpdateConstruct(orders); //库存 productFeign.deductStock(jsonObject); //积分 JSONObject pointsObject = new JSONObject(); pointsObject.put("uid",orders.getUid()); pointsObject.put("point",jsonObject.getInteger("number")*10); pointsFeign.savePoints(pointsObject); //物流 JSONObject logistics = new JSONObject(); logistics.put("uid",orders.getUid()); logistics.put("pid",orders.getPid()); logisticsFeign.saveLogistics(jsonObject); return true; // } catch (Exception e) { // log.info("下单异常:{}",e); // } // return false; }

经过测试下单服务保存数据成功、库存异常这样下单服务的数据需要回滚,到此seata的分布式已经完成。

ps:觉得集成的成本非常高,客户端配置,服务端配置都要一一对应起来,不能出错,有的时候对应了发现版本影响导致的,或者是配置中心没有生效容易把人心态搞蹦,这个时候静下来,想想步骤哪里有问题。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #Seata #springcloud配置