springboot+dubbo启动项目时报错 zookeeper not connected的问题及解决方案

 更新时间:2023年06月28日 10:32:57   作者:IccBoY  
这篇文章主要介绍了springboot+dubbo项目启动项目时报错 zookeeper not connected的问题,本文给大家定位问题及解决方案,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下

现象

项目在公司网络启动时,能正常启动。但通过vpn连接到公司网络时却无法启动报下面的错误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的服务器网络策略不通— 通过telnet证实端口网络时通的。该猜测不成立。

定位问题

进一步经过报错的日志,找到对应的源码。

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导致的问题。然后下端点, 发现timeout = 3000 ,也就说3秒内需要链接成功,否则就会超时。

推测由于vpn的方式连接的 zk服务器,很有可能是 3秒内没有得到服务端的正确响应,而导致了异常,然后抛出了异常。

基于上的推测,将该timeout的默认值3000改大一些后,然后就启动成功了。

解决

修改dubbo的配置,下面是springboot的项目,修改的方式。从上面的报错信息是可以看出是 configcenter的连接超时。下面配置了三个配置的超时时间,可根据情况进行配置。

dubbo:
  config-center:
    timeout: 10000
  metadata-report:
    timeout: 10000
  registry:
    timeout: 10000

到此这篇关于springboot+dubbo项目启动项目时报错 zookeeper not connected的文章就介绍到这了,更多相关springboot+dubbo启动项目报错 zookeeper not connected内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven工程pom中如何定义jdk版本

    Maven工程pom中如何定义jdk版本

    这篇文章主要介绍了Maven工程pom中如何定义jdk版本,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java SpringBoot Validation用法案例详解

    Java SpringBoot Validation用法案例详解

    这篇文章主要介绍了Java SpringBoot Validation用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • 详解mybatis generator代码生成器的使用

    详解mybatis generator代码生成器的使用

    MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。这篇文章主要介绍了mybatis generator代码生成器的使用,需要的朋友可以参考下
    2021-09-09
  • Swing图形界面实现可动态刷新的验证码

    Swing图形界面实现可动态刷新的验证码

    这篇文章主要为大家详细介绍了Swing图形界面实现可动态刷新的验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • SpringBoot详细讲解通过自定义classloader加密保护class文件

    SpringBoot详细讲解通过自定义classloader加密保护class文件

    这篇文章主要介绍了SpringBoot通过自定义classloader加密class文件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Java快速生成PDF文档的实例代码

    Java快速生成PDF文档的实例代码

    在如今数字化时代,越来越多的人使用PDF文档进行信息传递和共享,而使用Java生成PDF文档也成为了一个非常重要的技能,所以本文我们将为您介绍如何使用Java快速生成PDF文档,需要的朋友可以参考下
    2023-09-09
  • java实现读取txt文件中的内容

    java实现读取txt文件中的内容

    本文通过一个具体的例子向大家展示了如何使用java实现读取TXT文件里的内容的方法以及思路,有需要的小伙伴可以参考下
    2016-03-03
  • Java中如何调用cmd压缩文件

    Java中如何调用cmd压缩文件

    以下是对Java调用cmd压缩文件的实现方法进行了分析介绍,需要的朋友可以参考下
    2013-07-07
  • mybatis 获取无数据的字段不显示的问题

    mybatis 获取无数据的字段不显示的问题

    这篇文章主要介绍了mybatis 获取无数据的字段不显示的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • java jdk1.8 使用stream流进行list 分组归类操作

    java jdk1.8 使用stream流进行list 分组归类操作

    这篇文章主要介绍了java jdk1.8 使用stream流进行list 分组归类操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论