公司突然有分布式事务的需求,抽空研究一下相关的框架,发现txlcn相对比较成熟。
官方入门文档:https://www.txlcn.org/zh-cn/docs/start.html
这里记录一下接入遇到的坑。
TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager™. TC作为微服务下的依赖,TM是独立的服务,主要作为事务管理的控制中心。
发起方发起会缓存事务的gtoupid到tx-manager中,根据最后的处理结果进行commit或者cancel操作。根据官网,tx-manager是支持集群服务的。
1、创建MySQL数据库, 名称为: tx-manager的数据库
创建数据表
CREATE TABLE `t_tx_exception` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`transaction_state` tinyint(4) NULL DEFAULT NULL,
`registrar` tinyint(4) NULL DEFAULT NULL,
`remark` varchar(4096) NULL DEFAULT NULL,
`ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解决 1已解决',
`create_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
2、从git上拉取TM的源代码,这里用的版本是5.0.2.RELEASE
地址:https://github.com/codingapi/tx-lcn.git
3、拉取的代码结构大概是这样的,其中txlcn-tm就是一开始说到的tx-manager服务,启动前还需要配置下参数。
ps:需要配置redis连接,我是默认连接本地的redis服务,所以不需要配置。
官方TM配置文档:https://www.txlcn.org/zh-cn/docs/setting/manager.html
这里的数据库信息配置成自己的。
启动。
访问 http://127.0.0.1:7970/admin/index.html进入管理后台,默认密码是:codingapi
集成了TC的服务端启动成功后可以点这里查看服务的状态。
具体的Tx-Manager操作,看官网文档吧。
https://www.txlcn.org/zh-cn/docs/manageradmin.html
本次集成是基于springboot+springcloud+nacos的环境。
1、集成txlcn-tc
添加5.0.2.RELEASE版本的必要依赖
<!--txlcn5.0.2-->
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
在启动的主类添加@EnableDistributedTransaction注解开启分布式事务。
根据官方文档配置需要的参数,比如tx-manager的服务ip,事务时间,心跳时间等。
官方TC配置文档:https://www.txlcn.org/zh-cn/docs/setting/client.html
默认连接127.0.0.1:8070的tx-manager。
PS:需要注意的是,配置分布式事务的服务也是一定要集成redis,并且和tx-manager要连接同一个redis服务。
2、LCN模式事务
因为LCN的事务管理是基于本地事务的,所以在需要开启事务的service增加注解。
@Override
@LcnTransaction
@Transactional
public String execute(String value, String exFlag) {
// step1. call remote ServiceD
String dResp = restTemplate.getForObject("http://txlcn-demo-spring-service-b/hello/rpc?value=" + value, String.class);
// step2. call remote ServiceE
String eResp = serviceCClient.rpc(value);
// step3. execute local transaction
Demo demo = new Demo();
demo.setGroupId(TracingContext.tracing().groupId());
demo.setDemoField(value);
demo.setCreateTime(new Date());
demo.setAppName(Transactions.getApplicationId());
demoMapper.save(demo);
// 置异常标志,DTX 回滚
if (Objects.nonNull(exFlag)) {
throw new IllegalStateException("by exFlag");
}
return dResp + " > " + eResp + " > " + "ok-service-a";
}
本demo代码地址:https://github.com/jackliunan/txlcn-demo
pps: txlcn官方重新开始维护,维护者群421324785