目录

zookeeper admin配置及运行

zookeeper admin源码流程跟踪及解析


zookeeper admin配置及运行

1、启动zookeeper server,以windows为例,在自己zookeeper安装目录下双击zkServer.cmd启动一个server,启动结果如下图所示:

zookeeper删除注册者 zookeeper admin_spring

2、soul-admin配置zookeeper client连接,pom.xml引入文件如下:

zookeeper删除注册者 zookeeper admin_zookeeper删除注册者_02

application.yml配置参数如下:

zookeeper删除注册者 zookeeper admin_网关_03

3、准备就绪,启动SoulAdminBootstrap,启动成功,而且通过日志可以看出已正常连接zookeeper

zookeeper删除注册者 zookeeper admin_网关_04

4、查看zookeeper节点数据,两种方式都可以查看。

方式一:cd 到zookeeper的bin目录下,如D:\Program Files\apache-zookeeper-3.5.8-bin\bin,输入start zkCli.cmd -server localhost:2181启动一个客户端连接截图如下:

zookeeper删除注册者 zookeeper admin_网关_05

ls /看下,以下都是我们的节点信息。

zookeeper删除注册者 zookeeper admin_网关_06

方式二:cd D:\Program Files\apache-zookeeper-3.5.8-bin\build,然后java -jar zookeeper-dev-ZooInspector.jar启动一个页面操作工具,启动连接localhost:2181的页面如下:

zookeeper删除注册者 zookeeper admin_java_07

zookeeper admin源码流程跟踪及解析

源码流程图类似我们上篇分析websocket socket的流程基本类似。这里我们就直接开始分析。

入口还是同一个位置DataSyncConfiguration会根据我们的配置选择选择一个同步策略,这里因为我们配置了zookeeper,所以将会初始化ZookeeperDataChangedListener和ZookeeperDataInit到spring容器。

@Configuration
    @ConditionalOnProperty(prefix = "soul.sync.zookeeper", name = "url")
    @Import(ZookeeperConfiguration.class)
    static class ZookeeperListener {
        /**
         * Config event listener data changed listener.
         *
         * @param zkClient the zk client
         * @return the data changed listener
         */
        @Bean
        @ConditionalOnMissingBean(ZookeeperDataChangedListener.class)
        public DataChangedListener zookeeperDataChangedListener(final ZkClient zkClient) {
            return new ZookeeperDataChangedListener(zkClient);
        }
        /**
         * Zookeeper data init zookeeper data init.
         *
         * @param zkClient        the zk client
         * @param syncDataService the sync data service
         * @return the zookeeper data init
         */
        @Bean
        @ConditionalOnMissingBean(ZookeeperDataInit.class)
        public ZookeeperDataInit zookeeperDataInit(final ZkClient zkClient, final SyncDataService syncDataService) {
            return new ZookeeperDataInit(zkClient, syncDataService);
        }
    }

我们看到参数为zkclient,那么我们再找下这个参数是如何会注入spring容器的,找到加了@Bean注解,那么在启动的时候会读取配置的url和sessionTimeout等参数创建一个zkClient的连接。

zookeeper删除注册者 zookeeper admin_zookeeper删除注册者_08

zookeeper删除注册者 zookeeper admin_java_09

继续回到最开始的初始化ZookeeperDataChangedListener和ZookeeperDataInit的位置,先来看下ZookeeperDataChangedListener类,我们看到实现了DataChangeListener,做了具体插件,元数据等的更新zookeeper节点的操作。

zookeeper删除注册者 zookeeper admin_spring_10

ZookeeperDataInit则实现了CommandLineRunner接口,该接口在springboot的作用为启动后会遍历所有实现CommandLineRunner的实体类并执行run方法,如果需要排序,那么可以加上@Order注解(或者实现Order接口)来表明顺序。简单来说就是一个初始化的操作,我们看到run方法里会去判断如果插件等列表不为空,则会进行一次同步zookeeper操作。

zookeeper删除注册者 zookeeper admin_java_11

同步All的方法如下,查询所有数据,然后发布一个事件。

zookeeper删除注册者 zookeeper admin_zookeeper删除注册者_12

根据上篇我们分析websocket的源码逻辑,我们知道发布事件后,会有一个监听器来处理事件,就是下面的DataChangedEventDispatcher的对象,该对象的onApplicationEvent开始处理,然后遍历所有监听器的event事件,进行处理,类似一个事件分发器的一个角色,而真正的事件处理者就是我们上面的ZookeeperDataChangedListener对象,然后执行对应xxxxchanged写入到zookeeper。

zookeeper删除注册者 zookeeper admin_spring_13

同样的,大家可以观察下启动,打个debug走一遍流程,然后再在admin页面上打开一个插件或者选择器的配置,然后观察走一遍流程,这里就不做演示了。