• 【Spring Cloud Alibaba】seata分布式事务官方入门案例导读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
    
    • 1

    2、启动nacos

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

    /Users/apple/Documents/Work/InstallationSoftware/nacos/bin/startup.sh
    
    • 1

    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

    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
    
    • 1
    • 2
    • 3
    • 4

    把以上配置加载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相关属性。

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. seata服务注册到nacos

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

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    1. 步骤五:启动
    cd /Users/apple/Documents/Work/seata-1.7.1/bin
    # 存储用file(仅仅用于本地测试)
    seata-server.sh -h 127.0.0.1 -p 8091 -m db
    
    • 1
    • 2
    • 3

    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分组。

  • 相关阅读:
    Vue3.3指北(二)
    AcrelEMs-EDU智慧校园能源管理系统解决方案
    烽火传递——单调队列优化dp问题
    【配电网重构】基于粒子群算法求解配电网重构问题附matlab代码
    (数据科学学习手札134)pyjanitor:为pandas补充更多功能
    视频转格式用什么工具?mp4格式转换器,好用的视频格式转换器
    Python科学数据分析:随机生成 50 名学生,5 门课程的成绩保存后进行数据分析(平均分、最高分)、数据展示(饼图、直方图)
    C++和Python使用ROS自定义的消息类型
    Java - Object#finalize在JDK9中被标记废弃了!
    bodipy荧光染料BDP 581/591 NHS ester/琥珀酰亚胺活化酯
  • 原文地址:https://blog.csdn.net/yuchangyuan5237/article/details/134002867