seata搭建遇到的坑

#A服务调用B服务,seata事务失效
#背景: springboot两个微服务,seata,nacos
#问题:
1.是否必须使用rpc框架?(目前是手写http)
2.是否必须使用注册中心?
3.A服务绑定了xid,B服务也能拿到,为啥模拟异常后事务不生效

A服务: 
@GlobalTransactional
@RequestMapping("test")
public R test() {
    jdbcTemplate.update("INSERT INTO sys_user ( username) VALUES ( 'admin服务');");
    HttpRequest.post("http://127.0.0.1:8081/sy-api/api/test").header(RootContext.KEY_XID, RootContext.getXID()).execute();
    int i = 1 / 0;//模拟异常
    return R.ok();
}

B服务:
@RequestMapping("test")
public R test() {
    jdbcTemplate.update("INSERT INTO sys_user ( username) VALUES ( 'api服务');");
    //int i = 1 / 0;
    return R.ok();
}
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题1:是否必须使用rpc框架?目前我是手写http通信的方式,是否有更好的替代方案?

    在seata中,使用rpc框架进行通信是必须的,因为seata依赖于分布式事务,而分布式事务需要统一的协调和管理。常用的rpc框架包括Dubbo、gRPC、Spring Cloud等,你可以选择一个适合你项目的框架来集成seata。

    如果你目前使用的是手写的http通信方式,可以考虑将其改造成支持rpc通信的方式,具体步骤如下:

    1. 选择一个合适的rpc框架,比如Dubbo或Spring Cloud。
    2. 集成rpc框架到你的项目中,具体步骤可以参考对应框架的官方文档。
    3. 根据seata提供的rpc通信协议,修改你的代码,使用rpc框架来进行通信。
    4. 测试和验证修改后的代码是否能正常与seata进行通信。

    问题2:是否必须使用注册中心来管理服务?我对注册中心的作用还不是很清楚,是否可以绕过它直接使用seata?

    在seata中,注册中心的作用是用来管理和注册被seata管控的服务实例。通过注册中心,seata可以动态地获取、管理和调用各个服务的实例。因此,使用注册中心是必须的,不能绕过。

    常用的注册中心包括ZooKeeper和Nacos,你可以根据你的项目需求选择一个适合的注册中心,并集成到你的项目中。具体步骤如下:

    1. 选择一个合适的注册中心,比如ZooKeeper或Nacos。
    2. 集成注册中心到你的项目中,具体步骤可以参考对应注册中心的官方文档。
    3. 对你的服务进行注册,使seata能够感知到你的服务实例。
    4. 配置seata的注册中心信息,使seata能够连接到注册中心,并获取服务实例的信息。

    问题3:我的服务A绑定了xid,但是当我模拟异常后,事务似乎没有生效。我想知道为什么会这样,可能是出了什么问题?

    事务不生效的问题可能存在多种原因,下面是一些常见的可能原因和对应的解决方案:

    1. 检查seata server的配置文件,确认配置文件中的事务日志存储模式是否正确。seata支持多种存储模式,包括file、db和redis等,默认是file模式。如果你使用的是db模式,确认数据库配置是否正确。
    2. 检查你的服务A是否正确地绑定了xid。确保在服务A中正确地绑定xid,在整个事务中使用相同的xid。
    3. 检查你的服务A是否正确地使用了seata提供的事务注解。在需要参与分布式事务的方法上添加相应的注解,如@GlobalTransactional。
    4. 检查你的服务A是否正确地与seata进行通信。确认你的服务A的rpc配置是否正确,并能够正常与seata server建立连接。
    5. 检查你的服务A是否正确地提交或回滚事务。在事务操作完成后,使用seata提供的API来提交或回滚事务,确保事务的状态被正确地结束。

    如果经过以上步骤的检查和排查,问题仍然存在,请提供更多的详细信息和日志,以便进一步分析和解决。

    以上是对问题的解答,如果有任何其他疑问,请随时提出。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^