【Spring Cloud】seata分布式事务官方入门案例(导读2)

文章目录

  • [1. 准备seata环境](#1. 准备seata环境)
    • [1.1. 生产环境启动seata](#1.1. 生产环境启动seata)
    • [1.2. 采用代码启动seata](#1.2. 采用代码启动seata)
  • [2. 开始测试](#2. 开始测试)
  • [3. 附录](#3. 附录)
    • [3.1. 如果第一次配置seata压缩包](#3.1. 如果第一次配置seata压缩包)
    • [3.2. 常见问题参考](#3.2. 常见问题参考)

本文是针对官方seata入门文章https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/user-guide/seata/quick-start的 补充说明!补充说明!补充说明 !如果读者在阅读官方入门文章有问题或困惑请参考本文。

seata分布式事务官方入门案例导读1(实战版)
seata分布式事务官方入门案例导读2(实战版)

1. 准备seata环境

1、启动mysql

shell 复制代码
docker start mysql_mall_learning

2、启动nacos

备注:如果没有设置db存储请自行设置db存储,下面是作者本地配置好的nacos持久化环境,所以直接启动了

shell 复制代码
/Users/apple/Documents/Work/InstallationSoftware/nacos/bin/startup.sh

3、启动seata

参考资料:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/user-guide/seata/quick-start

1.1. 生产环境启动seata

如果是第一次配置seata的压缩包,参考附录3.1

如果不是第一次配置,请直接启动

下面是作者本地配置好的seata持久化和把seata注册到nacos的环境,所以直接启动了

shell 复制代码
/Users/apple/Documents/Work/seata-1.7.1/bin/seata-server.sh -h 127.0.0.1 -p 8091 -m db

1.2. 采用代码启动seata

1、首先在nacos中创建nacos配置。

  1. 创建示例中 Nacos data-id: seata.properties , Group: SEATA_GROUP(seata 1.5.1 默认分组) ,导入 Nacos 配置

注意注意:一定要创建group为SEATA_GROUP,详细配置内容是连接中的内容

  1. 在 seata.properties 中增加示例中需要的如下事务群组配置
properties 复制代码
service.vgroupMapping.order-service-tx-group=default
service.vgroupMapping.account-service-tx-group=default
service.vgroupMapping.business-service-tx-group=default
service.vgroupMapping.storage-service-tx-group=default

把以上配置加载seata.properties的末尾

2、代码启动

回到代码spring-cloud-alibaba-example/spring-cloud-alibaba-examples/seata-example/seata-server,直接启动SeataServerApplication类,不出意外应该是没有报错的,作者亲试。

闲话:该模块其实啥都没有,只有一个SeataServerApplication类和一个application.yml配置文件,其实是使用了引入的seata-server.jar来启动的,且基于spring boot的配置文件覆盖规则,项目的application.yml覆盖了jar包中的application.yml。

2. 开始测试

在本示例中,我们模拟了一个用户购买货物的场景,StorageService 负责扣减库存数量,OrderService 负责保存订单,AccountService 负责扣减用户账户余额。

为了演示样例,我们在 OrderService 和 AccountService 中 使用 Random.nextBoolean() 的方式来随机抛出异常,模拟了在服务调用时随机发生异常的场景。

多次点击,小的概率(1/4)会出现正常的调用,大概率(3/4)为异常调用,请多点击几次。

如果分布式事务生效的话, 那么以下等式应该成立:

  • 用户原始金额(1000) = 用户现存的金额 + 货物单价 (2) 订单数量 每单的货物数量(2)
  • 货物的初始数量(100) = 货物的现存数量 + 订单数量 * 每单的货物数量(2)

3. 附录

3.1. 如果第一次配置seata压缩包

连接nacos把seata服务注册到nacos中,这里是用来注册seata的

连接db,把seata的数据存储在mysql中。

  1. 步骤一:启动包
  2. 步骤二:建表(仅db)
    global_table、branch_table、lock_table

脚本在:script/server/db/mysql.sql位置

  1. 不用file存储数据方式改用db存储数据方式

1、修改store.mode

启动包: seata-->conf-->application.yml,修改store.mode="db或者redis"

2、修改数据库连接|redis属性配置

启动包: seata-->conf-->application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。

yml 复制代码
seata:
  store:
    # support: file 、 db 、 redis
    mode: db
    db:
      datasource: druid
      db-type: mysql
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true
      user: root
      password: root
      min-conn: 10
      max-conn: 100
      global-table: global_table
      branch-table: branch_table
      lock-table: lock_table
      distributed-lock-table: distributed_lock
      query-limit: 1000
      max-wait: 5000
  1. seata服务注册到nacos

从nacos中获取配置,以及把自己注册到nacos中

注意:seata服务注册时的分组是DEFAULT_GROUP,而获取配置的分组是SEATA_GROUP。这样设置的目的是跟官方的几个下订单的微服务保持一致。坑坑坑,还搞注册跟配置的分组不一样,无语死了。

yml 复制代码
seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      # 从分组 SEATA_GROUP 获取配置内容(也是跟其他微服务保持一致)。这个例子中获取配置的分组与注册的分组不一样。
      group: SEATA_GROUP
      namespace:
      username: nacos
      password: nacos
      context-path:
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key:
      #secret-key:
      data-id: seata.properties
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      # 把seata服务注册到DEFAULT_GROUP分组(跟其他微服务保持一致)
      group: DEFAULT_GROUP
      namespace:
      cluster: default
      username: nacos
      password: nacos
      context-path:
      ##if use MSE Nacos with auth, mutex with username/password attribute
      #access-key:
      #secret-key:
  1. 步骤五:启动
shell 复制代码
cd /Users/apple/Documents/Work/seata-1.7.1/bin
# 存储用file(仅仅用于本地测试)
seata-server.sh -h 127.0.0.1 -p 8091 -m db

3.2. 常见问题参考

主要问题就是注册和配置的分组问题!!!

问题1:作者碰到在nacos添加配置文件seata.properties的group选择默认组default_group而出现测试的几个微服务报错

更正:请不要用default_group而是用seata_group。

问题2:作者把seata压缩包的application.example.yml的部分内容复制修改到application.yml时也出现了分组配置错误

更正:seata服务以及其他服务在注册时全部采用DEFAULT_GROUP分组,而仅仅是nacos的seata.properties配置文件采用SEATA_GROUP分组。

相关推荐
麦兜*5 小时前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
echoyu.1 天前
消息队列-初识kafka
java·分布式·后端·spring cloud·中间件·架构·kafka
AAA修煤气灶刘哥1 天前
缓存这「加速神器」从入门到填坑,看完再也不被产品怼慢
java·redis·spring cloud
AAA修煤气灶刘哥1 天前
接口又被冲崩了?Sentinel 这 4 种限流算法,帮你守住后端『流量安全阀』
后端·算法·spring cloud
T_Ghost1 天前
SpringCloud微服务服务容错机制Sentinel熔断器
spring cloud·微服务·sentinel
喂完待续1 天前
【序列晋升】28 云原生时代的消息驱动架构 Spring Cloud Stream的未来可能性
spring cloud·微服务·云原生·重构·架构·big data·序列晋升
惜.己2 天前
Docker启动失败 Failed to start Docker Application Container Engine.
spring cloud·docker·eureka
chenrui3102 天前
Spring Boot 和 Spring Cloud: 区别与联系
spring boot·后端·spring cloud
喂完待续3 天前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升