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

文章目录

  • 1. 准备seata环境
    • 1.1. 生产环境启动seata
    • 1.2. 采用代码启动seata
  • 2. 开始测试
  • 3. 附录
    • 3.1. 如果第一次配置seata压缩包
    • 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

docker start mysql_mall_learning

2、启动nacos

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

/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的环境,所以直接启动了

/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 中增加示例中需要的如下事务群组配置。
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() 的方式来随机抛出异常,模拟了在服务调用时随机发生异常的场景。

多次点击,小的概率会出现正常的调用,大部分为异常调用,请多点击几次。

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

  • 用户原始金额(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相关属性。

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:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      namespace:
      group: SEATA_GROUP
      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
      group: SEATA_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. 步骤五:启动
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。

你可能感兴趣的:(spring,cloud,alibaba,spring,cloud)