主要错误信息:

dubbo:com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method...
Caused by: com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed .
com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout.
 
MySQL版本:8.0.15
Eclipse版本: 2018-12 (4.10.0)
dubbox版本:2.8.4
zookeeper版本:3.4.6

 

近期使用dubbox、zookeeper搭建一个项目时主要出现上述问题。

一开始定位最简单的BUG(timeout),以为是设置的timeout时间不够(默认1000ms),后来设置将超时时间加长为60000ms。

<dubbo:provider delay="-1" timeout="60000" retries="0"/>

发现还是timeout,判断不是超时问题。

 

后续又检查了linux的网络地址,类的序列化都没有问题。

用一个小的不涉及查询的demo测试了下,发现可以正常访问及返回。

说明网络地址没问题,检查了类都进行了序列化。

 

考虑是调用方法中的查询操作有问题导致超时。

于是测试查询,发送无法正常返回数据。

初步定位问题出现在dao层。

 

考虑可能是jdbc驱动版本、xml文件语句等问题。

首先检查简单的,容易测试问题,将xml中的sql语句,直接放入Navicat运行发现正常。

考虑可能是驱动版本等问题。

于是先编写了一个测试案例,测试dao中需要使用的方法,发现无法正常运行。

并且弹出too many connection提升,修改了my.ini中最大连接数。

修改后再次运行,又弹出validateConnection false,原始druid版本为1.0.16,后来根据网上的建议换成了1.0.15版本。

修改后再次运行,又弹出creater connection fiail jdbc.url:localhost:3306....

考虑可能是驱动版本问题,查询以前正常项目所用jdbc版本为8.0.11,修改jdbc驱动为8.0.11

修改对应驱动配置:jdbc.driver=com.mysql.cj.jdbc.Driver(老版本驱动无需加cj,问题项目版本jdbc驱动为5.xx.xx)

修改后再次测试,运行正常,结果可以正常返回。

 

最后测试原有项目,运行正常。

 

问题原因:MySQL版本过新,较老的驱动无法正常运行,以及MySQL的一些配置问题。

 

本次寻找BUG总结:

这次寻找问题的过程中,一开始思路上就出现了问题。

最开始试图找到和自己所遇问题一样,可以直接生搬硬套解决问题的方案。

这种思想是不可取的,每个人所遇的问题由于平台环境等因素存在差异性。

没有找出问题出现的原因,只是单纯的按部就班,不一定能解决问题。

正确的做法应该是编写小的demo或测试,定位问题出在哪里,一步步缩小问题范围,然后针对性的寻找和分析问题。

再借助搜索引擎这样才能事半功倍。

寻找问题时应该先尝试解决容易解决的问题,如果比较同意解决的问题不是最终BUG在逐步去解决复杂的问题。