1. 为什么你的微服务需要分布式事务?
如果你正在用 Ruoyi-Cloud 开发一个电商系统,用户下单这个动作,背后可能涉及好几个微服务:订单服务创建订单、库存服务扣减库存、优惠券服务核销优惠券、积分服务增加积分。想象一下,如果订单创建成功了,库存也扣了,结果在核销优惠券的时候系统报错了,那会怎么样?用户没拿到优惠,但库存已经没了,这显然是个大问题。在单体应用里,一个数据库事务就能保证“要么全成功,要么全失败”,但在微服务架构下,数据分散在不同的数据库里,传统的本地事务就无能为力了。这就是分布式事务要解决的“数据一致性”难题。
Seata 就是阿里开源的一个分布式事务解决方案,它就像微服务世界的“总导演”,负责协调各个服务上的数据操作,确保大家步调一致。而 Ruoyi-Cloud 作为一个基于 Spring Cloud 的优秀开源微服务框架,天然就适合集成 Seata 来补全这块能力。我见过不少团队在整合时踩坑,要么配置对不上,要么事务不生效,折腾好几天。其实,只要把几个关键点理顺了,整个过程可以非常顺畅。这篇文章,我就结合自己多次在 Ruoyi-Cloud 项目中整合 Seata 2.0 的经验,带你一步步走通,避开那些常见的“坑”,让你能快速在项目中用上稳定可靠的分布式事务。
2. 搭建你的分布式事务“作战指挥部”
在开始写代码之前,我们需要先把“指挥部”搭建起来,也就是 Seata 的服务端(我们叫它 TC,事务协调器)。它不参与具体的业务,只负责全局事务的发起、提交和回滚的协调工作。
2.1 核心组件安装与环境准备
首先,你得准备好三个“基础设施”:Nacos(服务注册与配置中心)、Seata Server(TC)、以及 Ruoyi-Cloud 项目本身。版本选择很重要,不匹配是很多错误的根源。我建议的版本组合是:Nacos 2.x(稳定版即可)、Seata 2.0.0 及以上、Ruoyi-Cloud 最新 Master 分支。你可以从它们的官网或Gitee仓库轻松下载。
下载完 Seata Server 后,别急着启动。我们需要先为它准备一个“数据库”,用来持久化分布式事务的状态信息(比如哪些事务正在进行、哪些分支完成了)。Seata 支持多种存储模式,对于生产环境,我强烈推荐使用数据库(store.mode=db)模式,性能和数据可靠性都比文件模式好得多。
在你的 MySQL 里新建一个数据库,比如就叫 seata,然后执行官方提供的 sql/seata-server-2.0.0.sql 脚本(脚本在下载的Seata压缩包里)。这个脚本会创建 global_table、branch_table、lock_table 等核心表。这些表相当于 Seata 的“工作日志”,记录了所有全局事务和分支事务的详细信息,TC 就是靠它们来管理和协调的。这一步千万别省,也别用错的脚本版本。
2.2 在 Nacos 中配置 Seata Server
接下来是配置的关键环节:让 Seata Server 知道从哪里读取配置,以及如何注册自己。我们选择把配置放在 Nacos 里,这样最灵活。首先,在 Nacos 控制台创建一个独立的命名空间,比如叫 ruoyi-seata。这样做的好处是配置隔离,不会和你的业务配置混在一起。
然后,在这个命名空间下,新建一个配置文件,Data ID 就叫 ruoyiSeata.properties。配置文件的内容决定了 Seata Server 的行为。下面是我整理的一个生产可用的配置示例,你需要把里面的 xx.xx.xx.xx 换成你实际的数据库和 Nacos 地址:
# 存储模式:db 代表数据库
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://xx.xx.xx.xx:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
store.db.user=你的用户名
store.db.password=你的密码
store.db.minConn=5
store.db.maxConn=30
# 事务组映射,这是连接 Ruoyi-Cloud 微服务的关键!
# 格式:service.vgroupMapping.你的微服务事务组名=default
service.vgroupMapping.ruoyi-job-group=default
service.vgroupMapping.ruoyi-system-group=default
# 你可以继


2219

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



