SpringBoot使用Nacos动态配置数据源

共 12651字,需浏览 26分钟

 ·

2021-03-26 08:38

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

SpringBoot/SpringCloud项目部署运行后,如果使用硬编码方式定义数据源,那么如果需要更换数据库,就只能通过更改源码并重启的方式来达成目的

而SpringCloud生态中有配置中心这一组件,我们可以将数据源连接属性编写在配置中心中,需要修改连接属性就可以从配置中心中修改并发布,这样就可以热修改数据源位置无需重启服务


那么下面实战说明如何将使用Nacos配置/注册中心配置数据源(请注意看我写的注释来避坑)

首先说明版本

1、SpringBoot 2.2.0.RELEASE

2、Druid 1.1.22 (再重写的时候类会随着版本的不同而不同)

3、MySQL 8.0.18

4、Nacos 1.3.1(Nacos版本不对很可能会踩坑)

5、IDEA 2020.3.2

6、MyBatis 2.1.4(没用上,但若使用并不冲突)

文章较长,但大多都是复制粘贴操作,先在这里说明整个配置的步骤

1、创建SpringBoot项目并引入依赖(直接复制粘贴)

2、创建bootstrap.yml文件(直接复制粘贴)

3、创建配置类(直接复制粘贴)

4、重写Druid的DruidAbstractDataSource类(这个需要根据版本来修改)

5、在Nacos配置中心中新建配置

完成配置后的项目目录


请注意:我默认读者会使用IDEA创建SpringBoot项目,并且可以自己安装Nacos


1.maven依赖

  <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.22</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <scope>provided</scope>
            <version>1.18.12</version>
        </dependency>
    </dependencies>


2.bootstrap.yml(这个优先级高于propertie文件,用于配置Nacos)

如果需要区分生产环境或将Nacos持久化至MySQL请自行学习Nacos官方文档

spring:
  application:
   #这个服务名称与最下面的file-extension: properties合起来
   #即questionBank.properties为Nacos配置文件的名称
    name: questionBank
  cloud:
    nacos:
      #注册中心
      discovery:
        # 是否启用
        enabled: true
        # nacos服务地址
        server-addr: 127.0.0.1:8848
        # 服务名
        #service: ${spring.application.name}
        # 组名
        group: DEFAULT
        # 权重
        weight: 2
        # 元数据
        metadata:
          auth: sty
          version: 1.0
        # 日志名
        log-name: ${spring.application.name}
        # 是否开启watch
        watch: true
        # 多长时间从服务端拉取一次
        watch-delay: 30000
        # 集群名称
        cluster-name: DEFAULT
        # 是否开启注册,如果为false,不会将自身注册上去
        register-enabled: true
        # https
        secure: false
      #配置中心
      config:
        server-addr: 127.0.0.1:8848
        #个人比较喜欢用properties文件,yaml缩进老出错
        file-extension: properties
server:
  port: 8080


3.配置类:DruidConfiguration(叫啥名无所谓)

import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
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;
/**
 * @Author:STY
 * @Description: 数据源获取配置(配置中心)
 * @Date:2021/3/17
 */
@Configuration
@RefreshScope
@Data
public class DruidConfiguration {

    @Value("${spring.datasource.druid.url}")
    private String url;

    @Value("${spring.datasource.druid.username}")
    private String username;

    @Value("${spring.datasource.druid.password}")
    private String password;

    @Value("${spring.datasource.druid.url.driverClassName}")
    private String driverClassName;

    @Bean(name="datasource")
    @RefreshScope
    public DruidDataSource dataSource()
    {
        DruidDataSource datasource = new DruidDataSource();
        System.out.println(url);
        datasource.setUrl(this.url);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        return datasource;
    }
}


注意注意:@RefreshScope一定要加!!!!!!!否则将无法自动刷新从Nacos发布的新数据,因为lombok比较好用所以@Data就直接用他的了


4.然后就是最重要的一步(这个视Druid版本来修改)

重申一下我用的Druid版本为1.1.22


重写com.alibaba.druid.pool.DruidAbstractDataSource类

由于Druid只允许初始化一次,所以只能修改他的源码,而版本不同会导致该类并不相同,在修改源码时必须尤为注意!!!!!!


在com包下创建alibaba.druid.pool(路径别错了)

DruidAbstractDataSource类直接复制过来

然后在复制过来的类中找到以下两个方法

注释掉画圈位置

至此,本地的项目已经配置完成,下面剩下最后一个步骤,在Nacos上创建配置文件

这个Data id 与上面第二个步骤中的名称配置对应(注意看注释)

配置格式要勾选Properties

点击发布,搞定!

————————————————

版权声明:本文为CSDN博主「bia!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/weixin_44870613/article/details/114916246






锋哥最新SpringCloud分布式电商秒杀课程发布

👇👇👇

👆长按上方微信二维码 2 秒





感谢点赞支持下哈 

浏览 105
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报