關於dubbo訪問錯誤的zookeeper註冊中心時會導致無限期阻塞的問題解決
阿新 • • 發佈:2018-12-14
遇到的問題:在專案中通過rpc呼叫dubbo時,訪問了一個錯誤的zookeeper註冊中心地址後,程式發生了執行緒阻塞,在重啟rpc前 訪問其他正確的註冊中心地址也訪問不通了,檢視日誌如下:
dubbo在2.6.0版本之前預設使用zkclient作為註冊中心zookeeper的客戶端,而在new zkClient()的時候,沒有傳入zookeeper等待超時時間,使用預設的Integer.MAX_VALUE,這樣在zookeeper連不上的情況下不報錯也無法啟動,導致程式阻塞;
以下是報錯時dubbo版本及zkClient的maven配置:
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!--dubbo--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency>
我們採用的解決辦法時:採用curator作為zookeeper的客戶端,具體做法:dubbo版本改為2.6.0以上版本,因為2.6.0以上版本的dubbo提供了可選的zookeeper客戶端curator,同時匯入curator的jar:
<!--zookeeper客戶端 dubbo2.6之後相容curator客戶端--> <!--<dependency>--> <!--<groupId>com.101tec</groupId>--> <!--<artifactId>zkclient</artifactId>--> <!--<version>0.10</version>--> <!--</dependency>--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <!--dubbo--> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> </dependency>
問題解決