SpringBoot使用Nacos动态配置数据源的方法

来自:网络
时间:2021-04-22
阅读:

SpringBoot/SpringCloud项目部署运行后,如果使用硬编码方式定义数据源,那么如果需要更换数据库,就只能通过更改源码并重启的方式来达成目的
而SpringCloud生态中有配置中心这一组件,我们可以将数据源连接属性编写在配置中心中,需要修改连接属性就可以从配置中心中修改并发布,这样就可以热修改数据源位置无需重启服务

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

首先说明版本

    SpringBoot 2.2.0.RELEASE Druid 1.1.22 (再重写的时候类会随着版本的不同而不同) MySQL 8.0.18 Nacos 1.3.1(Nacos版本不对很可能会踩坑) IDEA 2020.3.2 MyBatis 2.1.4(没用上,但若使用并不冲突)

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

    创建SpringBoot项目并引入依赖(直接复制粘贴) 创建bootstrap.yml文件(直接复制粘贴) 创建配置类(直接复制粘贴) 重写Druid的DruidAbstractDataSource类(这个需要根据版本来修改) 在Nacos配置中心中新建配置

完成配置后的项目目录

SpringBoot使用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(路径别错了)

SpringBoot使用Nacos动态配置数据源的方法

DruidAbstractDataSource类直接复制过来

SpringBoot使用Nacos动态配置数据源的方法

然后在复制过来的类中找到以下两个方法
注释掉画圈位置

SpringBoot使用Nacos动态配置数据源的方法
SpringBoot使用Nacos动态配置数据源的方法

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

SpringBoot使用Nacos动态配置数据源的方法

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

SpringBoot使用Nacos动态配置数据源的方法

点击发布,搞定!

返回顶部
顶部