编辑 | blame | 历史 | 原始文档

前言

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

对接准备

  1. 需要接入seata的服务pom.xml引入分布式事务依赖
    ![](../../images/screenshot_1587616152624.png)
  2. LauncherServiceImpl开启seata基础配置, 系统会根据服务名自动注册配置,所以无需修改,打开即可
    ![](../../images/screenshot_1582793856918.png)
  3. 程序启动器使用seata专用的注解
    ![](../../images/screenshot_1582795823469.png)
  4. 在接口的第一层请求方法加上对应的两个注解
    ![](../../images/screenshot_1582795878887.png)
  5. 这里以docker为例,保持seata服务开启状态
    ![](../../images/screenshot_1582794011987.png)
  6. 使用sql创建seata_orderseata_storage的库
    ![](../../images/screenshot_1582794759991.png)
  7. 对应数据库结果如下
    ![](../../images/screenshot_1582794787674.png)
  8. 两张表的初始数据如下
    ![](../../images/screenshot_1582795308208.png)
    ![](../../images/screenshot_1582795317168.png)

服务启动

  1. 启动blade-seata-order服务
    ![](../../images/screenshot_1582794045454.png)
    ![](../../images/screenshot_1582794159772.png)
  2. 启动完毕后查看控制台,可以看到服务注册成功
    ![](../../images/screenshot_1582794098226.png)
  3. 同样启动balde-seata-storage服务
    ![](../../images/screenshot_1582794230563.png)
  4. 启动完毕查看控制台,服务同样注册成功
    ![](../../images/screenshot_1582794290124.png)

分布式事务测试

  1. 开启BladeX的核心服务以获取token
    ![](../../images/screenshot_1582794385091.png)
  2. 开启BladeX-Biz的网关服务
    ![](../../images/screenshot_1582794423459.png)
  3. 调用oauth2接口,获取token
    ![](../../images/screenshot_1582794509348.png)
  4. 填入order接口 [POST][http://localhost/blade-seata-order/order/create] 并配置token请求头
    ![](../../images/screenshot_1582794625817.png)
  5. 先测试普通正常调用的情况,返回操作成功
    ![](../../images/screenshot_1582794873806.png)
  6. 对应数据变化如下
    ![](../../images/screenshot_1582794903710.png)
    ![](../../images/screenshot_1582794915700.png)
  7. 下面我们调大数值,测试模拟异常的情况,返回创建订单失败
    ![](../../images/screenshot_1582794975230.png)
  8. 对应数据没有变化,那是不是回滚成功了呢?下面我们来看控制台的数据
    ![](../../images/screenshot_1582794903710.png)
    ![](../../images/screenshot_1582794915700.png)

分布式事务验证

  1. 打开blade-seata-storage的控制台,可以看到如下日志
    ![](../../images/screenshot_1582795108819.png)
  2. 打开docker控制台,可以看到如下日志
    ![](../../images/screenshot_1582795150720.png)
  3. 再结合数据库数据没有变化,说明分布式事务成功回滚
  4. 为了再次验证准确性,我们重复第一次的调用,模拟订单成功
    ![](../../images/screenshot_1582795217821.png)
  5. 查看数据库的数据,发现主键从2跳跃至3,说明上一个请求确实是数据入库又被回滚了
    ![](../../images/screenshot_1582795254667.png)

后记

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