## 前言 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_order`和`seata_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模式。