seata分布式事务处理教程

seata

参考博客:https://www.pianshen.com/article/84721946457/

https://www.jianshu.com/p/dec4550efbfc

参考视频:https://www.bilibili.com/video/BV12Q4y1A7Nt

特别注意:Seata目前只支持JDK1.8,我用jdk11、jdk14都不能正常运行,都报同一个gc的问题,估计是垃圾回收啥的。

seata分布式事务处理教程_第1张图片

一、下载

官网:http://seata.io

GitHub地址:https://github.com/seata/seata

1.1、下载

seata分布式事务处理教程_第2张图片

1.2、解决下载失败

因为这是国外的服务器,下载是是否缓慢的。有些时候快下载玩了,直接失败了。所以想下载是非常费力的,下面介绍一个网站,直接复制连接即可。

网址:https://offcloud.com/#/instant

邮箱:[email protected]
密码:[通用密码]

seata分布式事务处理教程_第3张图片

seata分布式事务处理教程_第4张图片

seata分布式事务处理教程_第5张图片

seata分布式事务处理教程_第6张图片

这样就下载完成了

二、更改配置

2.1、复制文件和注入sql脚本到MySQL

在项目的 nimble-make\nm-demo\springCloudAlibaba\spring-cloud-seata\file文件下有。

复制文件

1.0以前版本的seata复制一下四个文件,在官网也能寻找到。

注:seata官方从1.0版本后不再提供sql脚本,以及nacos推送配置脚本,需要从0.9.0的版本复制

seata分布式事务处理教程_第7张图片

  • 从官网寻找文件

nacos-config.sh 文件: https://github.com/seata/seata/tree/1.3.0/script/config-center/nacos

seata分布式事务处理教程_第8张图片

nacos-config.txt文件:https://github.com/seata/seata/tree/1.3.0/script/config-center

seata分布式事务处理教程_第9张图片

db_undo_log.sqlsql文件 https://github.com/seata/seata/tree/1.3.0/script/client/at/db

seata分布式事务处理教程_第10张图片

db_store.sqlsql文件 https://github.com/seata/seata/tree/1.3.0/script/server/db

seata分布式事务处理教程_第11张图片

注入sql脚本

db_store.sql中只有三张表,将这三张表保存道MySQL中的 seata这个数据库中。

db_store.sql这个是seata控制事务的时候需要使用到的。将这个sql放到MySQLseata这个数据库下面,这个数据名是默认的,我们可以更改。但是一般我们都使用默认的。

seata分布式事务处理教程_第12张图片

seata分布式事务处理教程_第13张图片

db_undo_log.sql这个sql文件中只有一张 undo_log 表,是专门保存事务的唯一id这些的,这张表需要在我们需要控制事务的每个数据库中,也就是说我们需要使用到全局事务的所有库中都需要添加这张表。目前我的案例中虽然有四个微服务,但是我连接的库都是同一个,所以我就在这个库中添加这张表。

seata分布式事务处理教程_第14张图片

2.2、更改配置文件

虽然我使用JDK11jdk14都没有启动成功,但是我电脑是安装JDK14的,所以我是在虚拟机中安装测试的。配置文件我就在Windows上展示了,都一样的。

修改file.conf文件

文件在 \seata\conf目录下。

seata分布式事务处理教程_第15张图片

seata分布式事务处理教程_第16张图片

注意使用mysql8.0及以上版本的需要将驱动更改为:driverClassName = “com.mysql.cj.jdbc.Driver”

查询MySQL版本:在NavicatSELECT VERSION();就可以查询到了。

seata分布式事务处理教程_第17张图片

seata分布式事务处理教程_第18张图片

这里数据库的驱动并不难找到,以为我们项目中就连接过数据库,所以说就直接到我们本地仓库中就可以找到数据驱动的jar包了。寻找的时候,首先找到数据库驱动引入方式,在找到本地仓库,根据驱动引入的路径就可以寻找到。

seata分布式事务处理教程_第19张图片

修改registry.conf文件

这里主要有两个父节点 registryconfig,分别将这两个节点的的type动改为nacos,那么其余的注册中心配置就可以删除了。

seata分布式事务处理教程_第20张图片

更改后的文件

registry {
     
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
     
    application = "seata-server"
    serverAddr = "192.168.164.128:8848"
    group = "SEATA_GROUP"
    namespace = ""
    cluster = "default"
    username = "nacos"
    password = "nacos"
  }
}

config {
     
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
     
    serverAddr = "192.168.164.128:8848"
    namespace = ""
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
  }
}

applicationseata启动后注册到nacos的服务名(愿意改就改,不愿意改就默认就行)

需要注意:如果这里更改了,在程序中可能也要更改,应该要保持一致吧,没有测试过。

seata分布式事务处理教程_第21张图片

注:group默认为:SEATA_GROUP,更改DEFAULT_GROUP或者和自己服务相同的group,否则会报错No available service

seata分布式事务处理教程_第22张图片

修改 nacos-conf.txt文件

注意:这个文件在seata1.0.0版本以后是不提供的,需要在之前版本中复制,2.1复制文件这里说的很清楚了。

seata分布式事务处理教程_第23张图片

service.vgroupMapping.my_test_tx_group=default
service.disableGlobalTransaction=false
store.mode=db
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://www.it307.top:3306/seata?useUnicode=true
store.db.user=root
store.db.password=mallmysql
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

官网上写的很多,但是都有默认的,我们只需要关键这些就可以了。

seata分布式事务处理教程_第24张图片

nacos-conf.txt文件发送到nacos注册中心

这时就要使用到 nacos-config.sh这个文件了,这个文件的来源 2.1小结也说了。这里要确保 nacos-conf.txt文件和nacos-config.sh命令要在同一个文件夹下面,否则怎么知道你的问价在哪里呢?

seata分布式事务处理教程_第25张图片

一般使用的命令

sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca -u username -w password

-h:主机,默认值为localhost。

-p:端口,默认值为8848。

-g:配置分组,默认值为“ SEATA_GROUP”。

-t:租户信息,对应于Nacos的名称空间ID字段,默认值为。

-u:用户名,权限控制上的nacos 1.2.0+,默认值为。

-w:密码,权限控制上的nacos 1.2.0+,默认值为“”。

这里因为是Linux命令,所以我们需要使用git的命令窗口,或者直接在Linux服务器上发送也行。

sh nacos-config.sh -h 192.168.164.128 -p 8848 -unacos -wnacos

其他默认值,我们可以不用带,这里的用户名密码和端口都可以不用带,这些都是默认值。

seata分布式事务处理教程_第26张图片

注意:官方是说这样可以将配置文件推送到nacos的,但是我试了一直提示 ./nacos-config.sh nacosIp,所以推不上去。

sh nacos-config.sh 192.168.164.128

我直接这样推送,结果是没有问题的。可能是应为我是在Windows上使用git命令模拟操作的把。但是这样的没有关系,最后nacos数据持久化时都是采用MySQL存储,如果推不上去,那么我们就启动一个用户名和密码和端口等等都是默认的nacos,将数据推上去了,在从MySQL中将数据赋值到正式的nacos对应的MySQL库中。毕竟做持久化只需要配置一下就行了,不是很麻烦。

seata分布式事务处理教程_第27张图片

seata分布式事务处理教程_第28张图片

这个配置如果不注入nacos控制台会不断答应 no available service 'null' found, please make sure registry config correct,找不到可用服务null,请确保注册表正确。

2020-10-18 00:06:29.848 ERROR 11884 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager  : no available service 'null' found, please make sure registry config correct

seata分布式事务处理教程_第29张图片

三、搭建seata

3.1、更改配置文件

seata分布式事务处理教程_第30张图片

seata分布式事务处理教程_第31张图片

seata分布式事务处理教程_第32张图片

seata分布式事务处理教程_第33张图片

3.2、启动

seata分布式事务处理教程_第34张图片

启动的时候报了一个连接MySQL的异常,因为我们之前将 nacos-config.txt中的配置文件nacos中了,所以导致seata不能启动,但是 nacos-config.txtseata这里的 file.confregistry.conf文件都没有配置错误。

seata分布式事务处理教程_第35张图片

  • 解决方法

nacos-config.txt文件注入到nacos中的数据全部删除,在启动seata

seata分布式事务处理教程_第36张图片

  • 在启动seata

seata分布式事务处理教程_第37张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0NfvFbaB-1609121985939)(C:\Users\stars\AppData\Roaming\Typora\typora-user-images\image-20201017232807913.png)]

这里的服务名是在 registry.conf文件中配置的。

seata分布式事务处理教程_第38张图片

四、对接案例

4.1、整体业务流程梳理

我这里写了四个功能,分别是业务服务,订单服务,库存服务,账号服务。另外还有一个公共模块,因为之前的seata需要自己写一个定义一个数据源和代理,但是我这次是写了,但是没有使用,结果还是能够实现分布式事务的效果。

首先访问 business-service业务模块中的 /placeOrder/placeOrderFallBack接口,这两个接口其实都一样,只是传输的参数不同而已。这连个接口去调用库存服务 storage-service减库存,和订单服务处理订单 order-service。然后订单服务处理完订单后有调用账号服务 account-service去减少用户的余额等信息。但是如果用户等于 U002,那么我们就在账号服务中制造一个异常,让之前处理的全部数据回滚。

seata分布式事务处理教程_第39张图片

seata分布式事务处理教程_第40张图片

4.2、maven依赖说明

  • 引入seata依赖

<dependency>
    <groupId>com.alibaba.cloudgroupId>
    <artifactId>spring-cloud-starter-alibaba-seataartifactId>
    
    <exclusions>
        <exclusion>
            <artifactId>seata-allartifactId>
            <groupId>io.seatagroupId>
        exclusion>
    exclusions>
dependency>

<dependency>
    <groupId>io.seatagroupId>
    <artifactId>seata-allartifactId>
    <version>1.3.0version>
dependency>

为什么需要将里面的 seata-all排除掉重新引入,原因不太清楚。 spring-cloud-starter-alibaba-seata依赖的版本号是在 spring-cloud-alibaba-dependencies版本控制器里面定义好了。我们新引入的 seata-all依赖的版本号就和seata一样。seata我们使用哪个版本的,这里就使用哪个版本就OK。

只要涉及到分布式事务控制的时候,都需要这个依赖,因为里面涉及到一个xid分布式事务id的传递。这个功能目前不用我们担心了,但是可以去参考一下官方文档上的介绍。

这里因为测试的这几个工程都在同一个父工程下面,每个工程都需要连接数据库和事务这一块,我就将seatamybatisplus和数据库驱动等依赖同一放在这几个工程的父pom中了。

seata分布式事务处理教程_第41张图片

其实每个工程下面还有一个web依赖和nacos注册与发现的依赖,这两个依赖完全可以放到父pom中的,不过不想更改了,就这样吧。

4.3、yml配置讲解

bootstrap.yml中配置nacos相关来接,application.yml在这里配置都一样,没有固定要求的。

seata分布式事务处理教程_第42张图片

seata分布式事务处理教程_第43张图片

seata分布式事务处理教程_第44张图片

seata分布式事务处理教程_第45张图片

4.4、测试

注意:这个nacos-config.txt文件我们之前注入nacos再去启动seata,提示mysql那边有些问题。所以我们将 nacos-config.txt注入到nacos的所有配置文件都删除了,现在还没有添加进去。如果现在启动微服务,是能够启动成功,但是只要遇到 @GlobalTransactional注解的地方就不能使用了。控制台会一直打印一下错误信息。

2020-10-18 00:10:09.438 ERROR 15876 --- [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager  : no available service 'null' found, please make sure registry config correct

seata分布式事务处理教程_第46张图片

nacos-conf.txt注册到nacos中,参考 2.2小结。

  • 将四个微服务启动

没有顺序而言,随便起。

seata分布式事务处理教程_第47张图片

  • 目前的数据状况

seata分布式事务处理教程_第48张图片

  • 正常流程
http://localhost:9090/placeOrder
  • 异常请求,数据回滚
http://localhost:9090/placeOrderFallBack

请求一下正常流程

seata分布式事务处理教程_第49张图片

seata分布式事务处理教程_第50张图片

这个结果是满意的,因为没有出现任何差错。

请求一次异常,然后在观察一下数据,数据是否回滚。

seata分布式事务处理教程_第51张图片

seata分布式事务处理教程_第52张图片

seata分布式事务处理教程_第53张图片

五、seata集群

集群,其实可以多启动几个seata到注册中心就可以了,但是另外还有一个根据事务组来隔离,应该可以说成隔离吧。

像nacos注入多个seata,可以在命令后面添加 -p 端口号

sh seata-server.sh -p 8094

seata分布式事务处理教程_第54张图片

  • 使用事务分组

registry.conf配置文件中 nacos.cluster名称更改为集群名称,在将 nacos-config.txt文件中的 service.vgroupMapping.my_test_tx_group=testCluster更改为对应的集群明名称,因为这个是注入nacos中的,直接在nacos中更改也可以。最后在项目的配置文件中指定事务组 tx-service-group: my_test_tx_group,这样就搞定了。

seata分布式事务处理教程_第55张图片

  • 启动项目

这里的使用群组的方式集群,不知道哪里还有些小毛病没有成功。

常见的问题

io.seata.common.exception.FrameworkException: can not connect to services-server.

提示无法连接到 services-server服务器,一般需要注意一下配置。

seata分布式事务处理教程_第56张图片

seata分布式事务处理教程_第57张图片

seata分布式事务处理教程_第58张图片

seata分布式事务处理教程_第59张图片

其次就检查,是不是部署的seata挂了。我目前的状态就是部署号的seata关闭了。

你可能感兴趣的:(spring,cloud,alibaba,java)