利用nacos在不重启项目的情况下动态修改数据源配置信息(多数据源dynamic-datasource)

🎨领域:Java后端开发



在这里插入图片描述


🔥收录专栏: 框架
🐒个人主页:BreezAm
💖Gitee:https://gitee.com/BreezAm
✨个人标签:【后端】【大数据】【前端】【运维】

介绍

有的时候,有这样的一个场景,就是要在项目运行的过程中动态修改数据源的配置信息,而且要在不重启项目的情况下进行,本文以多数据源为例进行讲解,相关测试环境如下:

一、相关依赖

这里只给出比较核心的依赖,其他的依赖就不给出了,例如jdbc啥的。

1.1 nacos客户端

<dependency>
   <groupId>com.alibaba.nacos</groupId>
   <artifactId>nacos-client</artifactId>
   <version>2.0.3</version>
</dependency>

1.1 配置中心

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

1.3 动态数据源

 <dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
   <version>3.2.1</version>
</dependency>

1.4 mybatis plus

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.5.1</version>
</dependency>

二、实战

2.1 配置文件

需要在nacos上面建立相应的配置文件。

spring:
  application:
    name: smile-mybatisplus
  profiles:
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 192.168.0.100:8848
      config:
        # 配置中心地址
        server-addr: 192.168.0.100:8848
        # 配置文件格式
        file-extension: yml
        refresh-enabled: true
        # 共享配置
        shared-configs:
          - data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
            refresh: true

2.2 新建一个配置属性类

DynamicDataSourceProperties 是动态数据源的配置类,因为我们需要让其动态刷新,因此需要进行重写。其实(我也挺疑惑的,这些配置不是nacos会自动刷新的吗,但是我试过了,不行,所以只能自己建一个类)。

import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;

public class MyDynamicDataSourceProperties  extends DynamicDataSourceProperties {
}

2.3 配置属性动态刷新

这里主要做的是加入注解@RefreshScope,他会为当前注册的bean生成一个代理对象,每次接受到刷新事件,都会重新生成一个放入容器,以前那个会被销毁掉。

@RefreshScope
@Configuration(proxyBeanMethods = false)
public class DynamicPropertiesConfig {
    @RefreshScope
    @Bean("dynamicDataSourceProperties")
    @Primary
    @ConditionalOnMissingBean
    public DynamicDataSourceProperties dynamicDataSourceProperties() {
        return new MyDynamicDataSourceProperties();
    }
}

2.4 重写多数据源自动配置

我们要让dataSource这个bean动态修改,那么就需要让这个bean的生成是动态的,通过查看源码可知,这个bean是支持重写的(方法上面有注解@ConditionalOnMissingBean),感兴趣的读者可以去多数据源自动配置类DynamicDataSourceAutoConfiguration,因此把数据源生成的地方进行重写,加上注解@RefreshScope,这样就可以支持动态刷新了,刷新的逻辑是,当nacos配置发生改变的时候,会发布一个事件,而加上这个注解后相当于是一个监听器。

@RefreshScope
@DependsOn("dynamicDataSourceProperties")
@ConditionalOnProperty(prefix = DynamicDataSourceProperties.PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true)
@Configuration(proxyBeanMethods = false)
public class DynamicDataSourceConfig {
    @Autowired
    private DynamicDataSourceProperties properties;
    @Bean
    @RefreshScope
    @ConditionalOnMissingBean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new YmlDynamicDataSourceProvider(datasourceMap);
    }
    @RefreshScope
    @ConditionalOnMissingBean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(properties.getP6spy());
        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }
}

三、源码介绍

其实动态刷新的结果还得归功于@RefreshScope@Scope("refresh")注解,底层是通过发布订阅设计模式实现的,会有事件发布者和监听者。

感兴趣的读者可以去阅读以下几个类:

  • ConfigurationPropertiesRebinder

  • ConfigurationPropertiesBeans

  • RefreshScope

  • RefreshScopeRefreshedEvent

🔥收录专栏:框架
在这里插入图片描述

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Spring Boot中使用Nacos配置多个数据源的步骤如下: 1. 在Nacos控制台中创建两个配置文件,分别对应两个数据源配置信息。例如: ``` # 数据源1配置 datasource1.url=jdbc:mysql://localhost:3306/db1 datasource1.username=root datasource1.password=123456 # 数据源2配置 datasource2.url=jdbc:mysql://localhost:3306/db2 datasource2.username=root datasource2.password=123456 ``` 2. 在Spring Boot配置文件中引入Nacos配置中心的依赖,并配置Nacos Server的地址和命名空间。 ``` spring.cloud.nacos.config.server-addr=localhost:8848 spring.cloud.nacos.config.namespace=your-namespace ``` 3. 创建两个数据源配置类,分别读取对应的Nacos配置文件中的数据源配置信息。 ```java @Configuration @RefreshScope public class DataSource1Config { @Value("${datasource1.url}") private String url; @Value("${datasource1.username}") private String username; @Value("${datasource1.password}") private String password; @Bean(name = "dataSource1") public DataSource dataSource1() { return DataSourceBuilder.create() .url(url) .username(username) .password(password) .build(); } } @Configuration @RefreshScope public class DataSource2Config { @Value("${datasource2.url}") private String url; @Value("${datasource2.username}") private String username; @Value("${datasource2.password}") private String password; @Bean(name = "dataSource2") public DataSource dataSource2() { return DataSourceBuilder.create() .url(url) .username(username) .password(password) .build(); } } ``` 4. 在使用数据源的地方,通过@Qualifier注解指定对应的数据源。 ```java @Service public class UserService { @Autowired @Qualifier("dataSource1") private DataSource dataSource1; @Autowired @Qualifier("dataSource2") private DataSource dataSource2; // 使用dataSource1和dataSource2进行数据库操作 } ``` 5. 在Nacos控制台中修改数据源配置后,使用@RefreshScope注解实现配置动态更新。 ```java @RefreshScope @Configuration public class DataSource1Config { // ... } @RefreshScope @Configuration public class DataSource2Config { // ... } ``` 以上就是在Spring Boot中使用Nacos配置多个数据源的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星牛君

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

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

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

打赏作者

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

抵扣说明:

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

余额充值