zoukankan      html  css  js  c++  java
  • 分布式事务之TX-LCN

    什么是TX-LCN

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

    TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务。

    TX-LCN原理

    • 核心步骤:
    • 创建事务组: 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。
    • 加入事务组: 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给TxManager的操作。
    • 通知事务组: 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager,TxManager将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务, 并返回结果给事务发起方。

    TX-LCN项目调用架构

    由项目调用架构图可以看出来,TM需要使用的Redis,所以我们需要准备一台Redis

    TM环境搭建

    1、创建一个SpringBoot项目,lcn-tm添加如下依赖,并且在启动类上添加注解@EnableTransactionManagerServer

    <dependency>
        <groupId>com.codingapi.txlcngroupId>
        <artifactId>txlcn-tmartifactId>
        <version>5.0.2.RELEASEversion>
    dependency>

    <dependency>
        <groupId>com.codingapi.txlcngroupId>
        <artifactId>txlcn-tcartifactId>
        <version>5.0.2.RELEASEversion>
    dependency>
    <dependency>
        <groupId>com.codingapi.txlcngroupId>
        <artifactId>txlcn-txmsg-nettyartifactId>
        <version>5.0.2.RELEASEversion>
    dependency>

    2、创建数据库tx-manager并且执行如下脚本,TM需要 t_tx_exceptiont_logger俩张表

    CREATE TABLE `t_tx_exception` (
          `id` bigint(20NOT NULL AUTO_INCREMENT,
          `group_id` varchar(32DEFAULT NULL,
          `unit_id` varchar(32DEFAULT NULL,
          `mod_id` varchar(32DEFAULT NULL,
          `transaction_state` tinyint(4DEFAULT NULL,
          `registrar` tinyint(4DEFAULT NULL COMMENT '-1 未知 0 Manager 通知事务失败, 1 client询问事务状态失败2 事务发起方关闭事务组失败',
          `ex_state` tinyint(4DEFAULT NULL COMMENT '0 待处理 1已处理',
          `create_time` datetime DEFAULT NULL,
          PRIMARY KEY (`id`USING BTREE
    ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC

    CREATE TABLE `t_logger` (
        `id` bigint(20NOT NULL AUTO_INCREMENT,
        `group_id` varchar(64NOT NULL,
        `unit_id` varchar(32NOT NULL,
        `tag` varchar(50NOT NULL,
        `content` varchar(1024NOT NULL,
        `create_time` varchar(30NOT NULL,
        `app_name` varchar(128NOT NULL,
        PRIMARY KEY (`id`USING BTREE
    ENGINE=InnoDB DEFAULT CHARSET=latin1

    3、配置TM服务,在项目lcn-tm的配置文件application.properties(注意目前只支持properties文件格式)添加如下配置

    server.port=7970
    

    TM事务管理器,需要访问数据库,实现分布式事务状态记录。

    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    spring.datasource.username=root
    spring.datasource.password=root

    TM事务管理器,是依赖Redis使用分布式事务协调的。尤其是TCC和TXC两种事务模型。

    spring.redis.host=127.0.0.1
    spring.redis.port=6379
    spring.redis.database=0

    为spring应用起名。

    spring.application.name=tx-lcn-transaction-manager

    TM事务管理器,提供的WEB管理平台的登录密码。无用户名。 默认是codingapi

    tx-lcn.manager.admin-key=triumphxx

    日志。如果需要TM记录日志。则开启,赋值为true,并提供后续的配置。

    mybatis.configuration.map-underscore-to-camel-case=true
    mybatis.configuration.use-generated-keys=true

    日志。如果需要TM记录日志。则开启,赋值为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=300000

    参数延迟删除时间单位ms

    tx-lcn.message.netty.attr-delay-time=10000
    tx-lcn.manager.concurrent-level=128

    开启日志

    logging.level.com.codingapi=debug

    为日志功能,提供数据库连接,和前面的使用的不是一个数据源

    tx-lcn.logger.driver-class-name=com.mysql.cj.jdbc.Driver
    tx-lcn.logger.jdbc-url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    tx-lcn.logger.username=root
    tx-lcn.logger.password=root

    4、启动项目lcn-tm访问http://localhost:7970/出现如下画面,表示TM服务搞定

    5、输入配置文件中配置的密码tx-lcn.manager.admin-key=triumphxx就能够登录

    以上就是TX-LCN的基本介绍和TM的搭建

    TC环境搭建

    由于我们是微服务,所以需要创建一个注册中心,我们就用Eureka来搭建,项目为eureka-server,这里就不赘述了,还需要创建俩个项目来模拟分布式事务的场景, 分别为lcn-order订单服务和lcn-pay支付服务。

    1、在订单服务支付服务中添加如下依赖,并且在启动类上添加注解@EnableDistributedTransaction表示开启分布式事务


    <dependency>
        <groupId>com.codingapi.txlcngroupId>
        <artifactId>txlcn-tcartifactId>
        <version>5.0.2.RELEASEversion>
    dependency>

    <dependency>
        <groupId>com.codingapi.txlcngroupId>
        <artifactId>txlcn-txmsg-nettyartifactId>
        <version>5.0.2.RELEASEversion>
    dependency>

    2.配置TC,在yaml文件中接入如下配置,表示连接的TM信息

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

    3、启动TC,登录到TM管理后台可以看到注册的TC,以及点击详细信息可以看到TC的详细信息

    • 注册信息

    • 详细信息

    以上就是TX-LCN TC的搭建

    总结

    以上就是TX-LCN的介绍以及环境的搭建,后面我们讨论TX-LCN的几种模式。

  • 相关阅读:
    还在使用golang 的map 做Json编码么?
    Golang 性能测试(2) 性能分析
    golang 性能测试 (1) 基准性能测试
    消息队列 NSQ 源码学习笔记 (五)
    消息队列 NSQ 源码学习笔记 (四)
    消息队列 NSQ 源码学习笔记 (三)
    消息队列 NSQ 源码学习笔记 (二)
    消息队列 NSQ 源码学习笔记 (一)
    你不知道的空格
    Supervisor 使用和进阶4 (Event 的使用)
  • 原文地址:https://www.cnblogs.com/triumph-wyp-com/p/15455994.html
Copyright © 2011-2022 走看看