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分布式事务的资料请关注脚本之家其它相关文章!

相关文章

  • SWT(JFace)体验之ViewForm的使用

    SWT(JFace)体验之ViewForm的使用

    SWT(JFace)体验之ViewForm的使用
    2009-06-06
  • ThreadLocal内存泄露的产生原因和处理方法

    ThreadLocal内存泄露的产生原因和处理方法

    ThreadLocal 的内存泄漏问题通常发生在使用 ThreadLocal 存储对象时,尤其是在多线程环境中,线程池中的线程复用可能导致一些资源没有及时清理,从而引发内存泄漏,所以本文给大家介绍了ThreadLocal内存泄露的产生原因和处理方法,需要的朋友可以参考下
    2024-12-12
  • Java基础教程之获取操作系统及浏览器信息

    Java基础教程之获取操作系统及浏览器信息

    最近在开发中需要从request中获取操作系统,浏览器及浏览器版本信息,所以下面这篇文章主要给的大家介绍了关于Java基础教程之获取操作系统及浏览器信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Spring纯注解开发模式让开发简化更简化

    Spring纯注解开发模式让开发简化更简化

    Spring3.0引入了纯注解开发的模式,框架的诞生是为了简化开发,那注解开发就是简化再简化。Spring的特性在整合MyBatis方面体现的淋漓尽致哦
    2022-08-08
  • Java虚拟机运行时数据区域汇总

    Java虚拟机运行时数据区域汇总

    这篇文章主要给大家介绍了关于Java虚拟机运行时数据区域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案

    Idea启动SpringBoot程序报错:Veb server failed to&nbs

    这篇文章主要介绍了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Java多线程程序中synchronized修饰方法的使用实例

    Java多线程程序中synchronized修饰方法的使用实例

    synchronized关键字主要北用来进行线程同步,这里我们主要来演示Java多线程程序中synchronized修饰方法的使用实例,需要的朋友可以参考下:
    2016-06-06
  • SpringBoot实现文件上传与下载功能的示例代码

    SpringBoot实现文件上传与下载功能的示例代码

    文件上传与下载是Web应用开发中常用的功能之一。接下来我们将讨论如何在Spring Boot的Web应用开发中,如何实现文件的上传与下载,感兴趣的可以了解一下
    2022-06-06
  • Java使用云片API发送短信验证码

    Java使用云片API发送短信验证码

    这篇文章主要介绍了Java使用云片API发送短信验证码,主要用的是Java实现短信验证码。需要的朋友可以参考下
    2017-02-02
  • java以json格式向后台服务器接口发送请求的实例

    java以json格式向后台服务器接口发送请求的实例

    下面小编就为大家分享一篇java以json格式向后台服务器接口发送请求的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论