代码引用的原文链接:https://blog.csdn.net/xc1158840657/article/details/88428068
写这篇文章的目的主要是希望给像我一样的小白在使用springcloud集成fescar一点帮助。
项目拆分成为微服务的过程中,原来由本地事务保证的ACID,在拆分为微服务后遇到了问题。原本一个本地事务被拆分到多个微服务,由多个本地事务组成。如何保证由多个微服务的本地事务还能像本地事务一样呢?这就要用到分布式事务框架。
分布式事务框架大体分为两种侵入式和非侵入式
非侵入式:
XA: 最早的分布式方案,成熟,但是需要数据库支持XA协议,mysql的话应该是5.0.3以后就支持了,但是数据库引擎必须是INNODB,同时存在bug,所以使用使用XA方案的话可能需要使用5.7以后的版本。该方案在2pc阶段会持续占用数据库资源,效率不高。
Fescar:阿里开源的非侵入式开源分布式事务方案。可以理解为XA方案的升级版,不需要数据库XA的支持。目前版本0.4.1支持dubbo PRC,不支持springCloud。
侵入式:
TCC:这种方案也有项目落地,但是需要编写代码来实现回滚,开发代价高。
在网上查阅资料发现fescar就可以简单修改代码实现对springCloud的支持。
直接上代码吧,github地址https://github.com/lalagou/springcloud_fescar
这是我本地的测试代码,环境idea+windows
运行步骤:
1.下载fescar-service,解压,运行bin/fescar-server.bat 文件。fescar-service相当于TC的功能吧。
fescar-service下载地址 https://github.com/seata/seata/releases
2.执行fescar-demo.sql文件
3.运营一个eurake工程作为服务的注册中心。可以通过idea自动生成代码都不用写。主要是
@EnableEurekaServer注解和yaml文件中defalutZone配置。
4.account-service,business-service,order-service,storage-service四个服务都启动起来。
5.运行postman或者其他工具发送请求,参数
url: http://localhost:11112/business
method: PUT
header: contentType = application/json
requestBody:
{
“userId”:“U100001”,
“commodityCode”:“C00321”,
“orderCount”:2
}
如果程序启动报错,请查看对比如下事项:
1.fescar-service的版本要与工程pom的依赖版本一致,不然可能报错。我的demo中的版本是0.4.1所以fescar-service也运行0.4.1的版本比较好。
2.工程中不要启用feign.hystrix.enabled,也就是feign.hystrix.enabled=false。如果启用的XID传递不出来,因为XID是保存在
ThreadLocal变量中的。话feign.hystrix.enabled=true的话可以查看一下日志会启动一个新线程。这个问题搞了几天需要注意一下。
这里的具体原因可以参考
https://segmentfault.com/a/1190000018438157?utm_source=tag-newest 提到的 Hystrix 隔离 中的分析与解决方法。
fescar的分布式事务执行流程是怎么样的?
1.TM向TC(fesacr-service)申请一个全局事务,XID
2.XID通过请求在微服务中传播
3.微服务中的RM向TC注册事务申请加入全局事务
4.TM提交决议,事务提交或者回滚
5.TC协调各微服务本地事务回滚或者提交。
demo工程TM,RM模块是怎么与TC (fescar_service)联系起来的?
TM,RM是随demo一起在服务端,demo用的是默认配置,默认走的file类型的配置。在demo依赖的fescar-config包中有一个文件叫file.conf。其中的default.grouplist就是fescar-service的ip与端口。
demo与fescar-service运行在一个服务器没有问题,如果fescar-service,demo运行在不同的服务器上怎么办呢?
其实看了在上了一个问题中提到的file.conf的话,就知道只要修改default.grouplist=127.0.0.1:8091默认配置为我们想要端口就可以了。复制file.conf文件,修改default.grouplis为我们自己的fescar-service的ip与端口,放在自己项目的resources目录下,重新启动。
怎么设置fescar-service本身的启动端口?
cmd fescar-server.bat $LISTEN_PORT $PATH_FOR_PERSISTENT_DATA $IP(此参数可选)
服务端口 PATH_FOR_PERSISTENT_DATA: 事务操作记录文件存储路径(已存在路径)
LISTEN_PORT:为启动端口