SpringCloud 集成分布式事务LCN


A. LCN的版本4.1.0只支持到spring boot 1.0 版本 (所以使用4.1.0版本这里要注意了,这里不做讲解)
B.LCN版本5.2.0 已经支持spring boot2.0以上版本
今天说下支持springcloud 2.0使用、先去官网下载最新5.0.2.RELEASE 源码
下载地址:https://github.com/codingapi/tx-lcn/releases
把它的源码包下载下来,解压后,把里面的txlcn-tm(这个是lcn的核心,即事务协调器)这个项目单独拿出来导入idea,并修改yml文件

server:
    port: 7970
spring:
 application:
      name: tx-manager
  profiles: dev
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    password: 123456
    url: jdbc:mysql://192.168.13.64:3306/tx-manager?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull
    username: root
  jpa:
    hibernate:
      ddl-auto: update


# redis配置
  redis:
    host: 192.168.13.64
    port: 6379


#mybatis:
#  configuration:
#    map-underscore-to-camel-case: true
#    use-generated-keys: true



#eureka配置
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.13.64:5060/eureka/
  instance:
    instance-id: http://192.168.13.64:5060
    prefer-ip-address: true
logging:
  level:
    com:
      codingapi: debug


#tx-manager 配置
tx-lcn:
  #client:
   # manager-address: 127.0.0.1:8070
  logger:
    driver-class-name: ${spring.datasource.driver-class-name}
    enabled: true
    jdbc-url: ${spring.datasource.url}
    password: ${spring.datasource.password}
    username: ${spring.datasource.username}
  manager:
    admin-key: 123456 #后台登陆密码  登陆页:http://127.0.0.1:7970/admin/index.html
    concurrent-level: 128
    dtx-time: 10000
    ex-url-enabled: true
    heart-time: 12000
    #tx-manager ip(client请求ip) 即:应用层连接的ip地址、用与连接事务协调器
    host: "" #这里部署到docker容器中特别注意,只能""或者0.0.0.0,不然识别不出来具体地址,在本地测试中可以写上本机的ip地址
    port: 8070
  message:
    netty:
      attr-delay-time: 10000

#tm:
#  socket:
#    port: 8070

2.创建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;

3. 在各自的项目中pom文件中 引用LCN 5.2.0版本架包

<dependency>
 <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-tc</artifactId>
            <version>5.0.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
             ####这里可能需要排除日志文件,防止冲突###
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.codingapi.txlcn</groupId>
            <artifactId>txlcn-txmsg-netty</artifactId>
            <version>5.0.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

注意:有时候为了防止springboot的jar包冲突,需要将里面关于springboot的所有jar包排除掉。

4. 在各自的客户端A、B应用程序中的sprintg文件中添加调用上面tx-manager配置的客户端地址

#配置连接tx-manager服务,这里的服务就是tx-manager客户端tx-lcn.manager.host地址

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

上面的配置如果没有配置,系统默认是127.0.0.1:8080,就是默认大于配置,我后来项目全部注释了这个,所以取得源码里面默认地址, 也就是你的部署容器的地址、下面是客户端和服务端地址的默认值

springcloud事务一致性 springcloud 事务管理_.net

springcloud事务一致性 springcloud 事务管理_d3_02

 

5. 在服务A、B的启动类上添加注解@EnableDistributedTransaction启动分布式事务、在服务A中的需要分布式事务方法上面添加@LcnTransaction,服务B中添加@TxcTransaction或 @LcnTransaction注解。

6. 依次启动eureka注册中心,txlcn-tm,服务A、B

springcloud事务一致性 springcloud 事务管理_springcloud事务一致性_03

springcloud事务一致性 springcloud 事务管理_spring_04

springcloud事务一致性 springcloud 事务管理_d3_05

