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