开发者

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

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

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

首先我们创建三个springboot项目

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

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

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

然后在 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.0php.0.1:3306/hmily?useUnicode=true&js;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服务的接口

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

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

@Service
public class TestServiceImpl implements TestService{

    @Resource
    private TestDao testDao;

    @Resource
    private CypFeign cypFehttp://www.devze.comign;

    //在需要事务的方法上加上 @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());
    OFchESTnk    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 cy编程客栈p) {
        System.out.println("cancel执行了");
        cypDao.del(cyp.getId());
        return "cancel";
    }
}

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

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

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

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

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

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

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

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

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

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

以上就是SpringBoot整合Hmily实现TCC分布式事务的详细内容,更多关于SpringBoot Hmily TCC分布式事务的资料请关注编程客栈(www.devze.com)其它相关文章!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