zoukankan      html  css  js  c++  java
  • 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了
  • 相关阅读:
    int **指针问题
    用 _tcscmp 替代 strcmp 或 wcscmp
    C++经典面试算法题
    目标世界上最小的Linux系统—ttylinux体验
    im-switch -s ibus错误:Error: no configuration file "ibus" exists.
    Ruby环境搭建
    emulator: ERROR: x86 emulation currently requires hardware acceleration!Please ensure Intel HAXM is properly installed and usable.CPU acceleration status: HAX kernel module is not installed!
    POJ 1007 DNA Sorting
    POJ 1002 487-3279
    Ubuntu Android adb调试无法识别设备 -- List of devices attached ???????????? no permissions
  • 原文地址:https://www.cnblogs.com/freewsf/p/15603418.html
Copyright © 2011-2022 走看看