java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot Hmily TCC分布式事务

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

作者:我是小趴菜

这篇文章主要为大家详细介绍了SpringBoot如何整合Hmily实现TCC分布式事务,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

今天是分布式事务系列的第二篇,springBoot整合Hmily实现TCC分布式事务

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

首先我们创建三个springboot项目

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

然后在 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服务还是要有一些问题需要考虑的,主要有以下几个

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

以上就是SpringBoot整合Hmily实现TCC分布式事务的详细内容,更多关于SpringBoot Hmily TCC分布式事务的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文