SpringBoot/SpringCloud项目部署运行后,如果使用硬编码方式定义数据源,那么如果需要更换数据库,就只能通过更改源码并重启的方式来达成目的,这样对于系统来讲是不友好的。
而SpringCloud生态中有配置中心这一组件,我们可以将数据源连接属性编写在配置中心中,需要修改数据源连接属性可以直接从配置中心中修改并发布,这样就可以热修改数据源位置而无需重启服务
首先说明版本
SpringBoot 2.7.9
Druid 1.1.22
MySQL 5.5.67
Nacos 1.3.1(Nacos版本不对很可能会踩坑)
IDEA 2022.3
步骤
1.创建SpringBoot项目并引入相关依赖
2.创建bootstrap.yml文件(直接复制粘贴)
3.创建配置类(直接复制粘贴)
4.在Nacos配置中心中新建共享配置(将数据库的配置单独提取出来)
bootstrap.xml配置文件
#系统级别的配置文件,在容器启动时读取
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
username: xxxxx #用户名
password: xxxxx #密码
namespace: xxxxxxx #命名空间 如果没有可不写
group: DEFAULT_GROUP
shared-configs: #共享配置文件
- {dataId: mysql119.yml,refresh: true} #refresh 属性作用是开启刷新机制
application:
name: xxxxx #注册是的服务名
中间对动态刷新的配置在于 shared-configs: -{dataId:xxxxx.yml,refresh:true}
查看源码发现这个配置实现上是传一个Config对象的数组,而Config中有三个参数,dataId对应nacos中的dataid,group对应分组,这个boolen类型的属性才是真正控制动态刷新的地方,当然也可以通过网上大部分教程那样去重写DruidAbstractDataSource来进行动态刷新
配置类:
package com.yc.resfoods.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @Author: 乐哥
* @Date: 2023/4/15
* @Time: 16:58
*
*/
@Configuration
@Data
@RefreshScope
@Slf4j
public class ApplicationConfig {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Bean
@RefreshScope
public DataSource DruidDataSource() {
log.info("afsdtyafsdfay");
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName);
System.out.println("url = " + url);
System.out.println("dataSource" + dataSource);
return dataSource;
}
}
@RefreshScope注解:实现对象的动态刷新
Nacos中心:
这时启动springboot服务观察日志输出中相对应的配置是否读取到
若有显示mysql119.yml(这是我数据库共享配置文件的名字)说明加载成功,这时再去配置中心中修改配置会有日志输出
显示Refresh keys changed:xxxxxxx说明修改配置成功。这时就是实现了动态刷新数据源的效果