Spring cloud alibaba 集成dubbo nacos druid 实现数据源动态切换

主题: 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

半斤八两开始写BLOG了
原文地址:https://www.cnblogs.com/freewsf/p/15603418.html