分布式事务框架TX-LCN架构分析(六)

一、LCN分布式事务控制原理

TX-LCN官网:http://www.txlcn.org/zh-cn/

TX-LCN由两大模块组成:TM(TxManager)、TC(TxClient)。TM是全局事务协调者,TC为事务参与者(也包含事务发起者)。其事务的控制原理如下:

核心步骤:

1.事务发起者创建一个全局事物组group。

2.全局事务组通过Tracing(调用链子模块)进行服务间的全局数据传参。

3.其它参与者在调用链过程中加入到事务组

4.事务通知(各TC将事务状态上报统一交由TM进行管理)

5.TC响应TM的事务通知(底层采用netty进行通讯)

二、TM部署启动

1.maven引入tm,pom.xml配置

   

        com.codingapi.txlcn

        txlcn-tm

        5.0.2.RELEASE

   

   

        org.springframework.boot

        spring-boot-starter-data-redis

   

2.开启事务管理

在springboot启动类上加入注解@EnableTransactionManagerServer:

3.TM环境

创建数据表(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;

application.properties配置信息:

以下是推荐配置:

spring.application.name=tx-manager

server.port=7970

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8

spring.datasource.username=root

spring.datasource.password=root

mybatis.configuration.map-underscore-to-camel-case=true

mybatis.configuration.use-generated-keys=true

#tx-lcn.logger.enabled=true

# TxManager Host Ip

#tx-lcn.manager.host=127.0.0.1

# TxClient连接请求端口

#tx-lcn.manager.port=8070

# 心跳检测时间(ms)

#tx-lcn.manager.heart-time=15000

# 分布式事务执行总时间

#tx-lcn.manager.dtx-time=30000

#参数延迟删除时间单位ms

#tx-lcn.message.netty.attr-delay-time=10000

#tx-lcn.manager.concurrent-level=128

# 开启日志

#tx-lcn.logger.enabled=true

#logging.level.com.codingapi=debug

#redis 主机

#spring.redis.host=127.0.0.1

#redis 端口

#spring.redis.port=6379

#redis 密码

#spring.redis.password=

配置样例:

TM启动:

三、TM启动过程跟进

tm可以独立部署应用为lcn服务端项目

1.@EnableTransactionManagerServer注解导入了TMAutoConfiguration自动配置:

2.TMAutoConfiguration核心配置类:

3.TxLcnApplicationRunner实现了ApplicationRunner接口,springboot在IOC容器初始化过程中会自动调用run方法:

4.initializers的初始化器的其中NettyRpcServerInitialize对TM启动开启了netty服务(客户端TC连接的服务器)

启动netty服务默认的ip/port是:127.0.0.1/8070

5.TMAutoCluster将TM实例信息存储到Redis

四、TC部署启动

tc可以在你的任何一个独立微服务项目中引入作为客户端应用。

1.pom.xml配置:

    com.codingapi.txlcn

    txlcn-tc

    5.0.2.RELEASE

    com.codingapi.txlcn

    txlcn-txmsg-netty

    5.0.2.RELEASE

2.application.properties配置信息:

# 默认之配置为TM的本机默认端口

tx-lcn.client.manager-address=127.0.0.1:8070

3.启动类开启注解@EnableDistributedTransaction

五、开始使用lcn分布式事务

使用事务的前提是接口本身开启了本地@Transactional事务(lcn不产生新事务)

1.项目环境介绍:

微服务demo-a--->TestAController开启lcn事务,往表my_test插入一条数据并调用demo-b微服务接口,调用demo-b以后打印1/0模拟错误:

微服务demo-b--->TestBController开启lcn事物,往my_test出入一条数据:

2.测试:

分别启动微服务demo-a、demo-b:

接口调用前数据库表数据:

接口调用:

微服务demo-b执行了insert语句:

再查看数据库:

结果说明了,lcn的事物产生了作用,对demo-b微服务进行了回滚。

六、lcn调用过程跟进

核心:事物拦截器、tracing调用链

lcn事物代理主要是通过TransactionAspect切面拦截实现的:

下面开始跟进:

demo-a:事物发起方

先进入SpringTracingApplier,获取groupId

首次调用groupId为空,接下来进入TransactionAspect拦截器开始方法拦截,开启事物,并创建全局事务组:

随机生成事物组ID(这块可以优化,建议采用雪花算法生成,确保全球唯一ID)

事物参数进行封装:

执行本地业务逻辑:

resttemplate监听,将全局事物组加入http header(X-Group-ID,X-App-Map)中进行下游微服务的传递

开始进入微服务demo-b(获取demo-a传递的header参数),加入事务组:

本地事物状态上传TM:

本文介绍到这里就把lcn分布式事物的核心原理,并对核心源码进行了跟踪,后续事物通知采用的是netty进行通讯。

你可能感兴趣的:(分布式事务框架TX-LCN架构分析(六))