使用seata解决分布式事物问题

本文详细介绍了如何配置和使用Seata进行分布式事务管理,包括Seata Server的安装、Nacos配置、数据库模式的设置以及在Spring Boot、Spring Cloud项目中的应用。通过@GlobalTransactional注解实现分布式事务的处理,确保业务操作的一致性。

seata如果不是很了解的话可以直接到官网查看官方文档说明:http://seata.io/zh-cn/docs/overview/what-is-seata.html

如果你还对SpringBootDubboNacosSeataMybatis 不是很了解的话,这里我为大家整理个它们的官网网站,如下

本例子主要模块为以下版本:
springboot版本:2.2.5.RELEASE
spring-cloud版本:Hoxton.SR3
spring-cloud-alibaba版本:2.2.1.RELEASE
seata版本:1.4.0
nacos版本:1.4.0

如果还没安装好nacos环境的可以参考文档:nacos下载与安装

整个业务逻辑由4个微服务提供支持:

  • 库存服务(storage):扣除给定商品的存储数量。
  • 订单服务(order):根据购买请求创建订单。
  • 帐户服务(account):借记用户帐户的余额。
  • 业务服务(business):处理业务逻辑。
  • 公共模块(common):公共模块。

一、下载并安装seata-server

1,下载seata
https://github.com/seata/seata/releases
在这里插入图片描述
2,解压并移动到 /usr/local/ 目录下

tar -zxvf seata-server-1.4.0.tar.gz
mv seata seata-1.4.0
mv seata-1.4.0/ /usr/local/
cd /usr/local/seata-1.4.0/

3,修改 conf/registry.conf 配置
目前seata支持如下的file、nacos 、apollo、zk、consul的注册中心和配置中心。这里我们以nacos 为例。
将 type 改为 nacos

registry {
   
   
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"
  loadBalance = "RandomLoadBalance"
  loadBalanceVirtualNodes = 10

  nacos {
   
   
    application = "seata-server"
    serverAddr = "192.168.2.112:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = ""
    password = ""
  }
}

config {
   
   
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
   
   
    serverAddr = "192.168.2.112:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = ""
    password = ""
  }
}
  • serverAddr = “192.168.2.112:8848” :nacos 的地址
  • namespace = “” :nacos的命名空间默认为``
  • cluster = “default” :集群设置未默认 default

4,修改 config.txt 文件
config.txt 配置文件需要自行下载,下载后放到seata根目录下面,下载地址:https://github.com/seata/seata/blob/develop/script/config-center/config.txt

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.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=file
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
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.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
store.redis.host=127.0.0.1
store.redis.port=6379
store.redis.maxConn=10
store.redis.minConn=1
store.redis.database=0
store.redis.password=null
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
log.exceptionRate=100
transport.serialization=seata
transport.compressor=none
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

配置的详细说明参考官网:http://seata.io/zh-cn/docs/user/configurations.html
这里主要修改了如下几项:

  • store.mode :存储模式 默认file 这里我修改为db 模式 ,并且需要三个表global_tablebranch_tablelock_table
  • store.db.driverClassName=com.mysql.jdbc.Driver
  • store.db.db-type=mysql : 存储数据库的类型为mysql
  • store.db.url=jdbc:mysql://192.168.2.112:3306/seata_config?useUnicode=true : 修改为自己的数据库urlport数据库名称
  • store.db.user=root :数据库的账号
  • store.db.password=123456 :数据库的密码
  • service.vgroupMapping.order-seata-tx-group=default
  • service.vgroupMapping.account-seata-tx-group=default
  • service.vgroupMapping.storage-seata-tx-group=default
  • service.vgroupMapping.business-seata-tx-group=default

注意:如果mysql版本为8.0以上的版本,需要使用8.x以上的驱动包,并且将 store.db.driverClassName=com.mysql.jdbc.Driver 配置改为 store.db.driverClassName=com.mysql.cj.jdbc.Driver
然后直接到seata/lib目录下,将8版本的jar包粘贴到目录下

db模式下的所需的三个表的数据库脚本下载地址:https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql

5、将 Seata 配置添加到 Nacos 中
脚本下载地址:https://github.com/seata/seata/blob/develop/script/config-center/nacos/nacos-config.sh
下载后将脚本放到 seata bin/ 目录下,并将脚本权限改成具有可执行权限

cd bin
chmod 755 nacos-config.sh

执行 nacos-config.sh 脚本,将配置上传到nacos

sh ./nacos-config.sh

看到输出如下内容,说明脚本已经执行成功
在这里插入图片描述
登陆到nacos控制台也能够看到上传的配置内容
在这里插入图片描述
6、使用db模式启动 seata

sh seata-server.sh -h 192.168.2.112 -p 8091 -m db
Options:
    --host, -h
      The host to bind,主机绑定ip,nacos的注册地址
      Default: 0.0.0.0
    --port, -p
      The port to listen.
      Default: 8091
    --storeMode, -m
      log store mode : file、db
      Default: file
    --help

Server端存储模式(store.mode)现有file、db、redis三种,file模式无需改动,直接启动即可,下面专门讲下db和redis启动步骤。
注: file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

二、代码构建

项目地址:https://gitee.com/hwm0717/springcloud_seata_demo
4个微服务提供支持:

  • 库存服务(storage):扣除给定商品的存储数量。
  • 订单服务(order):根据购买请求创建订单。
  • 帐户服务(account):借记用户帐户的余额。
  • 业务服务(business):处理业务逻辑。
  • 公共模块(common):公共模块。

我们只需要在业务处理的方法handleBusiness添加一个注解 @GlobalTransactional 即可实现分布式事物的处理

请求逻辑架构:
在这里插入图片描述
pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>seata.demo</groupId>
    <artifactId>springcloud_seata_demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <springboot.version>2.2.5.RELEASE</springboot.version>
        <mysql.connector.java.version>8.0.21</mysql.connector.java.version>
        <druid-spring-boot-starter.version>1.1.22</druid-spring-boot-starter.version>

        <seata.version>1.4.0</seata.version>

        <!-- Spring Settings -->
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <modules>
        <module>business</module>
        <module>account</module>
        <module>order</module>
        <module>storage</module>
        <module>common</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值