公司网络偶尔抖动,此时dubbo应用启动时,会出现莫名奇妙的阻塞,无法启动完成。
现象:
应用无法启动,同时无多余日志输出
猜测:
- 死循环了
- 线程阻塞
排查方法:
对于猜测1:
死循环,cpu使用率应该上升,但看了下,cpu使用率并没多大变化,排除
对于猜测2:
线程阻塞,直接想到的是查看线程堆栈,jdk提供了很好的工具jstack。
首先使用jps列出显示当前的java进程号,
再根据进程号,使用jstack查看进程堆栈。
主要看下main线程的状态
可以看到,main线程一直在等待,当前应用使用zkclient作为连接zookeeper的客户端。
通过查看源码第25行可以看到,dubbo直接使用不带超时时间设置的zkclient构建方法。
进入到zkclient的实现,可以看到,如果没主动设置zkclient的超时时间,会默认使用Integer.MAX_VALUE作为默认超时时间。
如果因为网络原因,在启动时无法连上zk,就会一直阻塞了。
该问题在dubbo的github中已有issues[https://github.com/alibaba/dubbo/issues/287],但目前官方并未做调整。
如果想避免这个问题,可以采用curator作为zk客户端,或者自己实现一个客户端。