記一次dubbo連接zookeeper注冊中心發生異常的排查經歷


    spring boot集成dubbo項目啟動過程中報錯,錯誤信息如下:

2020-01-19 17:42:30.466 ERROR - [main] org.springframework.boot.SpringApplication.reportFailure(822) | Application run failed
java.lang.IllegalStateException: zookeeper not connected
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:83)
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.createZookeeperClient(CuratorZookeeperTransporter.java:26)
	at org.apache.dubbo.remoting.zookeeper.support.AbstractZookeeperTransporter.connect(AbstractZookeeperTransporter.java:68)
	at org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive.connect(ZookeeperTransporter$Adaptive.java)
	at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration.<init>(ZookeeperDynamicConfiguration.java:70)
	at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory.createDynamicConfiguration(ZookeeperDynamicConfigurationFactory.java:37)
	at org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory.lambda$getDynamicConfiguration$0(AbstractDynamicConfigurationFactory.java:39)
	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
	at org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory.getDynamicConfiguration(AbstractDynamicConfigurationFactory.java:39)
	at org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration(DynamicConfiguration.java:223)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.prepareEnvironment(DubboBootstrap.java:815)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.startConfigCenter(DubboBootstrap.java:560)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.useRegistryAsConfigCenterIfNecessary(DubboBootstrap.java:624)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.initialize(DubboBootstrap.java:508)
	at org.apache.dubbo.config.bootstrap.DubboBootstrap.start(DubboBootstrap.java:698)
	at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onContextRefreshedEvent(DubboBootstrapApplicationListener.java:52)
	at org.apache.dubbo.config.spring.context.DubboBootstrapApplicationListener.onApplicationContextEvent(DubboBootstrapApplicationListener.java:45)
	at org.apache.dubbo.config.spring.context.OneTimeExecutionApplicationContextEventListener.onApplicationEvent(OneTimeExecutionApplicationContextEventListener.java:40)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
	at cn.mogutrip.base.foundation.shell.Application.main(Application.java:28)
Caused by: java.lang.IllegalStateException: zookeeper not connected
	at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:80)
	... 30 common frames omitted

項目中引用的是dubbo-spring-boot-starter,版本配置如下:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.5</version>
</dependency>

    從啟動結果可以看出,dubbo的注冊中心zookeeper連接不上了,起初我以為apollo中配置的zookeeper地址錯了,核對了一遍沒毛病。然后看了下項目中的application.properties配置文件,又看了下啟動日志,排除了apollo沒生效的可能性。而且項目中使用的Elastic-Job的配置中心zookeeper和dubbo的一樣,但是Elastic-Job卻啟動成功了。伴隨了一頭霧水,習慣性的百度了下spring boot集成dubbo所遇到的坑,大多數的情況是啟動類上沒有添加 @EnableDubboConfig 注解,可是我的項目添加了的。嘗試了網上的各種坑之后,還是沒有解決。然后我讓組員在他電腦上啟動項目看一下,居然一點問題都沒有。那就是服務器zookeeper不穩定嘍!

    可是怎么解決這個不穩定呢?從出錯的問題更了下源碼:

可以發現配置的信息都讀取到了的,走到下面這一步:

boolean connected = client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS);

返回的值是false。如果timeout的值變大,是不是就可能為true了呢?上面一步看出timeout=3000。那么timeout哪里來的,我沒發現我的配置里有3000。

不斷跟進、跟進、跟進:

到了DubboBootstrap類的startConfigCenter方法,已經沒有入參了,這里拿到的timeout也是3000,那就只有下面這行代碼可以取到:

 Collection<ConfigCenterConfig> configCenters = configManager.getConfigCenters();

繼續追蹤:

終於看到ConfigCenterConfig類中初始化了timeout = 3000L。原來dubbo的config-center配置中心,默認的獲取配置的超時時間是3秒鍾。

在項目的配置文件中修改一下這個時間為10秒:

dubbo.config-center.timeout=10000

再次啟動項目,完美解決!

總結:遇到問題,還是要從錯誤的本質出發,多跟進底層源碼,加深理解的同時,也學到了其架構思想和perfect的設計。
更多config-center的配置可以參考鏈接:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-config-center.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM