Druid连接池源码解析(5)HighAvailableData
HADataSource还有两个属性,一个是poolUpdater,一个是nodeListener;是一组观察者模式的Observer和Observable,poolUpdater是用来监听添加和删除节点事件并做相应处理的
1 poolUpdater
-
init()方法中定义了一个 核心线程数的 newScheduledThreadPool,会在 intervalSeconds 时间间隔里面调动 removeDataSources 方法,removeDataSources 中检查poolUpdater中定义的一个CopyOnWriteArraySet存储了待删除的datasource名字,检查存在于dataSourceMap中,就转换成DruidDatasource,检查活跃连接数,如果没有活跃连接数就关闭这个datasource并从dataSourceMap中删除
-
监听了Node的添加和删除事件,删除提一下,是把datasource放到blacklist中,而不是直接删除,会在上面的定时removeDataSources方法中删除,删除时会校验是否唯一一个dataSource,如果只有一个,且allowEmptyPool为false的话,是不允许删空dataSourceMap的
2 nodeListener
HighAvailableDataSource 在init()中调用createNodeMap,创建nodeListener,默认是FileNodeListener;
nodeListener 有两个实现,FileNodeListener和ZookeeperNodeListener,一个基于配置文件变动,一个基于ZK。
- FileNodeListener是开一个newScheduledThreadPool ,定时扫描配置文件的变动,并分发Node变动的事件的
- ZookeeperNodeListener则是通过 curator 的包,对 zookeeper 的节点进行操作,监听了CHILD_REMOVED,CHILD_ADDED,CONNECTION_RECONNECTED 这三个事件,触发相应的事件分发,其中CONNECTION_RECONNECTED触发refreshAllNodes,解析出天价或者删除事件,再次分发
ZookeeperNodeListener很巧妙地把节点变动信息,封装成了property,统一了与FileNodeListener的事件处理流程
3 总结
HighAvailableDataSource 对节点的变动,采用了观察者模式解耦了事件和处理逻辑,活用了定时刷新的机制,可以对标微服务中的服务治理