服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - SpringBoot使用Nacos动态配置数据源的方法

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

2021-08-26 11:47bia! Java教程

这篇文章主要介绍了SpringBoot使用Nacos动态配置数据源的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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配置中心中新建配置

完成配置后的项目目录

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动态配置数据源的方法

点击发布,搞定!

到此这篇关于SpringBoot使用Nacos动态配置数据源的方法的文章就介绍到这了,更多相关SpringBoot动态配置数据源内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_44870613/article/details/114916246

延伸 · 阅读

精彩推荐
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7472021-02-04
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16