dubbo提供者停止服务后zookeeper临时节点不能自动摘除

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/liujunzxcv/article/details/91670951

测试环境的dubbo服务提供者出现多个重复提供者,且停服务后服务节点无法摘除。

zookeeper客户端使用的curator,首先排查curator创建的节点是否是临时节点,在本地环境起服务调试到AbstractZookeeperClient:

  @Override
    public void create(String path, boolean ephemeral) {
        if (!ephemeral) {
            if (checkExists(path)) {
                return;
            }
        }
        int i = path.lastIndexOf('/');
        if (i > 0) {
            create(path.substring(0, i), false);
        }
        if (ephemeral) {
            createEphemeral(path);
        } else {
            createPersistent(path);
        }
    }

发现确实走的createEphemeral(path);
用zkCli.sh get查看dubbo provider节点发现确实也是临时节点:

非原图,信息类似
非原图,信息类似。

再查看tickTime、initLimit、syncLimit等配置项也正常。

排查到这里有点没头绪了,然后找到网上有人也遇到多个相同提供者问题,而他问题的原因是服务器时间不正确,于是查看了zookeeper服务器时间和提供者服务器时间,发现仍然是正确的。

最后又回过头看时间,发现创建的临时节点在zookeeper metadata中的时间戳ctime、mtime都是2020年8月,差了一年多。原来是有系统项目部署在了zookeeper服务器,测试时修改了系统时间到2020年,这时provider服务重启时去注册的节点,ctime、mtime时间都变成了2020年,导致关闭了session后临时节点仍然存在。

解决办法:使用curator把时间戳不正确的临时节点都删除

猜你喜欢

转载自blog.csdn.net/liujunzxcv/article/details/91670951