LCN解决分布式事务

1. LCN背景

LCN框架在2017年6月份发布第一个版本,从开始的1.0,已经发展到了5.0版本。

LCN名称是由早期版本的LCN框架命名,在设计框架之初的1.0 ~ 2.0的版本时框架设计的步骤是如下,各取其首字母得来的LCN命名。

5.0以后由于框架兼容了LCN、TCC、TXC三种事务模式,为了避免区分LCN模式,特此将LCN分布式事务改名为TX-LCN分布式事务框架。

2. LCN定位

TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。

3. 原理

协调者(TM)和客户端(TC)通过netty保持长链接状态;

调用方进入接口业务之前,会通过AOP技术进到@LcnTransaction注解中去,此时LCN协调者那边生成注册一个全局的事务组Id(groupId);

当调用方通过rpc调用服务提供方的时候,lcn重写了Feign客户端,会从ThreadLocal中拿到该事务组Id(groupId),并将该事务组Id设置到请求头中;

服务提供方在请求头中获取到了这个groupId的时候,lcn会标识该服务为参与方并加入到该事务组,并会被lcn代理数据源,当该服务业务逻辑执行完成后,进行数据源的假关闭,并不会真正的提交或回滚当前服务的事务;

当调用者执行完全部业务逻辑的时候,如果无异常会告知lcn协调者,lcn协调者再分别告诉该请求链上的所有参与方可以提交了,再进行真正的提交。若发起方调用完参与方后报错了,也会告知lcn协调者,lcn协调者再告知所有的参与方进行真正的回滚操作,这样就解决了分布式事务的问题。

4. 代码实现

(1)注册中心:这里选nacos
(2)部署协调者

在部署TX-LCN中有遇到问题或想查看部署详细的操作可以访问如下地址:http://www.txlcn.org/zh-cn/docs/start.html ;
github下载源码地址:https://github.com/codingapi/tx-lcn/releases。

①创建数据库表
创建相应的数据库表,先创建MySQL数据库, 名称为: tx-manager,再创建数据库表t_tx_exception。

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; 

②修改配置文件
打开我们下好的源码,找到txlcn-tm模块,修改其配置文件application.properties,具体修改的内容根据自己业务而定,官方也有相应配置内容,但需要注意首次运行要将配置文件的这段设置为create:spring.jpa.hibernate.ddl-auto=create。
最后打包并运行,访问控制台的端口为7919,默认密码codingapi。

(3)配置客户端TC环境
TC就是客户端,也就是微服务,配置相对简单如下:

①引入相关依赖
其中一个是lcn核心包,一个是建立长连接的netty包;

<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>

②配置yml文件
设置服务连接到lcn服务。(注意下lcn控制台是7970,这个8070是lcn通讯端口号)

tx-lcn:
  client:
    manager-address: 127.0.0.1:8070
  logger:
    enabled: true

③添加注解
引入依赖并配置好yml文件后,在服务的启动类上添加@EnableDistributedTransaction注解,开启分布式事务。

(4)
做好这些配置后,开始启动项目,启动成功项目后可以在lcn控制台看到相应的服务列表,能够看到则说明服务已经实现了对lcn事务协调者管理器的注册。
在这里插入图片描述

看到服务都能够成功注册进TM后,便全部完成TX-LCN本地环境的搭建,后续可以开始测试自己的业务代码是否解决了分布式事务的问题。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