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

相关推荐
天使day5 小时前
SpringCloud两种注册中心
java·spring·spring cloud
Mr.Demo.15 小时前
[Spring] Gateway详解
java·spring·spring cloud·gateway
Cent'Anni19 小时前
【Nacos】负载均衡
java·分布式·spring cloud·负载均衡
跟我很快乐20 小时前
Docker搭建minio对象存储
spring cloud·docker·容器
ChinaRainbowSea1 天前
10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析
java·spring·spring cloud·sentinel·负载均衡
等一场春雨1 天前
Alibaba Spring Cloud 十七 Sentinel熔断降级
spring·spring cloud·sentinel
红衣女妖仙1 天前
分布式微服务系统简述
分布式·spring cloud·微服务·架构
等一场春雨1 天前
Alibaba Spring Cloud 六 Seata 的核心组件:RM
数据库·spring·spring cloud
编程、小哥哥1 天前
FastExcel的使用
spring cloud
洛阳纸贵1 天前
基于SpringCloud的广告系统设计与实现(四)
java·spring·spring cloud·feign·服务调用·索引、