当前位置: 代码网 > it编程>编程语言>Java > SpringBoot整合Hmily实现TCC分布式事务

SpringBoot整合Hmily实现TCC分布式事务

2024年11月04日 Java 我要评论
今天是分布式事务系列的第二篇,springboot整合hmily实现tcc分布式事务第一篇链接:springboot整合atomikos实现分布式事务首先我们创建三个springboot项目eurek

今天是分布式事务系列的第二篇,springboot整合hmily实现tcc分布式事务

第一篇链接:springboot整合atomikos实现分布式事务

首先我们创建三个springboot项目

  • eureka-server:eureka注册中心
  • test-server:服务一
  • cpy-server:服务二

大家不要在意项目名称了,我就随意取的,大家好创建好三个服务

然后在 test-servercpy-server服务的resources目录下创建 hmily.yml 文件,文件内容如下:

hmily:
  server:
    configmode: local
    appname: test-server

  #  如果server.configmode eq local 的时候才会读取到这里的配置信息.
  config:
    appname: test-server
    repository: mysql

  ribbon:
    rule:
      enabled: true

repository:
  database:
    driverclassname: com.mysql.cj.jdbc.driver
    url: jdbc:mysql://127.0.0.1:3306/hmily?useunicode=true&characterencoding=utf-8&usessl=false&servertimezone=asia/shanghai&allowpublickeyretrieval=true
    username: root
    password: 12345

metrics:
  metricsname: prometheus
  
  //注意:test-server和cpy-server的端口号要不一样
  port: 8801

然后我们需要创建一个hmily 的数据库

test-server服务改造

现在我们要实现微服务之间的服务调用,在这里我们使用openfeign来调用cpy-server服务的接口

在test-server服务的testserviceimpl类中实现具体的业务逻辑

@service
public class testserviceimpl implements testservice{

    @resource
    private testdao testdao;

    @resource
    private cypfeign cypfeign;

    //在需要事务的方法上加上 @hmilytcc注解
    @hmilytcc(confirmmethod = "confirm",cancelmethod = "cancel")
    @override
    public string insert(test test) {
        //本地服务调用
        testdao.insert(test);

        //调用cyp-server服务的接口
        cypfeign.insert();

        //模拟抛出异常
        int i = 1/ 0;
        return "success";
    }


    // confirm名字要与@hmilytcc中的confirmmethod中配置的值一样,而是参数要与方法一致
    public string confirm(test test) {
        //修改状态为1
        system.out.println("test - confirm执行了");
        testdao.update(test.getid());
        return "confirm";
    }

    // cancel名字要与@hmilytcc中的cancelmethod中配置的值一样,而是参数要与方法一致
    public string cancel(test test) {
        system.out.println("test - cancel执行了");
        testdao.del(test.getid());
        return "cancel";
    }

然后在openfeign的接口也要加上 @hmily 注解

@feignclient(value = "cpy-server")
public interface cypfeign {

    @postmapping("/cyp/insert")
    @hmily
    string insert();
}

cpy-server服务改造

@service
public class cypserviceimpl implements cypservice{
    @resource
    private cypdao cypdao;
    
    //在test-server调用的方法上加上 @hmilytcc
    @hmilytcc(confirmmethod = "confirm",cancelmethod = "cancel")
    public string insert(cyp cyp) {
        cypdao.insert(cyp);
        return "success";
    }

    // confirm名字要与@hmilytcc中的confirmmethod中配置的值一样,而是参数要与方法一致
    public string confirm(cyp cyp) {
        system.out.println("confirm执行了");
        cypdao.update(cyp.getid());
        return "confirm";
    }

    // cancel名字要与@hmilytcc中的cancelmethod中配置的值一样,而是参数要与方法一致
    public string cancel(cyp cyp) {
        system.out.println("cancel执行了");
        cypdao.del(cyp.getid());
        return "cancel";
    }
}

在有异常的时候,两个服务都执行了cancel阶段的方法

当把模拟异常的代码去掉,发现两个服务都正常的执行了提交方法

到此,springboot微服务整合hmily实现tcc分布式事务已经完成了

但是tcc服务还是要有一些问题需要考虑的,主要有以下几个

  • 1:try阶段异常
  • 2:cancel阶段异常
  • 3:comfirm阶段异常
  • 4:本地事务与tcc事务冲突
  • 5:空回滚
  • 6:事务悬挂

至于如何解决以上问题,可以参考:tcc分布式事务七种异常情况小结

以上就是springboot整合hmily实现tcc分布式事务的详细内容,更多关于springboot hmily tcc分布式事务的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com