# 一、统一配置管理

配置更新热更新image.png

# 在 Nacos 中添加配置信息:

image.png

# 在弹出的表单中填写配置信息

image.png 注意看,我上面的所以配置都是在 dev 环境下的,等会我会出一个错误。继续:原来我们读取配置是这样的:image.png 我们加入 nacos 的配置后,配置变成这样的:image.png 但是这样我们如何能做到,根本就不知道 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.image.png 配置完上述内容后,我们进入 idea, 添加配置管理依赖:

<!--nacos 的配置管理依赖 (配置管理)-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

在 resource 目录下添加,bootstrap.yml 文件image.png 内容如下;注意删除原本 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 注解来实现 image.png 方式二、使用 @ConfigurationProperties 注解image.png 推荐使用方式二。

# 总结一波,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 的配置中有如下配置:image.png 我实际代码中的配置是这样的:

# 服务名称 + 服务地址 + 后缀名  --> 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 中配置的信息一定会被加载读取的到。现在来看看配置的优先级:image.png 总结一波:微服务会从 nacos 读取的配置文件:[服务名]-[spring.profile.active].yaml,环境配置 [服务名].yaml,默认配置,多环境共享优先级:[服务名]-[环境].yaml >[服务名].yaml > 本地配置