主题: Spring boot 集成dubbo nacos druid 实现数据源动态切换
一 实验目的
Spring boot 集成dubbo nacos druid 实现数据源动态切换,改变nacos的配置后,能实现,动态的切换数据源,而不需要重启springboot应用。
二 实现解决方法
原理分析:springboot在集成druid数据源之后,在spring容器中,我们可以通过
DruidDataSource master = SpringUtil.getBean(DruidDataSource.class);
1. 获取到当前的 DruidDataSource 对象,
2. 通过 @nacosvalue 我们可以获取nacos里面对于配置的更改,即时获取更改后的连接信息。
3. 使用 DruidDataSource 对象提供的restart()方法,可以直接重置数据库连接信息,从而做到动态数据源切换。
4. 最后的一步是,什么时机去执行这个 restart()方法,时间很重要,也很有必要,通过阅读nacos dubbo集成的源码,可以发现,有一个事件监听的注解可以实现
三 实现最重要的第4步。
使用 @NacosConfigListener 注解,来监听相应的配置改变,这时候,就可以进行数据库的连接信息切换了。具体实现代码如下。
package com.study.cloud.springbootdubbo; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.nacos.api.annotation.NacosInjected; import com.alibaba.nacos.api.config.ConfigChangeEvent; import com.alibaba.nacos.api.config.annotation.NacosConfigListener; import com.alibaba.nacos.api.config.annotation.NacosValue; import com.alibaba.nacos.spring.context.event.config.NacosConfigEvent; import com.alibaba.nacos.spring.context.event.config.NacosConfigPublishedEvent; import com.purgeteam.dynamic.config.starter.event.ActionConfigEvent; import com.study.cloud.springbootdubbo.config.DruidConfiguration; import com.study.cloud.springbootdubbo.util.SpringUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import java.sql.SQLException; import java.util.Properties; /** * 自动监听nacos中关于 druidconfig.yml的变化,然后重启数据源 */ @Slf4j @Component public class MyNacosEventListener { @Autowired DruidConfiguration druidConfiguration; @NacosValue(value = "${spring.datasource.druid.url}", autoRefreshed = true) private String url; @NacosConfigListener(dataId = "druidconfig.yml", groupId = "DEFAULT_GROUP") public void onReceived(String content) throws SQLException { log.info("onReceived(String) : {}", content); DruidDataSource master = SpringUtil.getBean(DruidDataSource.class); master.setUrl(druidConfiguration.getUrl()); master.setUsername(druidConfiguration.getUsername()); master.setPassword(druidConfiguration.getPassword()); master.setDriverClassName(druidConfiguration.getDriverClassName()); master.restart(); String msg= master.getUsername() + "<>" + master.getUrl()+"----------"+master.getPassword(); System.out.println(msg); } }
nacos的配置信息如下:
四 . 实验结果
当我们改变nacos中关于数据库的连接信息的时候,比如url或者用户名密码时,应用的数据源会自动切换到相应的服务器DB上去,进行操作。
1. postman发送请求,看结果。
现在我们来直接在nacos中切换配置:
可以看到,在不需要重启应用的情况下,数据源已经自动切换了。
下面我们来试一下,发送请求,看是不是真是如此。
可以看到,确实直接切换成功了。
五 源码下载地址
https://gitee.com/freewsf/alibabacloud-study.git