文章目录
一。解决的问题
seata
的出现是为了更好的解决分布式事务的问题,相比于之前的单机库,服务只操作一个数据库的时候,用我们大家熟悉的@Transactional
注解就能做好一些单一事务的控制。但是微服务架构之后,各个服务所调用的数据库可能不一致,就造成了一个服务对应多个数据库或者多个服务对应多个数据库的情况,就会出现下图的情况:
一句话来说,一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题。
二。Seata简介
seata官网文档:http://seata.io/zh-cn/docs/overview/what-is-seata.html
1.Seata 是什么?
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
2.三大组件
TC (Transaction Coordinator)
- 事务协调者 维护全局和分支事务的状态,驱动全局事务提交或回滚。TM (Transaction Manager)
- 事务管理器定义全局事务的范围:开始全局事务、提交或回滚全局事务。RM (Resource Manager)
- 资源管理器管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
3.处理过程
4.使用方法
使用方法很简单,只需要在需要做分布式事务控制的业务逻辑代码上加上@GlobalTransactional
注解即可。
三。seata1.4+nacos+mysql配置
1.seata准备
官方文档强烈推荐我们使用seata1.4来使用Nacos作为配置中心:
所以我们选择下载1.4版本,下载地址如下:https://github.com/seata/seata/releases
下载完成后,文件夹内容如下:
2.修改file.conf,registry.conf配置文件内容
(注意:修改之前记得先进行备份操作)
打开conf文件夹:
修改file.conf
:
修改registry.conf
:
3.下载config.txt与nacos-config.sh文件
1.4版本config.txt
下载地址:
https://github.com/seata/seata/blob/1.4.0/script/config-center/config.txt
1.4版本nacos-config.sh
下载地址:https://github.com/seata/seata/blob/1.4.0/script/config-center/nacos/nacos-config.sh
这两个文件的作用:
config.txt就是seata各种详细的配置,执行 nacos-config.sh
即可将这些配置导入到nacos,这样就不需要将file.conf和registry.conf放到我们的项目中了,需要什么配置就直接从nacos中读取。
nacos-config.sh操作流程
在nacos中新建一个命名空间seata:
拿到seata的命名空间id:
打开nacos-config.sh的存放路径,右键打开GitBash命令行:
输入命令行,将这些配置导入到nacos的seata命名空间中:
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t adb63345-4bbf-4db3-9e1c-12df6146e52b -u nacos -w nacos
命令解析:
-h -p
指定nacos的端口地址;-g
指定配置的分组,注意,是配置的分组;-t
指定命名空间id;-u -w
指定nacos的用户名和密码,同样,这里开启了nacos注册和配置认证的才需要指定。
导入成功的标志:
nacos中可以看见相关配置:
config.txt操作流程
修改config.txt配置文件内容:
将其放在config同级目录下:
4.数据库文件
1.4版本mysql数据库语句:https://github.com/seata/seata/blob/1.4.0/script/server/db/mysql.sql
全部导入数据库后,seata数据库如下所示:
四。启动Seata
1.首先启动nacos,保证nacos运行正常:
2.点击bin
目录下的seata-server.bat
文件,启动seata:
3.启动成功:
4.打开nacos,可以找到seata注册的服务:
(注:注册服务默认分组为SEATA_GROUP
,若需要修改分组,修改registry.conf配置文件即可)
五。项目配置
1.在pom.xml文件中导入seata依赖:
<!--seata 1.4版本依賴 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
2.增加application.yml配置:
spring:
cloud:
alibaba:
seata:
enabled: true
enable-auto-data-source-proxy: true #开启使用seata对数据源进行代理
#在nacos上查找seata的配置信息
tx-service-group: my_test_tx_group
registry:
type:
nacos:
application: seata-server
server-addr: localhost:8848
username: nacos
password: nacos
config:
type: nacos
nacos:
server-addr: localhost:8848
group: SEATA_GROUP #默认上传的组名
username: nacos
password: nacos
namespace: adb63345-4bbf-4db3-9e1c-12df6146e52b
service:
vgroup-mapping:
my_test_tx_group: default
disable-global-transaction: false
client:
rm:
report-success-enable: false
3.注意事项:
4.seata默认组名为my_test_tx_group
,需要更换时,修改config.txt
文件即可:
5.最后在需要做分布式事务控制的代码上加上@GlobalTransactional
就大功告成了!