注意:这里遇到一个坑、在本地测试完了是OK的,看了它的源码里面默认ip地址127.0.0.1:8070 所以在部署到docker中应用链接不上tx-manager 中的8070端口地址,因为配置具体的地址 tx-lcn.manager.host=192.168.13.64,所以找不到这个,看了其他的网上参考,必须把这个设置为 “” 空双引号或者0.0.0.0下面是我的具体tx-manager项目中的配置文件信息(就是上面的配置)

springcloud事务一致性 springcloud 事务管理_spring_06

本地测试成功:

14:34:17.883 default [http-nio-9091-exec-3] DEBUG c.c.t.tc.aspect.weave.DTXLogicWeaver - <---- TxLcn start ---->
14:34:17.884 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.c.DefaultGlobalContext - Start TxContext[5931a5f842537]
14:34:17.884 default [http-nio-9091-exec-3] DEBUG c.c.txlcn.tc.core.DTXServiceExecutor - pre business code, unit type: lcn @group(5931a5f842537)
14:34:17.886 default [http-nio-9091-exec-3] DEBUG c.c.t.t.a.weave.DTXResourceWeaver - proxy a sql connection: com.codingapi.txlcn.tc.core.transaction.lcn.resource.LcnConnectionProxy@e21d245.
14:34:18.938 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - cmd->{"key":"982967939019400","msg":{"action":"heartCheck","state":100}}
14:34:18.942 default [http-nio-9091-exec-3] DEBUG c.c.txlcn.tc.core.DTXServiceExecutor - business success @group(5931a5f842537)
14:34:18.942 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.t.l.c.LcnRunningTransaction - join group: [GroupId: 5931a5f842537,Method: public void cn.bainuo.gene.project.service.impl.ProjectServiceImpl.testTxManager(java.lang.String)]
14:34:18.942 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.t.TransactionControlTemplate - join group > transaction type: lcn @group(5931a5f842537)
14:34:18.943 default [http-nio-9091-exec-3] DEBUG c.c.t.txmsg.netty.bean.SocketManager - get channel, key:/192.168.33.194:8070
14:34:18.943 default [http-nio-9091-exec-3] DEBUG c.c.t.txmsg.netty.bean.SocketManager - await response
14:34:18.943 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdEncoder - send->{"key":"5931ab0da66537","msg":{"action":"joinGroup","data":{"groupId":"5931a5f842537","transactionState":1,"unitId":"e12ee93bd3c9545ed0361ba2940d86db","unitType":"lcn"},"groupId":"5931a5f842537","state":100},"remoteKey":"/192.168.33.194:8070"}
14:34:18.951 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - cmd->{"key":"5931ab0da66537","msg":{"action":"joinGroup","groupId":"5931a5f842537","state":200},"remoteKey":"/192.168.33.194:62065"}
14:34:18.951 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - got response message[Netty Handler]
14:34:18.952 default [http-nio-9091-exec-3] DEBUG c.c.t.txmsg.netty.bean.NettyRpcCmd - got response. 5931ab0da66537 
14:34:18.952 default [http-nio-9091-exec-3] DEBUG c.c.t.txmsg.netty.bean.SocketManager - response is: MessageDto(action=joinGroup, groupId=5931a5f842537, data=null, state=200)
14:34:18.952 default [http-nio-9091-exec-3] DEBUG c.c.t.t.netty.impl.NettyRpcClient - cmd request used time: 9 ms
14:34:18.952 default [http-nio-9091-exec-3] DEBUG c.c.txlcn.tc.txmsg.LoopMessenger - request action: joinGroup. TM[/192.168.33.194:8070]
14:34:18.952 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.t.TransactionControlTemplate - join group message over. @group(5931a5f842537)
14:34:18.952 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.checking.SimpleDTXChecking - start delay checking task @group(5931a5f842537)
14:34:18.953 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.t.TransactionControlTemplate - join group logic over @group(5931a5f842537)
14:34:18.953 default [http-nio-9091-exec-3] DEBUG c.c.t.t.c.c.DefaultGlobalContext - Destroy TxContext[5931a5f842537]
14:34:18.953 default [http-nio-9091-exec-3] DEBUG c.c.txlcn.tc.core.DTXLocalContext - clean thread local[DTXLocalContext]: DTXLocalContext(transactionType=lcn, groupId=5931a5f842537, unitId=e12ee93bd3c9545ed0361ba2940d86db, resource=null, destroy=true, inGroup=false, attachment=null, sysTransactionState=1, userTransactionState=-1, proxy=true, justNow=false, proxyTmp=false)
14:34:18.953 default [http-nio-9091-exec-3] DEBUG c.c.t.tc.aspect.weave.DTXLogicWeaver - <---- TxLcn end ---->
14:34:18.963 default [pool-2-thread-2] DEBUG c.c.t.t.c.a.AsyncH2DBAspectLogger - async save aspect log. result: true groupId: 5931a5f842537, used time: 10ms
14:34:19.060 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - cmd->{"key":"5931ab36a4d537","msg":{"action":"notifyUnit","data":{"groupId":"5931a5f842537","state":1,"unitId":"e12ee93bd3c9545ed0361ba2940d86db","unitType":"lcn"},"groupId":"5931a5f842537","state":100},"remoteKey":"/192.168.33.194:62065"}
14:34:19.064 default [tc-rpc-service-0] DEBUG c.c.txlcn.tc.txmsg.ClientRpcAnswer - Receive Message: MessageDto(action=notifyUnit, groupId=5931a5f842537, data=NotifyUnitParams(groupId=5931a5f842537, unitId=e12ee93bd3c9545ed0361ba2940d86db, unitType=lcn, state=1), state=100)
14:34:19.066 default [tc-rpc-service-0] DEBUG com.codingapi.txlcn.txmsg.LCNCmdType - parsed txmsg cmd: notifyUnit
14:34:19.067 default [tc-rpc-service-0] DEBUG c.c.txlcn.tc.support.TxLcnBeanHelper - getRpcBeanName->rpc_lcn_notify-unit
14:34:19.067 default [tc-rpc-service-0] DEBUG c.c.t.t.c.t.TransactionCleanTemplate - clean transaction @group(5931a5f842537)
14:34:19.067 default [tc-rpc-service-0] DEBUG c.c.t.t.c.t.l.r.LcnConnectionProxy - commit transaction type[lcn] proxy connection:com.codingapi.txlcn.tc.core.transaction.lcn.resource.LcnConnectionProxy@e21d245.
14:34:19.071 default [tc-rpc-service-0] DEBUG c.c.t.t.c.t.l.r.LcnConnectionProxy - transaction type[lcn] proxy connection:com.codingapi.txlcn.tc.core.transaction.lcn.resource.LcnConnectionProxy@e21d245 closed.
14:34:19.071 default [tc-rpc-service-0] DEBUG c.c.t.t.c.checking.SimpleDTXChecking - cancel 5931a5f842537:e12ee93bd3c9545ed0361ba2940d86db checking. @group(5931a5f842537)
14:34:19.071 default [tc-rpc-service-0] DEBUG c.c.t.t.c.t.TransactionCleanTemplate - clean transaction over @group(5931a5f842537)
14:34:19.072 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdEncoder - send->{"key":"5931ab36a4d537","msg":{"action":"notifyUnit","data":true,"state":200},"remoteKey":"/192.168.33.194:8070"}
14:34:19.074 default [pool-2-thread-3] DEBUG c.c.t.t.c.a.AsyncH2DBAspectLogger - async clear aspect log. result:true, groupId: 5931a5f842537, used time: 2ms
14:34:31.074 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - cmd->{"key":"982967939019400","msg":{"action":"heartCheck","state":100}}
14:34:43.080 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - cmd->{"key":"982967939019400","msg":{"action":"heartCheck","state":100}}
14:34:55.085 default [nioEventLoopGroup-4-1] DEBUG c.c.t.t.netty.handler.RpcCmdDecoder - cmd->{"key":"982967939019400","msg":{"action":"heartCheck","state":100}}