likes
comments
collection
share

Nacos外部数据源配置集群源码分析

作者站长头像
站长
· 阅读数 14

我正在参加「掘金·启航计划」

一、写在前面

在上一篇文章中,我们就已经实现了k8s环境下,部署nacos集群

既然nacos能集群部署,那我们就会想,nacos使用得数据源如果也是集群部署得,那nacos得配置是要怎么改?

这里,我们就能看到nacos对应的application.properties文件

Nacos外部数据源配置集群源码分析

由上可见,如果我们要配置多个数据源,就配置db.num=2 或 db.num=3、4、5等

然后配置多个 db.url.0、db.url.1 等即可

看配置还是挺容易理解的,也挺好配置的,但是我们不能只停留在会配置这个阶段吧?

哈哈,作为高级程序员,要知道原理才行!!!

那今天我们就深入拔一下nacos的源码,看看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的源码构建,大家可以看我以前的文章,这里

Nacos外部数据源配置集群源码分析

那下面进行源码分析:

  • ExternalDataSourceServiceImpl.java

Nacos外部数据源配置集群源码分析

可以看到这里,能识别到,有两个数据源。

接下来这两行代码比较重要,就是两个线程task任务,去监听数据源的状态。

new SelectMasterTask().run(); 选择主数据源

new CheckDbHealthTask().run(); 校验数据源的状态

  • new SelectMasterTask().run();

Nacos外部数据源配置集群源码分析

上面源码的逻辑,比较清晰了,估计都能看得懂吧。

当然这里只是执行一次,所以还是得开个定时器去定时执行监听数据源的状态,那我们打个断点,看下,是哪里开启的定时器。

Nacos外部数据源配置集群源码分析

由上可以看到,当数据源是大于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外部数据源配置集群源码分析

好了,通过上面的源码分析,应该能讲清nacos配置多数据源的问题了。


好了,以上就是我个人的实操了。可能有些不对,大家伙,轻点喷!!!

个人理解,可能也不够全面,班门弄斧了。

好了,今天就先到这里了!!!^_^

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

Nacos外部数据源配置集群源码分析