我们都知道现在使用微服务,那么就会出现一种情况,就是一个功能,从 A 服务,到 B 服务,然后到 C 服务,每个服务都可能需要去调取不同的服务,而这个服务之间的调用,而当他们使用三个独立的数据源的时候,那么他们也就只能保证自己每个服务内部的事务,而去全局的一致性,则是没有办法保证的,也就是我们再面试的时候,经常会被问到的分布式事务。
分布式事务
其实分布式事务用一句话概括,那就是一次业务操作,如果横跨多个数据源或者需要跨多个系统进行远程调用的话,就会产生分布式事务问题。
如何解决分布式事务
分布式事务其实现在解决方案有很多,比如 TCC方案,XA 方案,本地消息表,可靠消息最终一致性方案,最大努力通知方案等等,但是这种方案实现上肯定都是偏复杂的,而阿里我们都知道他是有一套自己解决分布式事务的方案的,那么大家都知道是什么呢?今天了不起就来和大家看看这个 Seata 一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
Seata简介
Senta 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
我们来看看官网的介绍,
Seata官网
图片
突然看到这个图里面的术语的时候,是不是有点懵,我们来看看这个Seata的术语
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其实如果看上面的图,我们看看这个处理过程
图片
接下来我们直接来实战试一下这个Seata的实际操作。
Seata-Server安装
我们直接用官网的Demo来学习一下
快速开始
我们挑选一个不是那么新的版本,毕竟都知道,新版本中那可是有很多坑的,一个不留神就踩进去,学习还是稳一手。
图片
下载完成,直接解压,然后去找到文件目录,
我们直接找到config下的 file.config,
修改file.conf
主要就是修改,事务日志存储模式为db+数据库连接信息
我们直接把mode改为db
然后db改为我们自己的数据库地址
图片
然后我们去把数据库给创建好,建表语句在config下的 readme文件中。
图片
我们找到 server 的 Mysql 的建表语句
图片
ok了 建表成功。
修改registry.conf
还是同样的目录,我们再修改一下 registry.conf 主要是来修改nacos的信息的,因为 Seata 其实推荐的也是 nacos,所以下面的这个 type 我们直接来改成自己的 naocs 就可以了。
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
application = "seata-server"
serverAddr = "127.0.0.1:8848"
group = "SEATA_GROUP"
namespace = "5518397c-7ea8-4f55-89ca-dacfc6fdf914"
cluster = "default"
username = "nacos"
password = "nacos"
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos"
nacos {
serverAddr = "127.0.0.1:8848"
namespace = "5518397c-7ea8-4f55-89ca-dacfc6fdf914"
group = "SEATA_GROUP"
username = "nacos"
password = "nacos"
dataId = "seataServer.properties"
}
...
}
获取 config.txt 文件
直接获取config.txt
config.txt
然后我们修改一下store
图片
配nacos
先从git上面下载 nacos-config.sh,然后推送配置到nacos
nacos-config.sh
把 nacos-config.sh 文件放到 config 下,然后执行命令
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 5518397c-7ea8-4f55-89ca-dacfc6fdf914 -u nacos -w nacos
命令的解释如下:
-h: 注册到注册中心的ip
-p: Server rpc 监听端口
-m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
-n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
-e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html
图片
执行这个有个前提,那就是registry.conf中的namespace和命令中的必须保持一样,并且在 nacos中也增加了对应的命名空间,如果你没有仔细的看文档,并且没有对 nacos 中的命名空间做增加的话,那么你就肯定失败,然后在 nacos 中就是看不到自己的配置情况。
图片
创建完成之后,就会出现这个命名空间的ID,我们直接来随机的,然后复制这个ID 到registry.conf中配置一下就可以了。
大家可以看到上面的图中出现了total-count是98,但是failure-count:1 我们看执行完命令后,失败的是哪个,
nacos-config.sh: line 88: [: too many arguments
Set store.publicKey= failure
这个失败了,但是有人可能会失败四个
Set store.publicKey= failure
Set store.redis.sentinel.masterName= failure
Set store.redis.sentinel.sentinelHosts= failure
Set store.redis.password= failure
其实这四个并不影响这个执行,因为我们可以去 Nacos 中看配置情况,
图片
因为了不起之季节吧这个 store.redis 的内容给全注释了。所以只有一个没成功。
接下来我们就可以启动seata了。
启动 seata
我们这里先不考虑这个client,因为可以在我们后面使用的时候再去添加这个
直接执行 bin/seata-server.bat 文件,然后看看能启动成功不。
图片
当我们看到这个 Server started 的时候,我们就知道,我们的 seata 的服务端就启动成功了,到这里我们的 seata 的安装和配置就算是已经完成了。
你学会了么?