1. 程式人生 > >關於dubbo訪問錯誤的zookeeper註冊中心時會導致無限期阻塞的問題解決

關於dubbo訪問錯誤的zookeeper註冊中心時會導致無限期阻塞的問題解決

遇到的問題:在專案中通過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>

問題解決