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

相关推荐
荆州克莱2 小时前
[FE] React 初窥门径(四):React 组件的加载过程(render 阶段)
spring boot·spring·spring cloud·css3·技术
Genius Kim4 小时前
SpringCloud Sentinel 服务治理详解
spring cloud·sentinel·php
为美好的生活献上中指5 小时前
Java学习Day60:微服务总结!(有经处无火,无火处无经)
java·spring boot·spring cloud·微服务·sentinel·jetty
BUG指挥官11 小时前
深度解析阿里的Sentinel
spring boot·spring·spring cloud·sentinel
WANT_如初11 小时前
SpringCloud-Eureka注册中心
java·spring cloud
白总Server1 天前
OpenHarmony
后端·spring cloud·华为·微服务·ribbon·架构·系统架构
荆州克莱1 天前
VUE2升级成VUE3的优化与区别
spring boot·spring·spring cloud·css3·技术
wei_shuo1 天前
Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用
spring cloud·hystrix·ribbon
听潮阁2 天前
【SpringCloud详细教程】-01-一文了解微服务
开发语言·spring boot·spring cloud·servlet·java-ee·mybatis