集成主要分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服务端

spring boot nacose 集成命名空间 springboot集成nacos原理_java

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

  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更加能体现微服务的特点

spring boot nacose 集成命名空间 springboot集成nacos原理_全局事务_02


很简单,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服务也是一致

spring boot nacose 集成命名空间 springboot集成nacos原理_回滚_03


结构简单,使用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注解他就是事务生效的关键

spring boot nacose 集成命名空间 springboot集成nacos原理_回滚_04


服务全部启动后nacos中,可以看到两个服务的接口都已经发布成功了,然后进行测试调用

spring boot nacose 集成命名空间 springboot集成nacos原理_回滚_05


触发回滚异常

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

再看数据库第一眼看过去没有任何变化

spring boot nacose 集成命名空间 springboot集成nacos原理_微服务_06


我手动输入数据后可以发现id是从3开始的,因为前两条数据已经被自动回滚了由其可见已经成功了

spring boot nacose 集成命名空间 springboot集成nacos原理_回滚_07

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

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