今天是分布式事务系列的第二篇,springBoot整合Hmily实现TCC分布式事务
第一篇链接:springBoot整合atomikos实现分布式事务
首先我们创建三个springboot项目
- eureka-server:eureka注册中心
- test-server:服务一
- cpy-server:服务二
大家不要在意项目名称了,我就随意取的,大家好创建好三个服务
然后在 test-server 和 cpy-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服务的接口
在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分布式事务已经完成了
但是TCC服务还是要有一些问题需要考虑的,主要有以下几个
- 1:try阶段异常
- 2:cancel阶段异常
- 3:comfirm阶段异常
- 4:本地事务与TCC事务冲突
- 5:空回滚
- 6:事务悬挂
至于如何解决以上问题,可以参考:TCC分布式事务七种异常情况小结
以上就是SpringBoot整合Hmily实现TCC分布式事务的详细内容,更多关于SpringBoot Hmily TCC分布式事务的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论