最终也没能跑通的分布式事务示例项目(tcc-transaction)

1.背景

上周在网上学习了解了分布式事务的一些基本概念和理论,想着这周跑一个相关的案例来加深理解一下,正好公司最近也要搞相关的工作,一举两得。于是,准备看看之前网上大佬写的tcc-transaction,这是一个基于tcc思想实现的分布式事务框架。(分布式事务相关理论知识可以参考我的另一篇博客:分布式事务详解

了解了分布式事务的理论内容,要了解其实现原理,第一步就是跑通项目的简单示例,即tcc-transaction-tutorial-sample部分的代码。

今天主要介绍在跑通tcc-transaction-tutorial-sample过程中遇到的各种坑以及解决方法。

2.依赖环境

  • Java
  • Maven
  • MySQL
  • Redis
  • Zookeeper
  • Intellij IDEA

源码地址:https://github.com/changmingxie/tcc-transaction

3.踩坑历程

踩坑准备

第一步:代码准备

在github上直接下载代码压缩包到本地解压缩即可,如图:
在这里插入图片描述

第二步:导入代码执行数据库脚本

进入IDEA,直接Open文件tcc-transaction-master-1.2.x即可。
执行数据库脚本,我在这里使用的是Navicat,进入Navicat,创建新的Mysql连接,然后依次执行项目中的tcc-transaction-master-1.2.x\tcc-transaction-tutorial-sample\src\dbscripts 下的四个数据库脚本即可。具体如下图:
在这里插入图片描述

第三步:修改配置文件

主要修改的是数据库配置参数。拿tcc-transaction-dubbo-sample举例,需要修改的文件有

tcc-transaction/tcc-transaction-tutorial-sample/tcc-transaction-dubbo-sample/tcc-transaction-dubbo-capital/src/main/resources/tccjdbc.properties

tcc-transaction/tcc-transaction-tutorial-sample/tcc-transaction-dubbo-sample/tcc-transaction-dubbo-redpacket/src/main/resources/tccjdbc.properties

tcc-transaction/tcc-transaction-tutorial-sample/tcc-transaction-dubbo-sample/tcc-transaction-dubbo-order/src/main/resources/tccjdbc.properties
如图:
在这里插入图片描述
结合项目的README.md文件以及网上的文章了解到如果要跑通示例项目,需要分别启动三个项目。

tcc-transaction提供了两个版本:

  • 基于dubbo通讯的示例版本
  • 基于http通讯的示例版本

这两个版本对于的三个项目分别是

  • tcc-transaction-dubbo-capital(账户资产服务)、 tcc-transaction-dubbo-redpacket(红包服务)、 tcc-transaction-dubbo-order(交易订单服务)
  • tcc-transaction-http-capital(账户资产服务)、 tcc-transaction-http-redpacket(红包服务)、 tcc-transaction-http-order(交易订单服务)

在这里插入图片描述

坑1:连接不上zk

启动tcc-transaction-dubbo-capital项目,报错信息如下:

[sample-dubbo-capital]2019-08-31 17:48:05,312 INFO [org.apache.zookeeper.ZooKeeper] Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.I0Itec.zkclient.ZkClient@32c7bb63
[sample-dubbo-capital]2019-08-31 17:48:05,334 INFO [org.apache.zookeeper.ClientCnxn] Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
[sample-dubbo-capital]2019-08-31 17:48:05,344 WARN [org.apache.zookeeper.ClientCnxn] Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)
[sample-dubbo-capital]2019-08-31 17:48:06,456 INFO [org.apache.zookeeper.ClientCnxn] Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
[sample-dubbo-capital]2019-08-31 17:48:06,459 WARN [org.apache.zookeeper.ClientCnxn] Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)
[sample-dubbo-capital]2019-08-31 17:48:07,566 INFO [org.apache.zookeeper.ClientCnxn] Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
[sample-dubbo-capital]2019-08-31 17:48:07,567 WARN [org.apache.zookeeper.ClientCnxn] Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused

