linux 部署seata1.5.2
1. 版本需求:
依赖版本:
<spring.boot.version>2.6.11</spring.boot.version> <spring-cloud.version>2021.0.4</spring-cloud.version> <com-alibaba-cloud.version>2021.0.4.0</com-alibaba-cloud.version> <java.version>1.8</java.version>
服务版本:
seata:1.5.2, nacos:2.2.0
2. linux上seata部署
2.1 官网地址:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
2.2 下载安装包并/usr/local/chdz下并解压
2.3. 进入目录/usr/local/chdz/seata/conf下修改application.yml配置
application.yml
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: ${user.home}/logs/seata
extend:
logstash-appender:
destination: 127.0.0.1:4560
kafka-appender:
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstash
console:
user:
username: seata
password: seata
seata:
config:
type: nacos
nacos:
server-addr: 192.168.xx.xxx:8848
namespace: fb109d39-80dd-44fc-9a83-fe56483b5b7d
group: SEATA_GROUP
username: nacos
password: nacos
data-id: seataServer
registry:
type: nacos
nacos:
application: seata-server
server-addr: 192.168.xx.xxx:8848
group: SEATA_GROUP
namespace: fb109d39-80dd-44fc-9a83-fe56483b5b7d
cluster: default
username: nacos
password: nacos
store:
mode: db
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.xx.xxx:3306/seata?rewriteBatchedStatements=true
user: root
password: 123456
min-conn: 5
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 100
max-wait: 5000
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
注:seata.config.data-id为 seataServer
2.4 创建数据库seata并添加表
2.4.1 脚本位置
2.4.2 脚本内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | -- -------------------------------- 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_status_gmt_modified` (`status` , `gmt_modified`), KEY `idx_transaction_id` (`transaction_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; -- 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 = utf8mb4; -- 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`), KEY `idx_xid_and_branch_id` (`xid` , `branch_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; 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); |
2.5 在naocs中添加配置
2.5.1 原始文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | # For details about configuration items, see https://seata.io/zh-cn/docs/ user /configurations.html #Transport configuration, for client and server transport.type=TCP transport.server=NIO transport.heartbeat= true transport.enableTmClientBatchSendRequest= false transport.enableRmClientBatchSendRequest= true transport.enableTcServerBatchSendResponse= false transport.rpcRmRequestTimeout=30000 transport.rpcTmRequestTimeout=30000 transport.rpcTcRequestTimeout=30000 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 # Transaction routing rules configuration, only for the client service.vgroupMapping.default_tx_group= default #If you use a registry, you can ignore it service. default .grouplist=127.0.0.1:8091 service.enableDegrade= false service.disableGlobalTransaction= false # Transaction rule configuration, only for the 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= true 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 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 # For TCC transaction mode tcc.fence.logTableName=tcc_fence_log tcc.fence.cleanPeriod=1h #Log rule configuration, for client and server log.exceptionRate=100 # Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional. store.mode=file store.lock.mode=file store.session.mode=file #Used for password encryption store.publicKey= #If `store.mode,store.lock.mode,store.session.mode` are not equal to `file`, you can remove the configuration block. 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 #These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. 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 =username store.db. password = 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 #These configurations are required if the `store mode` is `redis`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `redis`, you can remove the configuration block. 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 # Transaction rule configuration, only for the server 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 server.xaerNotaRetryTimeout=60000 server.session.branchAsyncQueueSize=5000 server.session.enableBranchAsyncRemove= false server.enableParallelRequestHandle= false #Metrics configuration, only for the server metrics.enabled= false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898 |
2.5.2 修改之后的内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | # For details about configuration items, see https://seata.io/zh-cn/docs/ user /configurations.html #Transport configuration, for client and server transport.type=TCP transport.server=NIO transport.heartbeat= true transport.enableTmClientBatchSendRequest= false transport.enableRmClientBatchSendRequest= true transport.enableTcServerBatchSendResponse= false transport.rpcRmRequestTimeout=30000 transport.rpcTmRequestTimeout=30000 transport.rpcTcRequestTimeout=30000 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 # Transaction routing rules configuration, only for the client service.vgroupMapping.default_tx_group= default #If you use a registry, you can ignore it service. default .grouplist=127.0.0.1:8091 service.enableDegrade= false service.disableGlobalTransaction= false # Transaction rule configuration, only for the 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= true 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 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 # For TCC transaction mode tcc.fence.logTableName=tcc_fence_log tcc.fence.cleanPeriod=1h #Log rule configuration, for client and server log.exceptionRate=100 # Transaction storage configuration, only for the server. The file, DB, and redis configuration values are optional. store.mode=db store.lock.mode=db store.session.mode=db #Used for password encryption store.publicKey= #These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block. store.db.datasource=druid store.db.dbType=mysql store.db.driverClassName=com.mysql.cj.jdbc.Driver store.db.url=jdbc:mysql://192.168.xx.xxx:3306/seata?useUnicode= true &rewriteBatchedStatements= true store.db. user =root store.db. password =123456 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 # Transaction rule configuration, only for the server 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 server.xaerNotaRetryTimeout=60000 server.session.branchAsyncQueueSize=5000 server.session.enableBranchAsyncRemove= false server.enableParallelRequestHandle= false #Metrics configuration, only for the server metrics.enabled= false metrics.registryType=compact metrics.exporterList=prometheus metrics.exporterPrometheusPort=9898 |
注:
2.6 启动seata ./seata-server.sh -h 127.0.0.1 -m db
2.6.1 nacos中服务列表
2.6.2 点击seata-server详情 IP为172.17.0.1
2.6.3 使用ip重新启动 ./seata-server.sh -h 192.168.xx.xxx -m db
2.6.4 再次查看nacos中的信息
注:使用 ./seata-server.sh -h 127.0.0.1 -m db不行的原因是因为 客户端(RM)与 服务(TC)无法通信
2023-04-24 10:19:31.359 ERROR 55056 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : 0101 can not connect to 172.17.0.1:8091 cause:can not register RM,err:can not connect to services-server. io.seata.common.exception.FrameworkException: can not register RM,err:can not connect to services-server. at io.seata.core.rpc.netty.NettyClientChannelManager.doConnect(NettyClientChannelManager.java:250) ~[seata-all-1.5.2.jar:1.5.2] at io.seata.core.rpc.netty.NettyClientChannelManager.acquireChannel(NettyClientChannelManager.java:112) ~[seata-all-1.5.2.jar:1.5.2] at io.seata.core.rpc.netty.NettyClientChannelManager.reconnect(NettyClientChannelManager.java:196) ~[seata-all-1.5.2.jar:1.5.2] at io.seata.core.rpc.netty.AbstractNettyRemotingClient$1.run(AbstractNettyRemotingClient.java:115) [seata-all-1.5.2.jar:1.5.2] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_161]
3.客户端搭建
3.1 添加表 undo_log
地址:https://github.com/seata/seata/blob/master/script/client/at/db/mysql.sql
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 = utf8mb4 COMMENT ='AT transaction mode undo table';
3.2 添加pom.xml
<dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.5.2</version> </dependency> <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>
3.2 添加bootstrap.yml
seata:
registry:
# 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC)
type: nacos
nacos:
server-addr: 192.168.xx.xxx:8848 # seata server 所在的nacos服务地址
namespace: fb109d39-80dd-44fc-9a83-fe56483b5b7d
application: seata-server # seata server 的服务名seata-server ,如果没有修改可以不配
username: nacos
password: nacos
group: SEATA_GROUP # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配
config:
type: nacos
nacos:
server-addr: 192.168.xx.xxx:8848
namespace: fb109d39-80dd-44fc-9a83-fe56483b5b7d
username: nacos
password: nacos
group: SEATA_GROUP
dataId: seataServer
tx-service-group: default_tx_group
注:default_tx_group 要与 2.5.2 步骤中 service.vgroupMapping.default_tx_group=default 一致
官网地址:https://seata.io/zh-cn/docs/user/txgroup/transaction-group-and-ha.html
3.3 添加注释 @GlobalTransactional
@GlobalTransactional @Override public boolean editUserAndFactoryName(String name) { String xid = RootContext.getXID(); log.info("xid:"+xid); UserPO userPO = new UserPO().setUserId(1).setUserName("用户" + name); boolean b = updateById(userPO); boolean b1 = remoteFactoryService.editFactory(1, "工厂" + name); return b & b1; }
源码分析:
https://blog.csdn.net/LiuRenyou/article/details/119798993
GlobalTransactionalInterceptor.invoke()为开头。
TransactionalTemplate.execute()为结尾。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix