目录

  • seata分布式事务入门-小白级
  • 一、简介
  • 二、环境准备
  • 资源下载:
  • demo运行环境:
  • 三、搭建Demo
  • 第一步:启动nacos注册中心
  • 第二步:启动seata-server服务端
  • 第三步:依次启动client端应用服务
  • 第四步:验证分布式事务提交及回滚


seata分布式事务入门-小白级

本教程主要是通过seata1.4.0和nacos1.4.0演示seata分布式事务上手体验。如果你对seata和nacos还很陌生建议先点击下面传送门,先穿越10min再回来学习。在这里我将完成一个简单的案例,来让大家了解Seata实现Dubbo分布式事务管理的基本流程。【注:参考每步骤小结,搭建更快哟

一、简介

本文主要介绍SpringBoot2.2.2 + Dubbo 2.7.5 + Mybatis 3.4.2 + Nacos 1.1.3 +Seata 1.0.0整合来实现Dubbo分布式事务管理,使用Nacos 作为 Dubbo和Seata的注册中心和配置中心,使用 MySQL 数据库和 MyBatis来操作数据。

如果你还对`Nacos`、`Seata`不是很了解的话,请访问以下链接:

 - Nacos:https://nacos.io/zh-cn/docs/quick-start.html
 - Seata:https://seata.io/zh-cn/

二、环境准备

资源下载:

nacos下载:https://github.com/alibaba/nacos/releases/tag/1.4.0

seata-server下载:https://github.com/seata/seata/releases/tag/v1.4.0

seata源码下载:https://github.com/seata/seata/tree/v1.4.0

seata-samples下载:https://github.com/seata/seata-samples

demo运行环境:

本次demo运行环境为win10、jdk8、git、mysql5.6+、nacos1.4.0、seata1.4.0

三、搭建Demo

第一步:启动nacos注册中心

本地演示单机模式启动,即解压nacos-server-1.4.0.zip,可以看到bin、conf、target,其中bin目录存放的是启停脚本,conf里存放的配置脚本和sql脚本。修改conf/application.properties,增加MySQL数据源配置。如下:

seabios是legacy吗 seatools bootable教程_seabios是legacy吗

同时需要新建nacos数据库并执行nacos-mysql.sql脚本,创建nacos对应的表,最后执行命令startup.cmd -m standalone启动nacos。如:

seabios是legacy吗 seatools bootable教程_java_02


seabios是legacy吗 seatools bootable教程_seabios是legacy吗_03

小结:
	1)修改nacos存储数据源连接及用户名和密码
	2)创建对应的nacos数据库并执行nacos_mysql.sql脚本
	3)启动nacos单机模式:startup.cmd -m standalone

第二步:启动seata-server服务端

seata分布式事务是C/S架构,server服务端单独部署。本地演示单机模式启动,即解压seata-server-1.4.0.zip,可以看到bin、conf、lib目录,其中bin目录是启动脚本,conf目录存放的是配置文件及日志配置。重点关注file.conf和registry.conf。

数据存储模式:指定seata-server全局事务表、分支事务表、逻辑锁表数据存储的方式。

file:存储到内存中;db:存储到数据库中;redis:存储到redis中(有丢失数据风险)。如:

seabios是legacy吗 seatools bootable教程_java_04


global_table全局事务表

字段

描述

xid

全局事务id

transaction_id

事务id

status

事务状态

application_id

应用id

transaction_service_group

事务分组名称

transaction_name

事务名

timeout

超时时间

begin_time

事务开始实践

application_data

应用数据

gmt_create

全局事务创建时间

gmt_modified

全局事务修改时间

branch_table分支事务表

字段

描述

branch_id

分支事务id

xid

全局事务id

transaction_id

事务id

resource_group_id

资源组id

lock_key

行锁的key

branch_type

分支事务类型

status

分支事务状态

client_id

application_data

应用数据

gmt_create

全局事务创建时间

gmt_modified

全局事务修改时间

lock_table逻辑锁表

