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

 更新时间:2024年11月04日 10:02:00   作者:我是小趴菜  
这篇文章主要为大家详细介绍了SpringBoot如何整合Hmily实现TCC分布式事务,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

今天是分布式事务系列的第二篇,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分布式事务的资料请关注脚本之家其它相关文章!

相关文章

  • SpringMVC @RequestMapping注解属性详细介绍

    SpringMVC @RequestMapping注解属性详细介绍

    通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 详解SpringBoot中文件上传大小限制问题的解决方案

    详解SpringBoot中文件上传大小限制问题的解决方案

    在开发Web应用程序时,文件上传是一个常见的需求,本文将详细介绍如何分析和解决Spring Boot文件上传大小限制问题,并提供多种配置方式,希望对大家有所帮助
    2025-07-07
  • 深入学习spring cloud gateway 限流熔断

    深入学习spring cloud gateway 限流熔断

    这篇文章主要介绍了深入学习spring cloud gateway 限流熔断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • MyBatis主键回填的两种实现方式

    MyBatis主键回填的两种实现方式

    这篇文章主要介绍了MyBatis中的主键回填机制,详细说明了其应用场景、两种实现方式的原理、配置方法、适用场景及性能对比,并通过流程图展示了执行过程,针对常见问题与注意事项进行了说明,最后提供了完整示例代码,需要的朋友可以参考下
    2026-04-04
  • 基于list stream: reduce的使用实例

    基于list stream: reduce的使用实例

    这篇文章主要介绍了list stream: reduce的使用实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java切分字符串的2种方法实例

    java切分字符串的2种方法实例

    在我们日常工作中经常遇到截取字符串的需求,下面这篇文章主要给大家介绍了关于java切分字符串的2种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Java中命令行参数--与-D的区别

    Java中命令行参数--与-D的区别

    本文主要介绍了Java中命令行参数--与-D的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • @RequestMapping对不同参数的接收方式示例详解

    @RequestMapping对不同参数的接收方式示例详解

    Spring MVC框架中,@RequestMapping注解用于映射URL到控制器方法,不同的参数类型如简单参数、实体参数、数组参数、集合参数、日期参数和JSON参数,本文给大家介绍@RequestMapping对不同参数的接收方式,感兴趣的朋友一起看看吧
    2024-10-10
  • 如何用Springboot快速整合shiro安全框架

    如何用Springboot快速整合shiro安全框架

    这篇文章主要介绍了如何用SpringBoot快速整合shiro安全框架,shiro原名Apache Shiro 是一个Java 的安全(权限)框架。Shiro 可以非常容易的开发出足够好的应用,感兴趣的同学可以参考阅读
    2023-04-04
  • 浅析Java8 中 Map 接口的新方法

    浅析Java8 中 Map 接口的新方法

    这篇文章主要介绍了Java8 中 Map 接口的新方法,本文通过代码实例给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10

最新评论