前言
- 由于BladeX底层做了seata的配置优化,省去了不少繁琐的配置,所以对于应用服务来说,几乎是无感接入
- order为订单服务,storage为库存服务,本章将以这两个服务讲解如何对接到Seata实现分布式事务
- 打开BladeX-Biz工程,到
/doc/sql/seata
目录依次执行sql脚本
- 打开BladeX-Biz工程,找到如下项目

对接准备
- 需要接入seata的服务pom.xml引入分布式事务依赖

- LauncherServiceImpl开启seata基础配置, 系统会根据服务名自动注册配置,所以无需修改,打开即可

- 程序启动器使用seata专用的注解

- 在接口的第一层请求方法加上对应的两个注解

- 这里以docker为例,保持seata服务开启状态

- 使用sql创建
seata_order
和seata_storage
的库

- 对应数据库结果如下

- 两张表的初始数据如下


服务启动
- 启动blade-seata-order服务


- 启动完毕后查看控制台,可以看到服务注册成功

- 同样启动balde-seata-storage服务

- 启动完毕查看控制台,服务同样注册成功

分布式事务测试
- 开启BladeX的核心服务以获取token

- 开启BladeX-Biz的网关服务

- 调用oauth2接口,获取token

- 填入order接口 [POST][http://localhost/blade-seata-order/order/create] 并配置token请求头

- 先测试普通正常调用的情况,返回操作成功

- 对应数据变化如下


- 下面我们调大数值,测试模拟异常的情况,返回创建订单失败

- 对应数据没有变化,那是不是回滚成功了呢?下面我们来看控制台的数据


分布式事务验证
- 打开blade-seata-storage的控制台,可以看到如下日志

- 打开docker控制台,可以看到如下日志

- 再结合数据库数据没有变化,说明分布式事务成功回滚
- 为了再次验证准确性,我们重复第一次的调用,模拟订单成功

- 查看数据库的数据,发现主键从2跳跃至3,说明上一个请求确实是数据入库又被回滚了

后记
- seata目前已经发布至1.x版本,可以用于生产环境,但每个版本配置变化较大,希望大家跟着bladex的主分支版本来
- 测试下来感觉seata的file模式足够使用,集群可以考虑file+db模式。
- nacos模式配置使用复杂,目前版本遗留有些许问题,所以暂时不推荐对接nacos,推荐直接使用file+db模式。