字段

描述

row_key

行锁记录

xid

全局事务id

transaction_id

事务id

branch_id

分支事务id

resource_id

资源id

table_name

表名

pk

表的主键

gmt_create

全局事务创建时间

gmt_modified

全局事务修改时间

注册中心及配置中心:本地测试选择file,nacos均可。如选择file则无需修改,本次demo注册中心和配置中心均选择nacos。注意当配置中心为nacos时,本地的file.conf将失去作用,此时需要通过脚本(script/config-center/nacos/nacos-config.py)上传对应的配置文件(script/config-center/config.txt)。注意修改confg.txt配置的存储模式以及数据库连接。如:

seabios是legacy吗 seatools bootable教程_分布式事务_05


seabios是legacy吗 seatools bootable教程_分布式_06


seabios是legacy吗 seatools bootable教程_分布式_07


seabios是legacy吗 seatools bootable教程_seabios是legacy吗_08


seabios是legacy吗 seatools bootable教程_分布式事务_09

小结:
	1)file.conf指定file存储模式,不方便查看事务表数据,不利于跟踪seata分布式事务,因此建议指定db存储模式,注意db模式需要在对应连接的数据库下新建seata数据库,并执行script/client/at/db/mysql.sql脚本。
	2)registry.conf指定seata-server的注册中心和配置中心,注册中心和配置中心没有必然联系,可以配置不同的值。本次demo均选择nacos,所以注意修改上图标红的配置(切记nacos注册中心的group和cluster配置的值以及config配置中心group的值)
	3)找到上传配置的python脚本,右键通过git工具(Git Bash Here),执行命令:nacos-config.py上传配置文件config.txt内容到nacos配置中心。注意:上传之前修改对应的数据库连接以及存储模式。
	4)启动seata-server服务,双击bin/seata-server.bat脚本或者运行main方法。此时可以通过nacos控制台看到seata-server服务已上线。
	另外:须注意config.txt中一个特殊的关键配置(后面会用到)service.vgroupMapping.my_test_tx_group=default

第三步:依次启动client端应用服务

本次client端业务demo以seata-samples下的seata-spring-boot-starter-samples为例,先依次修改application.yml配置,然后再新建seata库并执行(sql/db_seata.sql)脚本,初始化表及数据,最后依次启动account、order、storage、business四个微服务。启动完毕后均可以在nacos控制台上看到服务已上线,如:

seabios是legacy吗 seatools bootable教程_java_10


seabios是legacy吗 seatools bootable教程_分布式_11


seabios是legacy吗 seatools bootable教程_分布式事务_12


seabios是legacy吗 seatools bootable教程_分布式事务_13


seabios是legacy吗 seatools bootable教程_全局事务_14


seabios是legacy吗 seatools bootable教程_分布式事务_15


seabios是legacy吗 seatools bootable教程_java_16

小结: 
    1)以account应用为例,修改application.yml配置文件。
    1.1)修改spring数据源jdbc参数
    1.2)修改seata:
             tx-service-group: my_test_tx_group
    1.3)修改seata:
             service:
              vgroup-mapping:
               my_test_tx_group: default 
    注意:seata.tx-service-group的值必须和seata.service.vgroup-mapping的值一致。
    1.4)修改seata:
             register:
              nacos:
               cluster: default
               group: SEATA_GROUP (默认值,如配置修改需显式覆盖)
    2)运行account应用的main方法
    注意:如seata:
            tx-service-group:my_test_tx_group
的值并非如此,则需要手动像配置中心加入配置service.vgroup-mapping=default

第四步:验证分布式事务提交及回滚

通过idea工具,发起rest请求测试分布式事务正常提交以及异常失败回滚的情况,可以通过打断点的方式观察三张事务表的数据变化。如:

seabios是legacy吗 seatools bootable教程_分布式_17

请求参数:

{
    "userId":"1",
    "commodityCode":"C201901140001",
    "name":"fan",
    "count":50,
    "amount":"100"
}