美文网首页
Druid连接池源码解析(5)HighAvailableData

Druid连接池源码解析(5)HighAvailableData

作者: 错乱的三元运算 | 来源:发表于2022-05-16 15:57 被阅读0次

    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 对节点的变动,采用了观察者模式解耦了事件和处理逻辑,活用了定时刷新的机制,可以对标微服务中的服务治理

    相关文章

      网友评论

          本文标题:Druid连接池源码解析(5)HighAvailableData

          本文链接:https://www.haomeiwen.com/subject/dkkburtx.html