nacos配置中心

文档

配置中心基本概念

nacos配置中心使用namespace,group,dataId来唯一定位一个配置,默认的namespace为public,group为 DEFAULT_GROUP。dataId为配置的名字,包含后缀。nacos支持text、json、yaml、properties等文件格式作为配置文件。

Java项目基础使用

基本使用

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

bootstrap.yml文件中配置nacos server的地址

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848

不像上一节服务发现的例子,配置中心相关配置必须写在bootstrap.yml,而不能写在application.yml中。对于此配置,项目中将读取namespace=public、group=DEFAULT_GROUP、dataId=nacos-config.properties的配置文件,dataId默认使用服务名,格式默认为properties。可以使用spring.cloud.nacos.config.file-extension=yml来指定格式。

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml

动态刷新

默认情况下,即使用服务名作为dataId的配置文件时,是支持动态刷新的,当修改了配置的值,Java项目可以感知到。可以由spring.cloud.nacos.config.refresh.enabled=false来关闭

测试例子

@RefreshScope
@RequestMapping("/api/config")
@RestController
public class ConfigController {

    @Value("${user.id}")
    private Integer id;

    @Value("${user.name}")
    private String name;

    @Value("${user.age}")
    private Integer age;

    @Autowired
    private Environment environment;

    @Autowired
    private UserProperties userProperties;

    /**
     * 动态刷新时对应的值不会更新
     * 需要借助@RefreshScope注解, 再次访问这个bean时会更新
     */
    @GetMapping("/byValue")
    public UserVO byValue() {
        return new UserVO(id, name, age);
    }

    /**
     * 动态刷新时对应的值也会更新
     */
    @GetMapping("/byConfigurationProperties")
    public void byConfigurationProperties() {
        Instant start = Instant.now();
        while (true) {
            Duration duration = Duration.between(start, Instant.now());
            if (duration.getSeconds() > 60) {
                break;
            }
            System.out.println(userProperties);
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @GetMapping("/dynamicUpdate")
    public void dynamicUpdate() {
        Instant start = Instant.now();
        while (true) {
            Duration duration = Duration.between(start, Instant.now());
            if (duration.getSeconds() > 60) {
                break;
            }
            String name = environment.getProperty("user.name");
            String age = environment.getProperty("user.age");
            System.out.println("name: " + name + ", age: " + age);
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在Spring Boot中使用配置,一般是这3种方式

  • environment.getProperty("key") API直接获取,此种方式会拿到修改后的值
  • 使用@ConfigurationProperties(prefix = "user"),此种方式也能拿到修改后的值
  • 使用@Value注解,不能拿到修改后的值,需要搭配@RefreshScope使用,重新访问bean时会拿到修改后的值,如果for 循环去获取age属性,没有重新访问bean,不会生效。

借助profile实现环境隔离

加载配置时,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties} 的基础配置 。

使用-D spring.profiles.active=prd来指定profile

支持自定义namespace、group

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: xxx
        group: xxx

支持自定义dataId

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        extension-configs:
          - data-id: custom1.yml
            # 默认DEFAULT_GROUP
            group: xxxx1
            # 默认值为false
            refresh: true
          - data-id: custom2.yml
            group: xxxx2
            refresh: true
  • 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。
  • 通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
  • 通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
  • 多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。
  • spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

配置的优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

  • A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

综合spring cloud应用时,几个配置优先级如下bootstrap.yml < application.ym < A < B < C

但是bootstrap.yml文件是最先加载的,用于应用程序引导,更加早期的配置属性读取,如配置中心相关属性。

posted on 2022-06-19 17:31  wastonl  阅读(794)  评论(0编辑  收藏  举报