目录
zookeeper admin配置及运行
zookeeper admin源码流程跟踪及解析
zookeeper admin配置及运行
1、启动zookeeper server,以windows为例,在自己zookeeper安装目录下双击zkServer.cmd启动一个server,启动结果如下图所示:
2、soul-admin配置zookeeper client连接,pom.xml引入文件如下:
application.yml配置参数如下:
3、准备就绪,启动SoulAdminBootstrap,启动成功,而且通过日志可以看出已正常连接zookeeper
4、查看zookeeper节点数据,两种方式都可以查看。
方式一:cd 到zookeeper的bin目录下,如D:\Program Files\apache-zookeeper-3.5.8-bin\bin,输入start zkCli.cmd -server localhost:2181启动一个客户端连接截图如下:
ls /看下,以下都是我们的节点信息。
方式二:cd D:\Program Files\apache-zookeeper-3.5.8-bin\build,然后java -jar zookeeper-dev-ZooInspector.jar启动一个页面操作工具,启动连接localhost:2181的页面如下:
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的连接。
继续回到最开始的初始化ZookeeperDataChangedListener和ZookeeperDataInit的位置,先来看下ZookeeperDataChangedListener类,我们看到实现了DataChangeListener,做了具体插件,元数据等的更新zookeeper节点的操作。
ZookeeperDataInit则实现了CommandLineRunner接口,该接口在springboot的作用为启动后会遍历所有实现CommandLineRunner的实体类并执行run方法,如果需要排序,那么可以加上@Order注解(或者实现Order接口)来表明顺序。简单来说就是一个初始化的操作,我们看到run方法里会去判断如果插件等列表不为空,则会进行一次同步zookeeper操作。
同步All的方法如下,查询所有数据,然后发布一个事件。
根据上篇我们分析websocket的源码逻辑,我们知道发布事件后,会有一个监听器来处理事件,就是下面的DataChangedEventDispatcher的对象,该对象的onApplicationEvent开始处理,然后遍历所有监听器的event事件,进行处理,类似一个事件分发器的一个角色,而真正的事件处理者就是我们上面的ZookeeperDataChangedListener对象,然后执行对应xxxxchanged写入到zookeeper。
同样的,大家可以观察下启动,打个debug走一遍流程,然后再在admin页面上打开一个插件或者选择器的配置,然后观察走一遍流程,这里就不做演示了。