1. 程式人生 > 其它 >Spring boot 整合dubbo nacos druid 實現資料來源動態切換

Spring boot 整合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了