# spring-cloud-transaction **Repository Path**: mmcLine/spring-cloud-transaction ## Basic Information - **Project Name**: spring-cloud-transaction - **Description**: SpringCloud+Eureka+Mybatis+Seata分布式事务 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-03 - **Last Updated**: 2021-08-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-cloud-transaction #### 介绍 SpringCloud+Eureka+Mybatis+Seata分布式事务 #### 软件架构 eureka-server:注册中心 trade:交易中心 user:用户中心 user-api:用户中心暴露的api #### 安装教程 ### 分布式事务Seata **项目框架** - SpringCloud:2.0.6.RELEASE - Eureka - Seata :1.0.0 - Mybatis :3.4.2 - ShardingSphere :4.0.0-RC2 项目地址:https://gitee.com/mmcLine/spring-cloud-transaction 项目下载之后有以下模块: - doc/seata-server-1.0.0 存放seata-server服务端,方便下载 - trade 交易中心 - user 用户中心 - user-api 用户中心暴露的接口 启动步骤: #### 一、Eureka 不需要修改任何配置,直接启动即可。 启动完毕访问:http://localhost:8761/ #### 二、seata-server **seata-server/conf/file.conf** 需要修改的地方: 1. 改动1:vgroup_mapping.my_tx_group = "seata-server" 这个my_tx_group是我自定义的组名称,可以随意定义,这个seata-server是seata-server服务端注册到eureka里的名称。 2. 改动2:将file改为db 3. 改动3:修改数据库信息,用户名密码,数据库连接等 ``` transport { # tcp udt unix-domain-socket type = "TCP" #NIO NATIVE server = "NIO" #enable heartbeat heartbeat = true #thread factory for netty enable-client-batch-send-request = true thread-factory { boss-thread-prefix = "NettyBoss" worker-thread-prefix = "NettyServerNIOWorker" server-executor-thread-prefix = "NettyServerBizHandler" share-boss-worker = false client-selector-thread-prefix = "NettyClientSelector" client-selector-thread-size = 5 client-worker-thread-prefix = "NettyClientWorkerThread" # netty boss thread size,will not be used for UDT boss-thread-size = 5 #auto default pin or 8 worker-thread-size = 8 } shutdown { # when destroy server, wait seconds wait = 3 } serialization = "seata" compressor = "none" } service { #vgroup->rgroup // 改动1:my_tx_group这个事务组名称是我自定义的,一定要与client端(与业务项目的配置一致)的这个配置一致!否则会报错! vgroup_mapping.my_tx_group = "seata-server" #only support single node default.grouplist = "127.0.0.1:8091" disableGlobalTransaction=false #degrade current not support enableDegrade = false #disable disable = false #unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanent max.commit.retry.timeout = "-1" max.rollback.retry.timeout = "-1" } client { rm { async.commit.buffer.limit = 10000 lock { retry.internal = 10 retry.times = 30 retry.policy.branch-rollback-on-conflict = true } report.retry.count = 5 table.meta.check.enable = false report.success.enable = true } tm { commit.retry.count = 5 rollback.retry.count = 5 } undo { data.validation = true log.serialization = "jackson" log.table = "undo_log" } log { exceptionRate = 100 } support { # auto proxy the DataSource bean spring.datasource.autoproxy = false } } ## transaction log store store { ## store mode: file、db # 改动2:修改为db mode = "db" ## file store file { dir = "sessionStore" # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions max-branch-session-size = 16384 # globe session size , if exceeded throws exceptions max-global-session-size = 512 # file buffer size , if exceeded allocate new buffer file-write-buffer-cache-size = 16384 # when recover batch read size session.reload.read_size = 100 # async, sync flush-disk-mode = async } ## database store db { ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc. datasource = "druid" ## mysql/oracle/h2/oceanbase etc. db-type = "mysql" #改动3:修改数据库信息 url = "jdbc:mysql://localhost:3306/gwms_seata?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8" user = "root" password = "0490218292" min-conn = 10 max-conn = 30 global.table = "global_table" branch.table = "branch_table" lock-table = "lock_table" query-limit = 1000 } } lock { ## the lock store mode: local、remote mode = "remote" local { ## store locks in user's database } remote { ## store locks in the seata's server } } recovery{ committing-retry-delay = 30 asyn-committing-retry-delay = 30 rollbacking-retry-delay = 30 timeout-retry-delay = 30 } transaction { undo.data.validation = false undo.log.serialization = "jackson" undo.log.save.days = 7 undo.log.delete.period = 86400000 undo.log.table = "undo_log" } ## metrics settings metrics { enabled = false registry-type = "compact" # multi exporters use comma divided exporter-list = "prometheus" exporter-prometheus-port = 9898 } support { ## spring spring { # auto proxy the DataSource bean datasource.autoproxy = false } } ``` **seata-server/conf/registry.conf** 1. 改动1:type改为eureka 2. 改动2:eureka.application的名字是seata注册到eureka的名字 ``` registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa # 改动1:type改为eureka type = "eureka" nacos { serverAddr = "localhost" namespace = "public" cluster = "default" } eureka { serviceUrl = "http://localhost:8761/eureka/" application = "seata-server" //改动2:这里的名字是seata注册到eureka的名字 weight = "1" } redis { serverAddr = "localhost:6379" db = "0" } zk { cluster = "default" serverAddr = "127.0.0.1:2181" session.timeout = 6000 connect.timeout = 2000 } consul { cluster = "default" serverAddr = "127.0.0.1:8500" } 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 = "file" nacos { serverAddr = "localhost" namespace = "public" cluster = "default" } consul { serverAddr = "127.0.0.1:8500" } apollo { app.id = "default" apollo.meta = "http://192.168.1.204:8801" } zk { serverAddr = "127.0.0.1:2181" session.timeout = 6000 connect.timeout = 2000 } etcd3 { serverAddr = "http://localhost:2379" } file { name = "file.conf" } } ``` 执行bin目录下的启动脚本,启动seata-server #### 三、User服务 1. 先执行resources/sql/下的sql语句。 2. 修改resources/file.conf,部分代码如下: ``` service { #transaction service group mapping #修改的地方:my_tx_group是我们上面定义的组名称,seata-server是seata-server的服务端注册的名称 vgroup_mapping.my_tx_group = "seata-server" #only support when registry.type=file, please don't set multiple addresses default.grouplist = "127.0.0.1:8091" #degrade, current not support enableDegrade = false #disable seata disableGlobalTransaction = false } ``` 3. 修改resources/registry.conf,部分代码如下: ``` eureka { serviceUrl = "http://localhost:8761/eureka" // 修改的地方:项目名称跟seata注册到eureka里的服务名一致 application = "seata-server" weight = "1" } ``` 4. 修改resources/seata.conf,部分代码如下: ``` client { # seata-server名称 application.id = seata-server #自定义的组名称 transaction.service.group = my_tx_group } ``` 5. bootstrap.properties ``` #这个my_tx_group自定义命名很重要,server,client都要保持一致 spring.cloud.alibaba.seata.tx-service-group=my_tx_group ``` 6. 运行UserApplication启动项目 #### 四、Trade 基本步骤同User,只不过trade/resources/sql里有两个sql都要执行。 启动TradeApplication。 #### 使用说明 访问:http://localhost:8005/trade/testAdd?name=abc&age=3。 查看数据表user的数据是否回滚,然后注释掉addOrder里的报错,看数据是否能正常新增。