解决方法:本地安装zookeeper即可。安装教程如下:
下载地址:https://zookeeper.apache.org/releases.html
官网安装教程:http://zookeeper.apache.org/doc/r3.5.5/zookeeperStarted.html
在这里插入图片描述
下载版本3.6.1,解压到常用目录下即可。
解压后,要进行简单的配置,因为我是在自己电脑使用,咱们只介绍单机操作。
进入zookeeper安装目录,打开conf目录,找到zoo_sample.cfg文件文件,复制一份命名为zoo.cfg,因为zookeeper默认读取zoo.cfg为配置文件。
在这里插入图片描述
编辑zoo.cfg文件,将dataDir=/tmp/zookeeper修改成zookeeper安装目录所在的data文件夹(需要在安装目录下面新建一个空的data文件夹和log文件夹),同时添加一条添加数据日志的配置,如下图:
在这里插入图片描述
启动zookeeper,判定是否安装成功,双击运行zookeeper安装目录下的bin目录中的zkServer.cmd文件即可,运行如下:
在这里插入图片描述
在IDEA中添加zookeeper插件,依次点击File—>settings—>Plugins,然后在右边输入框搜索zookeeper(如果搜索不到,可尝试关闭防火墙后重新搜索尝试),点击install安装后重启Idea,即可在settings中最下方看到zookeeper。如下图:
在这里插入图片描述
在这里插入图片描述

坑2:redis连不上

启动tcc-transaction-dubbo-order报错部分信息如下:

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.mengyun.tcctransaction.sample.dubbo.order.service.PlaceOrderServiceImpl org.mengyun.tcctransaction.sample.dubbo.order.web.controller.OrderController.placeOrderService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeOrderServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.mengyun.tcctransaction.sample.dubbo.order.service.PaymentServiceImpl org.mengyun.tcctransaction.sample.dubbo.order.service.PlaceOrderServiceImpl.paymentService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'paymentServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.mengyun.tcctransaction.sample.dubbo.capital.api.CapitalTradeOrderService org.mengyun.tcctransaction.sample.dubbo.order.service.PaymentServiceImpl.capitalTradeOrderService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'captialTradeOrderService': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'compensableTransactionAspect' defined in class path resource [tcc-transaction.xml]: Cannot resolve reference to bean 'transactionConfigurator' while setting bean property 'transactionConfigurator'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionConfigurator': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.mengyun.tcctransaction.TransactionRepository org.mengyun.tcctransaction.spring.support.SpringTransactionConfigurator.transactionRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionRepository' defined in file [/Users/jackie/workspace/tcc-transaction/tcc-transaction-tutorial-sample/tcc-transaction-dubbo-sample/tcc-transaction-dubbo-order/target/tcc-transaction-dubbo-order-1.2.6/WEB-INF/classes/config/spring/local/appcontext-service-tcc.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'jedisPool' threw exception; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:526)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:295)
... 60 more

这个和上面的原因类似,本地没有安装redis,导致无法拿到redis连接。

于是安装redis,安装比较简单可以参考(附带redis可视化工具安装):https://blog.csdn.net/weixin_41381863/article/details/88231397

坑三 导入项目无法构建,很多依赖导入失败

如图:
在这里插入图片描述
解决方法:
查看日志发现是依赖库无法访问,修改maven的配置文件,使用阿里的镜像,重新构建即可成功导入依赖文件,具体为:
首先需要打开apache-maven下的conf下的setting.xml文件
apache-maven-3.6.3\conf\setting.xml,可以使用记事本等工具打开。添加阿里云的镜像。

    <mirror>  
		<id>alimaven</id>  
		<name>aliyun maven</name>  
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>;  
		<mirrorOf>central</mirrorOf>          
	</mirror>

在这里插入图片描述

4.总结

大概就是这样,最后也没跑成功,没有找到启动类,可能是我打开方式有问题吧,有跑通的大哥欢迎指正。期间遇到不少问题,原因大概如下:

  • 本地环境配置和项目提供的不一致,导致走了很多弯路,比如MySQL的版本。
  • 缺少详细的跑示例项目的文档说明。
  • 网上提供的资料比较粗略,也比较陈旧。

如有错误,欢迎指正。

参考文章:https://www.cnblogs.com/bigdataZJ/p/tcc-transaction-sample.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值