現(xiàn)象
項目在公司網(wǎng)絡(luò)啟動時,能正常啟動。但通過vpn連接到公司網(wǎng)絡(luò)時卻無法啟動報下面的錯誤java.lang.IllegalStateException: zookeeper not connected
。
Caused by: java.lang.IllegalStateException: zookeeper not connected
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:84)
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.createZookeeperClient(CuratorZookeeperTransporter.java:26)
at org.apache.dubbo.remoting.zookeeper.AbstractZookeeperTransporter.connect(AbstractZookeeperTransporter.java:68)
at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration.<init>(ZookeeperDynamicConfiguration.java:66)
at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory.createDynamicConfiguration(ZookeeperDynamicConfigurationFactory.java:43)
at org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory.lambda$getDynamicConfiguration$0(AbstractDynamicConfigurationFactory.java:39)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
at org.apache.dubbo.common.config.configcenter.AbstractDynamicConfigurationFactory.getDynamicConfiguration(AbstractDynamicConfigurationFactory.java:39)
at org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration(DynamicConfiguration.java:224)
at org.apache.dubbo.config.bootstrap.DubboBootstrap.prepareEnvironment(DubboBootstrap.java:1024)
at org.apache.dubbo.config.bootstrap.DubboBootstrap.startConfigCenter(DubboBootstrap.java:619)
at org.apache.dubbo.config.bootstrap.DubboBootstrap.initialize(DubboBootstrap.java:521)
at org.apache.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:244)
at org.apache.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:206)
at org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.doGetInjectedBean(ReferenceAnnotationBeanPostProcessor.java:165)
at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.getInjectedObject(AbstractAnnotationBeanPostProcessor.java:409)
at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor$AnnotatedFieldElement.inject(AbstractAnnotationBeanPostProcessor.java:626)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
at com.alibaba.spring.beans.factory.annotation.AbstractAnnotationBeanPostProcessor.postProcessPropertyValues(AbstractAnnotationBeanPostProcessor.java:179)
... 78 common frames omitted
Caused by: java.lang.IllegalStateException: zookeeper not connected
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:81)
... 96 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:52979', transport: 'socket'
Process finished with exit code 1
猜測:連接到zookeeper的服務(wù)器網(wǎng)絡(luò)策略不通
— 通過telnet證實端口網(wǎng)絡(luò)時通的。該猜測不成立。
定位問題
進一步經(jīng)過報錯的日志,找到對應(yīng)的源碼。
public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZookeeperClient.NodeCacheListenerImpl, CuratorZookeeperClient.CuratorWatcherImpl> {
protected static final Logger logger = LoggerFactory.getLogger(CuratorZookeeperClient.class);
private static final String ZK_SESSION_EXPIRE_KEY = "zk.session.expire";
static final Charset CHARSET = StandardCharsets.UTF_8;
private final CuratorFramework client;
private static Map<String, NodeCache> nodeCacheMap = new ConcurrentHashMap<>();
public CuratorZookeeperClient(URL url) {
super(url);
try {
int timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_CONNECTION_TIMEOUT_MS);
int sessionExpireMs = url.getParameter(ZK_SESSION_EXPIRE_KEY, DEFAULT_SESSION_TIMEOUT_MS);
CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
.connectString(url.getBackupAddress())
.retryPolicy(new RetryNTimes(1, 1000))
.connectionTimeoutMs(timeout)
.sessionTimeoutMs(sessionExpireMs);
String authority = url.getAuthority();
if (authority != null && authority.length() > 0) {
builder = builder.authorization("digest", authority.getBytes());
}
client = builder.build();
client.getConnectionStateListenable().addListener(new CuratorConnectionStateListener(url));
client.start();
boolean connected = client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS);
if (!connected) {
throw new IllegalStateException("zookeeper not connected");
}
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
可以看出 是 boolean connected = client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS);
這里 connected
返回了fasle導(dǎo)致的問題。
然后下端點, 發(fā)現(xiàn)timeout = 3000
,也就說3秒內(nèi)需要鏈接成功,否則就會超時。
推測由于vpn的方式連接的 zk服務(wù)器,很有可能是 3秒內(nèi)沒有得到服務(wù)端的正確響應(yīng),而導(dǎo)致了異常,然后拋出了異常。
基于上的推測,將該timeout的默認(rèn)值3000改大一些后,然后就啟動成功了。
解決
修改dubbo的配置,下面是springboot的項目,修改的方式。
從上面的報錯信息是可以看出是 configcenter
的連接超時。下面配置了三個配置的超時時間,可根據(jù)情況進行配置。文章來源:http://www.zghlxwxcb.cn/news/detail-503736.html
dubbo:
config-center:
timeout: 60000
metadata-report:
timeout: 60000
registry:
timeout: 60000
注意: 有可能版本的問題,上面3個屬性,全部配置了,有可能項目啟動報錯, 請根據(jù)保持信息,適當(dāng)調(diào)整刪減屬性后重試。文章來源地址http://www.zghlxwxcb.cn/news/detail-503736.html
到了這里,關(guān)于springboot+dubbo項目啟動項目時報錯 zookeeper not connected的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!