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 秒
感谢点赞支持下哈