SpringCloud组件--Nacos配置管理

200 阅读3分钟

一、Nacos配置管理

1.前言

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

由此我们可以引入Nacos用于统一的配置管理:

  • 一方面可以用于将配置集中管理。
  • 另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
2.统一配置管理

nacos配置管理->配置列表->+

  • dataId:服务名称+开发环境.yaml
  • 配置内容: 项目的核心配置,需要热更新的配置才有放到nacos管理的必要,例如(开关类变量、模版类配置等)。 image.png
3.微服务拉取配置
  • 微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
  • 但如果尚未读取application.yml,又如何得知nacos地址呢?
  • 因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,所以要将nacos的配置信息放到bootstrap.yaml文件中被优先读取到。流程如下:
    image.png 操作步骤
  • 1.引入Nacos配置管理的客户端依赖
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
注意:如果未在工程中统一管理依赖版本,此处需要指定具体版本
  • 2.新建bootstrap.yaml(application.yaml中重复配置要删除)
spring:
  application:
    name: user-service # 服务名称
  profiles:
    active: dev # 开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名
      discovery:
        cluster-name: HZ

这时${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置

  • 3.测试

image.png

image.png

4.配置热更新

我们的目的之一是当我们修改nacos中的配置后,无需重启微服务即可让配置即可生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

  • 1.在@Value注入的变量所在类上添加注解@RefreshScope

image.png

  • 2.使用@ConfigurationProperties注解代替@Value注解。
新建一个类来读取nacos中配置的patterrn.dateformat属性
@Data
@Component
@ConfigurationProperties(prefix = "pattern") 
//读取配置属性注解,通过前缀+变量属性名来获取配置文件中对应的属性(约定大于配置)
public class PatternProperties {
    private String dateformat;
}

image.png

5.配置共享
(1)前言

在微服务启动时,会去nacos按顺序读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml

  • [spring.application.name].yaml,例如:userservice.yaml

而[spring.application.name].yaml不包含环境,每种环境都会去读取,因此可以被多个环境共享。

(2)使用

添加一个环境共享配置image.png 读取共享配置

image.png

image.png 运行两个UserApplication,修改UserApplication2这个启动项,改变其active-profile值为test,此时UserApplication(8081)使用的profile是dev,UserApplication2(8082)使用的profile是test

image.png

image.png

(3)配置共享优先级

image.png