公司網(wǎng)絡偶爾抖動,此時dubbo應用啟動時,會出現(xiàn)莫名奇妙的阻塞,無法啟動完成。
現(xiàn)象:
應用無法啟動,同時無多余日志輸出
猜測:
- 死循環(huán)了
- 線程阻塞
排查方法:
對于猜測1:
死循環(huán),cpu使用率應該上升,但看了下,cpu使用率并沒多大變化,排除
對于猜測2:
線程阻塞,直接想到的是查看線程堆棧,jdk提供了很好的工具jstack。
首先使用jps列出顯示當前的java進程號,
再根據(jù)進程號,使用jstack查看進程堆棧。
主要看下main線程的狀態(tài)

image.png
可以看到,main線程一直在等待,當前應用使用zkclient作為連接zookeeper的客戶端。

image.png
通過查看源碼第25行可以看到,dubbo直接使用不帶超時時間設置的zkclient構建方法。
進入到zkclient的實現(xiàn),可以看到,如果沒主動設置zkclient的超時時間,會默認使用Integer.MAX_VALUE作為默認超時時間。

image.png
如果因為網(wǎng)絡原因,在啟動時無法連上zk,就會一直阻塞了。
該問題在dubbo的github中已有issues[https://github.com/alibaba/dubbo/issues/287],但目前官方并未做調整。
如果想避免這個問題,可以采用curator作為zk客戶端,或者自己實現(xiàn)一個客戶端。