Nacos外部数据源配置集群源码分析
我正在参加「掘金·启航计划」
一、写在前面
在上一篇文章中,我们就已经实现了k8s环境下,部署nacos集群。
既然nacos能集群部署,那我们就会想,nacos使用得数据源如果也是集群部署得,那nacos得配置是要怎么改?
这里,我们就能看到nacos对应的application.properties
文件
由上可见,如果我们要配置多个数据源,就配置db.num=2 或 db.num=3、4、5等
然后配置多个 db.url.0、db.url.1 等即可
看配置还是挺容易理解的,也挺好配置的,但是我们不能只停留在会配置这个阶段吧?
哈哈,作为高级程序员,要知道原理才行!!!
那今天我们就深入拔一下nacos的源码,看看nacos底层是如何实现多数据源配置的!!!
二、外部数据源配置集群
由于在生产环境中,我们的数据库可能是搭建了一个集群环境,那对应的nacos配置,要如何修改呢?
鉴于网上对于这一块的资料,描述可以说是相当的少,也没有相关的说明,这里,我通过源码分析,给大家解析一下。
- application.properties
# mysql
spring.datasource.platform=mysql
db.jdbcDriverName=com.mysql.cj.jdbc.Driver
# Count of DB,数据库的数量,如果是mysql一主一从复制的集群,那这里可以配置为2
db.num=2
# 第1个数据库(下标从0开始)(主)
db.url.0=jdbc:mysql://192.168.4.1:3306/jxbp_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# 第1个数据库账号密码
db.user.0=root
db.password.0=root
# 第2个数据库(从)
db.url.0=jdbc:mysql://192.168.4.2:3306/jxbp_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# 第2个数据库账号密码
db.user.0=root
db.password.0=root
# 注意
# 如果多个数据库的账号密码都是一样的,这里可以直接配1个即可,例如,下面
# db.user=root
# db.password=root
配置,就如上所示了,那么底层是怎么操作的呢?
原理,就是,通过线程task任务,去监听多个数据库的状态,如果出现数据库连接不上,就切换nacos访问的数据库。依次监听。
第一个访问不上,尝试访问第二个,第二个访问不上,尝试访问第三个,依次类推......
默认是以第一个数据库为主。
这里,你问我是怎么知道这个原理的?
我只能说,我去看了nacos源码,才得出这个结论的,毕竟网上也没啥资料说明的。
nacos的源码构建,大家可以看我以前的文章,这里
那下面进行源码分析:
- ExternalDataSourceServiceImpl.java
可以看到这里,能识别到,有两个数据源。
接下来这两行代码比较重要,就是两个线程task任务,去监听数据源的状态。
new SelectMasterTask().run();
选择主数据源
new CheckDbHealthTask().run();
校验数据源的状态
- new SelectMasterTask().run();
上面源码的逻辑,比较清晰了,估计都能看得懂吧。
当然这里只是执行一次,所以还是得开个定时器去定时执行监听数据源的状态,那我们打个断点,看下,是哪里开启的定时器。
由上可以看到,当数据源是大于1的时候,就会开始
SelectMasterTask().run()
任务
ConfigExecutor.scheduleConfigTask(new SelectMasterTask(), 10, 10, TimeUnit.SECONDS);
scheduleConfigTask(Runnable command, long initialDelay, long delay, TimeUnit unit)
command
- 要执行的任务
initialdelay
- 首次执行的延迟时间
delay
- 一次执行终止和下一次执行开始之间的延迟
unit
- initialdelay 和 delay 参数的时间单位
- new CheckDbHealthTask().run();
好了,通过上面的源码分析,应该能讲清nacos配置多数据源的问题了。
好了,以上就是我个人的实操了。可能有些不对,大家伙,轻点喷!!!
个人理解,可能也不够全面,班门弄斧了。
好了,今天就先到这里了!!!^_^
如果觉得有收获的,帮忙点赞、评论、收藏
一下呗!!!
转载自:https://juejin.cn/post/7203136448332857399