SpringBoot使用Nacos动态配置数据源

2023-11-15

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

修改Druid源码
DruidAbstractDataSource类直接复制过来

在这里插入图片描述

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

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

Nacos
这个Data id 与上面第二个步骤中的名称配置对应(注意看注释)
配置格式要勾选Properties
配置
点击发布,搞定!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot使用Nacos动态配置数据源 的相关文章

随机推荐

  • UVa 11464 Even Parity 题解

    这是一道白书17页的题目 题目大意 输入一个n n的01矩阵 1
  • java 远程调试 端口_JAVA远程调试

    1 远程端启动必须添加jvm参数 Xdebug Xrunjdwp transport dt socket suspend n server y address debug port 其中debug port为自定义的调试端口 2 本地连接远
  • 短沟道效应 & 窄宽度效应 short channel effects & narrow width effects

    文章目录 1 概念 Narrow Width Effect 窄宽度效应 Short Channel effects 短沟道效应 阈值电压 Threshold voltage 2 阈值电压与沟道长和沟道宽的关系 Narrow channel
  • ATT&CK实战系列——红队实战(一)完整版

    前言 今天有大佬位推荐了这个靶场 然后就去了解了一下非常贴近实战 下载开干 靶场的描述 红队实战系列 主要以真实企业环境为实例搭建一系列靶场 通过练习 视频教程 博客三位一体学习 另外本次实战完全模拟ATT CK攻击链路进行搭建 开成完整闭
  • linux的jstack,jmap命令的正确安装附详细教程

    先执行命令 yum list showduplicate su root yum list showduplicate grep i java yum install java 11 openjdk devel x86 64 y jstac
  • 吃货联盟订餐系统项目----面向对象思路

    吃货联盟订餐系统项目 面向对象思路 思路 首先可以划分出四个类 菜单类 订单类 饭店类 测试类 菜单类中 需要用到菜单编号 菜单名称 菜单价格 点赞数四个属性 并根据这些属性创建一个带参构造以及getter setter方法 订单类中 需要
  • 生命在于折腾——SQL注入的实操(三)less11-15

    一 实操环境 1 操作系统 VMware虚拟机创建的win10系统 内存8GB 硬盘255GB 处理器AMD Ryzen 9 5900HX 2 操作项目 sql lib项目 本篇文章介绍关卡11 15 3 工具版本 phpstudy 8 1
  • 什么是node,node怎么用?

    Node js 是一个基于Chrome V8 引擎的JavaScript运行环境 Node js使用了一个事件驱动 非阻塞式I O的模型 使其轻量又高效 事件驱动 任务执行 发布者 订阅者 事件驱动 on emit 非阻塞 执行某一个任务的
  • 2021斯坦福CS224N课程笔记~3

    3 神经网络学习 手工计算梯度 Lecture 3 Neural net learning Gradients by hand matrix calculus and algorithmically the backpropagation
  • git拉取和推送如何指定远程服务器的ssh端口

    家里弄了个嵌入式服务器 里面安装了git 申请了动态公网ip 上行速度40Mbps 可比国内的服务器带宽大多了 所以要好好利用起来 但是由于是动态公网ip 因此做了端口映射 指定端口9999到嵌入式服务器的22端口 如何让git push
  • 劢领AT

    劢领AT 五分钟 一条指令设置WIFI模块直接连接MQTT服务器或者阿里云物联网平台 超级指令诞生缘由 超级指令详解 一 阿里云物联网套件超级指令 AT SAC 1 指令说明 2 指令示例 二 MQTT服务器超级指令 AT SMC 1 指令
  • Visual C++ 内存泄露检测工具(VLD)

    一 内存泄漏 1 什么是内存泄露 由于疏忽或者错误 异常安全 导致程序未能释放已经不再使用的内存的情况 内存泄露并非是指内存在物理上的消失 而是指程序失去了对该内存的控制 导致的资源浪费 2 内存泄露的分类 a 堆内存泄露 Heap Lea
  • vs静态编译解决找不到msvcp140.dll问题

    问题描述 win10中vs2015编写的程序生成release版本 拷贝到win7中运行 出现找不到msvcp140 dll问题 解决方法 将程序进行静态编译 1 使用release模式编译 2 项目属性中 C C 代码生成 中的运行库改为
  • CSS笔试题整合---不断更新

    第一套 50题 1 那个HTML5元素用于显示已知范围内的标量测量 D A
  • 大数据究竟是什么?一文让你认识并读懂大数据

    2017年 大数据已经从概念走向落地 2019年 中低端IT工程师紧随浪潮加速向大数据转型 企业对大数据人才争夺直接进入白热化阶段 因此 对于想学IT技术的人而言 我建议 直接选择学习大数据技术是符合潮流和就业需求的选择 一 大数据的意义
  • 使用JAVA控制AD域进行基本的操作详解

    前段时间 我接到了一个新任务 使用JAVA控制AD域进行基本的操作 经几天摸索也看来多位博友的代码 现在摸索出了一套较为详细的Java操控AD域的方法 废话不多说 现进入正题 一 安装域控服务器 什么是域控服务器我就不多说了 请各位自行百度
  • python copy()和deepcopy()解释(import copy)

    对于简单的 object 用 shallow copy 和 deep copy 没区别 复杂的 object 如 list 中套着 list 的情况 shallow copy 中的 子list 并未从原 object 真的 独立 出来 也就
  • 英语 面包为什么不可数?

    接下来我就来解释一下 因为首先面包的形态多种多样 不同的人就有不同的做法 有时候依据面包的形态很难界定面包到底是多少 个 其次面包通常不能直接出售 都要有包装的保护 同理 像蛋糕 巧克力 家具等 它们可以由创造者自由塑形 量化 又往往成一定
  • 金融区块链基础设施(浅析)

    想知道更多更多关于区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 Optherium Labs是一家全球金融科技公司和区块链即服务提供商 是Linux Hyperledger和Crypto Valley基金会的成员 在欧盟获
  • SpringBoot使用Nacos动态配置数据源

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