今天是分布式事务系列的第二篇,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.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分布式事务的资料请关注代码网其它相关文章!
发表评论