springboot2.7.6+nacos2.0.3+seata1.8.0集成初步使用以及问题记录

本文介绍了如何在SpringBoot项目中集成Seata服务并通过Nacos注册,以及在Dubbo环境中实现服务间调用的全局事务管理。作者分享了安装、配置和测试过程,包括解决启动问题和观察事务回滚效果。
摘要由CSDN通过智能技术生成

集成主要分3步
1.将seata服务启动并且 注册到nacos上
2.创建springboot项目集成nacos+seata 基于dubbo3.0分两个provider和一个consumer
3.测试 consumer的controller方法同时调用两个provider的service,如果报错则进行回滚

seata服务启动(通过nacos注册)

这里直接看的别的大佬的安装教程篇幅太多了我也懒得写,如果有问题可以问我或者多看几个教程非常简单前提是会nacos.
教程
只要nacos上能出现你注册的seata服务就算成功!下面这个seata-server是我自己命名的,启动成功后就会出现在nacos服务端
在这里插入图片描述

安装过程中我遇到的问题:

  1. 在centos虚拟机上一直启动不了seata-server.sh ,原因是虚拟机的内存不够无法启动,要调高虚拟机的内存
  2. 1.5以上的seata版本不使用registry.conf 而是直接使用application.yml
  3. 可以使用docker启动,但是感觉不如直接下载包来得快
  4. 7091seata后台管理系统的端口,8091则是交互端口

springboot集成seata

根据https://seata.io/zh-cn/docs/user/quickstart/教程中的方式运行后端,因为他们是在一个包中而且dubbo版本较老所以我这边用新的版本以及分包的形式来实现demo更加能体现微服务的特点
在这里插入图片描述
很简单,mall-account 以及 mall-storage 分别是服务提供者(账户服务,存储服务),mall-api是公共api接口,dubbo-customer则是消费者,流程就是消费者(customer)同时调用账户服务(account)以及存储服务(storage),三个服务端只要有一个抛出了异常那么就会全局事务回滚。
代码逻辑上也很简单,就是customer的controller中调用account和storage的service,只不过是通过dubbo的方式

要会使用dubbo,具体代码很烦全贴也没意思这里直接放项目地址 https://gitee.com/xuweiliang123/x-seata-example.git,下面一边测试一边讲解代码

启动以及测试

account服务 具体看git代码 同理storage服务也是一致
在这里插入图片描述
结构简单,使用mybaits-plus这里为了方便service也不写了,直接用mapper调用(实际开发规则不可以)
下面的service实现的是api接口中的AccountService,这是dubbo的规范
System.out.println(RootContext.getXID());//打印全局事务Id,只要在一个事务组不管哪个服务获取到的值应该都是一致的

@DubboService
public class AccountServiceImpl implements AccountService {

    @Resource
    public AccountMapper userMapper;

    public void debit(String userId, int money) {
        Account account = new Account();
        account.setUserId(userId);
        account.setMoney(money);
        userMapper.insert(account);
        System.out.println(RootContext.getXID());//打印全局事务Id
    }
}

消费者 这个应该一看就懂了,重点是@GlobalTransactional注解他就是事务生效的关键
在这里插入图片描述
服务全部启动后nacos中,可以看到两个服务的接口都已经发布成功了,然后进行测试调用
在这里插入图片描述
触发回滚异常

java.lang.RuntimeException: 回滚++++

再看数据库第一眼看过去没有任何变化
在这里插入图片描述
我手动输入数据后可以发现id是从3开始的,因为前两条数据已经被自动回滚了由其可见已经成功了
在这里插入图片描述

注意:数据库中还有一个undo_log表
这是使用seata必须的,如果没有则会报错,这个表的数据也是看不到的,但是如果断点就能看到这个表的数据,断点结束后这个表的数据就会消失,这就是为什么这个表一直没数据的原因

这只是我个人刚开始研究seata单机的一个测试功能的小demo,后续集群的以及事务分组的还需要继续研究

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值