seata如果不是很了解的话可以直接到官网查看官方文档说明:http://seata.io/zh-cn/docs/overview/what-is-seata.html
如果你还对SpringBoot、Dubbo、Nacos、Seata、Mybatis 不是很了解的话,这里我为大家整理个它们的官网网站,如下
-
SpringBoot:https://spring.io/projects/spring-boot
-
Seata:https://seata.io/zh-cn/
本例子主要模块为以下版本:
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_table、branch_table和lock_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 : 修改为自己的数据库
url、port、数据库名称 - 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

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

被折叠的 条评论
为什么被折叠?



