文章目录
- [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配置。
- 创建示例中 Nacos data-id: seata.properties , Group: SEATA_GROUP(seata 1.5.1 默认分组) ,导入 Nacos 配置
注意注意:一定要创建group为SEATA_GROUP,详细配置内容是连接中的内容
- 在 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中。
- 步骤一:启动包
- 步骤二:建表(仅db)
global_table、branch_table、lock_table
脚本在:script/server/db/mysql.sql位置
- 不用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
- 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:
- 步骤五:启动
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分组。