dubbo zkclient 启动阻塞

公司网络偶尔抖动,此时dubbo应用启动时,会出现莫名奇妙的阻塞,无法启动完成。

现象:
应用无法启动,同时无多余日志输出

猜测:

  1. 死循环了
  2. 线程阻塞

排查方法:
对于猜测1:
死循环,cpu使用率应该上升,但看了下,cpu使用率并没多大变化,排除

对于猜测2:
线程阻塞,直接想到的是查看线程堆栈,jdk提供了很好的工具jstack。
首先使用jps列出显示当前的java进程号,
再根据进程号,使用jstack查看进程堆栈。

主要看下main线程的状态

dubbo zkclient 启动阻塞_第1张图片
image.png

可以看到,main线程一直在等待,当前应用使用zkclient作为连接zookeeper的客户端。

dubbo zkclient 启动阻塞_第2张图片
image.png

通过查看源码第25行可以看到,dubbo直接使用不带超时时间设置的zkclient构建方法。
进入到zkclient的实现,可以看到,如果没主动设置zkclient的超时时间,会默认使用Integer.MAX_VALUE作为默认超时时间。

dubbo zkclient 启动阻塞_第3张图片
image.png

如果因为网络原因,在启动时无法连上zk,就会一直阻塞了。

该问题在dubbo的github中已有issues[https://github.com/alibaba/dubbo/issues/287],但目前官方并未做调整。
如果想避免这个问题,可以采用curator作为zk客户端,或者自己实现一个客户端。

你可能感兴趣的:(dubbo zkclient 启动阻塞)