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配置中心中新建配置
完成配置后的项目目录

请注意:我默认读者会使用IDEA创建SpringBoot项目,并且可以自己安装Nacos
1.maven依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | <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官方文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 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(叫啥名无所谓)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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

点击发布,搞定!