SpringBoot使用Nacos服务中心动态配置数据源

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说明修改配置成功。这时就是实现了动态刷新数据源的效果

如果有兄弟不懂可私信我哦!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zjwoaini5201314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值