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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM