# 一、统一配置管理
配置更新热更新
# 在 Nacos 中添加配置信息:

# 在弹出的表单中填写配置信息
注意看,我上面的所以配置都是在 dev 环境下的,等会我会出一个错误。继续:原来我们读取配置是这样的:
我们加入 nacos 的配置后,配置变成这样的:
但是这样我们如何能做到,根本就不知道 nacos 的地址就去读取 nacos 中的配置文件信息呢?这就引出一个新的东西,我是才听说的,所以才说是新的,哈哈哈哈哈,那就是 bootstrap.yml 文件,我们来看一下 bootstarp.yml 与 application.yml 文件的区别。若 application.yml 和 bootstrap.yml 在同一目录下:bootstrap.yml 先加载 application.yml 后加载 bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父 Spring ApplicationContext 加载。所以我们只需在 bootstrap.yml 文件中配置 nacos 地址就可用读取 nacos 配置文件中的信息,然后与本地 application.yml 文件配置文件信息合并,达到动态热更新咯。这波太神奇了。王某人直呼 6666666.
配置完上述内容后,我们进入 idea, 添加配置管理依赖:
<!--nacos 的配置管理依赖 (配置管理)--> | |
<dependency> | |
<groupId>com.alibaba.cloud</groupId> | |
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> | |
</dependency> |
在 resource 目录下添加,bootstrap.yml 文件
内容如下;注意删除原本 application.yml 中的 nacos 配置信息
# 服务名称 + 服务地址 + 后缀名 --> nacos 中的配置 dataID | |
spring: | |
application: | |
name: userservice | |
profiles: | |
active: dev # 环境 | |
cloud: | |
nacos: | |
server-addr: localhost:8848 | |
discovery: | |
namespace: fe5ad009-268c-46e7-8d90-968f160e850c # dev 环境 | |
config: | |
file-extension: yaml # 文件后缀名 | |
# 因为刚才配置的管理命名空间是在 dev 环境下如果不添加这个读取内容会报错。不在同一个空间如何协作呢? | |
namespace: fe5ad009-268c-46e7-8d90-968f160e850c |
然后我们可以像正常读取配置文件中的内容一样来读取。
# 二、将配置交给 Nacos 管理的步骤
- 在 Nacos 中添加配置文件
- 在微服务中引入 nacos 的 config 依赖
- 在微服务中添加 bootstrap.yml,配置 nacos 地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去 nacos 读取哪个文件
配置自动刷新 Nacos 中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现:方式一、通过 @Value 注解来实现 ,自动自动刷新使用 @RefreshScope 注解来实现
方式二、使用 @ConfigurationProperties 注解
推荐使用方式二。
# 总结一波,Nacos 配置更改后,微服务可以实现热更新,
方式:
- 通过 @Value 注解注入,结合 @RefreshScope 来刷新
- 通过 @ConfigurationProperties 注入,自动刷新
注意事项:不是所有的配置都适合放到配置中心,维护起来比较麻烦建议将一些关键参数,需要运行时调整的参数放到 nacos 配置中心,一般都是自定义配置
# 三、多环境配置共享
微服务启动时会从 nacos 读取多个配置文件:[spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml [spring.application.name].yaml,例如:userservice.yaml 无论 profile 如何变化,[spring.application.name].yaml 这个文件一定会加载,因此多环境共享配置可以写入这个文现在我的 nacos 的配置中有如下配置:
我实际代码中的配置是这样的:
# 服务名称 + 服务地址 + 后缀名 --> nacos 中的配置 dataID | |
spring: | |
application: | |
name: userservice | |
profiles: | |
active: dev # 环境 | |
cloud: | |
nacos: | |
server-addr: localhost:8848 | |
discovery: | |
namespace: fe5ad009-268c-46e7-8d90-968f160e850c # dev 环境 | |
config: | |
file-extension: yaml # 文件后缀名 | |
namespace: fe5ad009-268c-46e7-8d90-968f160e850c |
那我在 userservice.yaml 中配置的信息一定会被加载读取的到。现在来看看配置的优先级:
总结一波:微服务会从 nacos 读取的配置文件:[服务名]-[spring.profile.active].yaml,环境配置 [服务名].yaml,默认配置,多环境共享优先级:[服务名]-[环境].yaml >[服务名].yaml > 本地配置