分布式事件seata(AT)与nacos整合-笔记2

打印 上一主题 下一主题

主题 873|帖子 873|积分 2619

本文属于b站图灵课堂springcloud笔记系列。讲的好还不要钱,值得推荐。
接上篇:分布式事件seata(AT)与nacos整合-笔记1-CSDN博客
用户下单,订单服务调用库存服务扣减库存,调用账户服务扣减账户余额
事件发起者:订单服务
事件参与者:库存服务,账户服务
工程改造:

订单服务(事件发起者)
1 pom引入seata依赖
  1. <!-- seata 依赖-->
  2. <dependency>
  3.     <groupId>com.alibaba.cloud</groupId>
  4.     <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  5. </dependency>
复制代码
2 订单服务库增长undo_log 表
  1. CREATE TABLE IF NOT EXISTS `undo_log`
  2. (
  3.     `branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',
  4.     `xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',
  5.     `context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
  6.     `rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',
  7.     `log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',
  8.     `log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',
  9.     `log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',
  10.     UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
  11. ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
  12. ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);
复制代码
 3 订单服务application.yml 增长seata配置
  1. seata:
  2.   # seata 服务分组,要与服务端配置service.vgroup_mapping的后缀对应
  3.   tx-service-group: default_tx_group
  4.   registry:
  5.     # 指定nacos作为注册中心
  6.     type: nacos
  7.     nacos:
  8.       application: seata-server
  9.       server-addr: tlmall-nacos-server:8848
  10.       namespace:
  11.       group: SEATA_GROUP
  12.   config:
  13.     # 指定nacos作为配置中心
  14.     type: nacos
  15.     nacos:
  16.       server-addr: tlmall-nacos-server:8848
  17.       namespace:
  18.       group: SEATA_GROUP
  19.       data-id: seataServer.properties
复制代码
推荐在 Nacos配置中心创建一个dataId为seata-client.yml的配置,导入seata的配置
微服务的application.yml引入seata-client.yml
这里留意:client与server的注册、配置中namespace、group 保持一致。
4 使用一个 @GlobalTransactional 注解在下单方法上:
  1.     @Override
  2.     @GlobalTransactional(name="createOrder",rollbackFor=Exception.class)
  3.     public Result<?> createOrder(String userId, String commodityCode, Integer count) {
  4.         logger.info("[createOrder] current XID: {}", RootContext.getXID());
复制代码
账务服务、库存服务前3步一样,第四步改为增长注解@Transactional

检测:
重启服务,举行下单测试。

  1. 2024-12-13T17:21:27.925+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] i.seata.tm.api.DefaultGlobalTransaction  : Begin new global transaction [192.168.192.96:8091:7566643934839149108]
  2. 2024-12-13T17:21:27.926+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] o.t.t.service.impl.OrderServiceImpl      : [createOrder] current XID: 192.168.192.96:8091:7566643934839149108
  3. 2024-12-13T17:21:29.480+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] io.seata.rm.AbstractResourceManager      : branch register success, xid:192.168.192.96:8091:7566643934839149108, branchId:7566643934839149116, lockKeys:order:61
  4. 2024-12-13T17:21:29.592+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] o.t.t.service.impl.OrderServiceImpl      : [createOrder] orderId: 61
  5. 2024-12-13T17:21:29.592+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] i.seata.tm.api.DefaultGlobalTransaction  : transaction 192.168.192.96:8091:7566643934839149108 will be commit
  6. 2024-12-13T17:21:29.729+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] i.seata.tm.api.DefaultGlobalTransaction  : transaction end, xid = 192.168.192.96:8091:7566643934839149108
  7. 2024-12-13T17:21:29.729+08:00  INFO 28792 --- [tlmall-order] [io-8030-exec-10] i.seata.tm.api.DefaultGlobalTransaction  : [192.168.192.96:8091:7566643934839149108] commit status: Committed
  8. 2024-12-13T17:21:30.393+08:00  INFO 28792 --- [tlmall-order] [h_RMROLE_1_3_16] i.s.c.r.p.c.RmBranchCommitProcessor      : rm client handle branch commit process:BranchCommitRequest{xid='192.168.192.96:8091:7566643934839149108', branchId=7566643934839149116, branchType=AT, resourceId='jdbc:mysql://rm-cn-8ly41gxcw000160o.rwlb.rds.aliyuncs.com:3306/tlmall_order', applicationData='{"skipCheckLock":true}'}
  9. 2024-12-13T17:21:30.394+08:00  INFO 28792 --- [tlmall-order] [h_RMROLE_1_3_16] io.seata.rm.AbstractRMHandler            : Branch committing: 192.168.192.96:8091:7566643934839149108 7566643934839149116 jdbc:mysql://XX.rds.aliyuncs.com:3306/tlmall_order {"skipCheckLock":true}
  10. 2024-12-13T17:21:30.394+08:00  INFO 28792 --- [tlmall-order] [h_RMROLE_1_3_16] io.seata.rm.AbstractRMHandler            : Branch commit result: PhaseTwo_Committed
复制代码
成功的日志显示出:PhaseTwo_Committed
模拟扣库存成功,扣约失败,触发事件回滚的场景。看数据库的数据,还是会回滚归去。只是调用会出现异常。这是2.0的兼容性问题:
  1. 2024-12-13T17:23:26.025+08:00  INFO 28792 --- [tlmall-order] [nio-8030-exec-5] i.seata.tm.api.DefaultGlobalTransaction  : Begin new global transaction [192.168.192.96:8091:7566643934839149119]
  2. 2024-12-13T17:23:26.025+08:00  INFO 28792 --- [tlmall-order] [nio-8030-exec-5] o.t.t.service.impl.OrderServiceImpl      : [createOrder] current XID: 192.168.192.96:8091:7566643934839149119
  3. 2024-12-13T17:23:26.740+08:00  INFO 28792 --- [tlmall-order] [nio-8030-exec-5] i.seata.tm.api.DefaultGlobalTransaction  : transaction 192.168.192.96:8091:7566643934839149119 will be rollback
  4. 2024-12-13T17:23:27.167+08:00  INFO 28792 --- [tlmall-order] [nio-8030-exec-5] i.seata.tm.api.DefaultGlobalTransaction  : transaction end, xid = 192.168.192.96:8091:7566643934839149119
  5. 2024-12-13T17:23:27.168+08:00  INFO 28792 --- [tlmall-order] [nio-8030-exec-5] i.seata.tm.api.DefaultGlobalTransaction  : [192.168.192.96:8091:7566643934839149119] rollback status: Rollbacked
复制代码
此处seata2.0 会吞异常,自界说异常等原始异常被重新包装转成RuntimeException无法捕捉。
至此,可以验证通过seata办理分布式事件问题。
至于2.0版本选择,还是要慎重。现在推荐1.8。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表